Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4252fbc3 authored by Ville Syrjälä's avatar Ville Syrjälä Committed by Daniel Vetter
Browse files

drm/i915: Protect pipe_crc->entries update



Set the pipe_crc->entries pointer while holding the relevant spinlock.
Doesn't matter too much since a spurious pipe crc interrupt would then
just update one entry but later that entry would get cleared when head
and tail are both set to 0. But being a bit more paranoid doesn't hurt.

Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent 2be57922
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -3410,13 +3410,15 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,

	/* none -> real source transition */
	if (source) {
		struct intel_pipe_crc_entry *entries;

		DRM_DEBUG_DRIVER("collecting CRCs for pipe %c, %s\n",
				 pipe_name(pipe), pipe_crc_source_name(source));

		pipe_crc->entries = kzalloc(sizeof(*pipe_crc->entries) *
		entries = kzalloc(sizeof(*pipe_crc->entries) *
				  INTEL_PIPE_CRC_ENTRIES_NR,
				  GFP_KERNEL);
		if (!pipe_crc->entries)
		if (!entries)
			return -ENOMEM;

		/*
@@ -3428,6 +3430,7 @@ static int pipe_crc_set_source(struct drm_device *dev, enum pipe pipe,
		hsw_disable_ips(crtc);

		spin_lock_irq(&pipe_crc->lock);
		pipe_crc->entries = entries;
		pipe_crc->head = 0;
		pipe_crc->tail = 0;
		spin_unlock_irq(&pipe_crc->lock);