All of lore.kernel.org
 help / color / mirror / Atom feed
From: John Harrison <John.C.Harrison@Intel.com>
To: "Daniel, Thomas" <thomas.daniel@intel.com>,
	"Intel-GFX@Lists.FreeDesktop.Org"
	<Intel-GFX@Lists.FreeDesktop.Org>
Subject: Re: [PATCH v2 11/28] drm/i915: Add IRQ friendly request deference facility
Date: Wed, 19 Nov 2014 17:05:23 +0000	[thread overview]
Message-ID: <546CCDD3.40808@Intel.com> (raw)
In-Reply-To: <BFEE8FEC12424048AF1805991D65FA91196F8735@IRSMSX105.ger.corp.intel.com>

On 19/11/2014 13:28, Daniel, Thomas wrote:
>> -----Original Message-----
>> From: Harrison, John C
>> Sent: Wednesday, November 19, 2014 12:26 PM
>> To: Daniel, Thomas; Intel-GFX@Lists.FreeDesktop.Org
>> Subject: Re: [Intel-gfx] [PATCH v2 11/28] drm/i915: Add IRQ friendly request
>> deference facility
>>
>> On 18/11/2014 09:34, Daniel, Thomas wrote:
>>>> -----Original Message-----
>>>> From: Intel-gfx [mailto:intel-gfx-bounces@lists.freedesktop.org] On
>>>> Behalf Of John.C.Harrison@Intel.com
>>>> Sent: Friday, November 14, 2014 12:19 PM
>>>> To: Intel-GFX@Lists.FreeDesktop.Org
>>>> Subject: [Intel-gfx] [PATCH v2 11/28] drm/i915: Add IRQ friendly
>>>> request deference facility
>>>>
>>>> From: John Harrison <John.C.Harrison@Intel.com>
>>>>
>>>> The next patches in the series convert some display related seqno
>>>> usage to request structure usage. However, the request dereference
>>>> introduced must be done from interrupt context. As the dereference
>>>> potentially involves freeing the request structure and thus calling
>>>> lots of non-interrupt friendly code, this poses a problem.
>>>>
>>>> The solution is to add an IRQ friendly version of the dereference
>>>> function. All this does is to add the request structure to a 'delayed free'
>> list and return.
>>>> The retire code, which is run periodically, then processes this list
>>>> and does the actual dereferencing of the request structures.
>>>>
>>>> v2: Added a count to allow for multiple IRQ dereferences of the same
>>>> request at a time.
>>>>
>>>> For: VIZ-4377
>>>> Signed-off-by: John Harrison <John.C.Harrison@Intel.com>
>>>> ---
>>>>    drivers/gpu/drm/i915/i915_drv.h         |    7 +++++++
>>>>    drivers/gpu/drm/i915/i915_gem.c         |   33
>>>> +++++++++++++++++++++++++++++++
>>>>    drivers/gpu/drm/i915/intel_lrc.c        |    2 ++
>>>>    drivers/gpu/drm/i915/intel_ringbuffer.c |    3 +++
>>>>    drivers/gpu/drm/i915/intel_ringbuffer.h |    2 ++
>>>>    5 files changed, 47 insertions(+)
>>>>
>>>> diff --git a/drivers/gpu/drm/i915/i915_drv.h
>>>> b/drivers/gpu/drm/i915/i915_drv.h index 180b674..87cb355 100644
>>>> --- a/drivers/gpu/drm/i915/i915_drv.h
>>>> +++ b/drivers/gpu/drm/i915/i915_drv.h
>>>> @@ -2019,6 +2019,10 @@ struct drm_i915_gem_request {
>>>>    	struct drm_i915_file_private *file_priv;
>>>>    	/** file_priv list entry for this request */
>>>>    	struct list_head client_list;
>>>> +
>>>> +	/** deferred free list for dereferencing from IRQ context */
>>>> +	struct list_head delay_free_list;
>>>> +	uint32_t delay_free_count;
>>>>    };
>>>>
>>>>    void i915_gem_request_free(struct kref *req_ref); @@ -2044,9
>>>> +2048,12 @@ i915_gem_request_reference(struct
>> drm_i915_gem_request
>>>> *req) static inline void  i915_gem_request_unreference(struct
>>>> drm_i915_gem_request *req)  {
>>>> +	WARN_ON(!mutex_is_locked(&req->ring->dev->struct_mutex));
>>>>    	kref_put(&req->ref, i915_gem_request_free);  }
>>>>
>>>> +void i915_gem_request_unreference_irq(struct
>> drm_i915_gem_request
>>>> +*req);
>>>> +
>>>>    static inline void i915_gem_request_assign(struct
>>>> drm_i915_gem_request **pdst,
>>>>    					   struct drm_i915_gem_request *src)
>> { diff --git
>>>> a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
>>>> index 60e5eec..8453bbd 100644
>>>> --- a/drivers/gpu/drm/i915/i915_gem.c
>>>> +++ b/drivers/gpu/drm/i915/i915_gem.c
>>>> @@ -2722,6 +2722,19 @@ void i915_gem_reset(struct drm_device *dev)
>>>>    	i915_gem_restore_fences(dev);
>>>>    }
>>>>
>>>> +void i915_gem_request_unreference_irq(struct
>> drm_i915_gem_request
>>>> *req)
>>>> +{
>>>> +	struct intel_engine_cs *ring = req->ring;
>>>> +	unsigned long flags;
>>>> +
>>>> +	/* Need to add the req to a deferred dereference list to be
>>>> processed
>>>> +	 * outside of interrupt time */
>>>> +	spin_lock_irqsave(&ring->reqlist_lock, flags);
>>>> +	if (req->delay_free_count++ == 0)
>>>> +		list_add_tail(&req->delay_free_list, &ring-
>>>>> delayed_free_list);
>>>> +	spin_unlock_irqrestore(&ring->reqlist_lock, flags); }
>>>> +
>>>>    /**
>>>>     * This function clears the request list as sequence numbers are passed.
>>>>     */
>>>> @@ -2796,6 +2809,25 @@ i915_gem_retire_requests_ring(struct
>>>> intel_engine_cs *ring)
>>>>    		ring->trace_irq_seqno = 0;
>>>>    	}
>>>>
>>>> +	while (!list_empty(&ring->delayed_free_list)) {
>>>> +		struct drm_i915_gem_request *request;
>>>> +		unsigned long flags;
>>>> +		uint32_t count;
>>>> +
>>>> +		request = list_first_entry(&ring->delayed_free_list,
>>>> +					   struct drm_i915_gem_request,
>>>> +					   delay_free_list);
>>>> +
>>>> +		spin_lock_irqsave(&request->ring->reqlist_lock, flags);
>>>> +		list_del(&request->delay_free_list);
>>>> +		count = request->delay_free_count;
>>>> +		request->delay_free_count = 0;
>>>> +		spin_unlock_irqrestore(&request->ring->reqlist_lock, flags);
>>>> +
>>>> +		while (count-- > 0)
>>>> +			i915_gem_request_unreference(request);
>>>> +	}
>>>> +
>>>>    	WARN_ON(i915_verify_lists(ring->dev));
>>>>    }
>>>>
>>>> @@ -5055,6 +5087,7 @@ init_ring_lists(struct intel_engine_cs *ring)  {
>>>>    	INIT_LIST_HEAD(&ring->active_list);
>>>>    	INIT_LIST_HEAD(&ring->request_list);
>>>> +	INIT_LIST_HEAD(&ring->delayed_free_list);
>>> Same comment as before - multiple init points for this list.
>>>
>>> Thomas.
>> Same reply as before: the function already exists and is already initialising
> You forgot to reply to the mailing list last time.
>
>> other lists therefore it seems sensible to initialise the new list as well.
>> Whether the function as a whole is redundant or not is unclear. The same
> You've introduced a new list - surely it's your responsibility to know where it should be initialised?
My list is an extension of the existing 'request_list'. Therefore is 
seems prudent to initialise it wherever better minds than me have deemed 
it necessary to initialise request_list itself.

>> duplicated initialisation also happens in intel_render_ring_init_dri(). If
>> someone thinks these can all be simplified and wants to only do the
>> initialisation once in one place then that should be another patch.
> Agree that the other duplicate inits should also be fixed up in another patch but that's no reason to add another dupe.
>
> Thomas.

Only if it is definitely a redundant duplication. Currently, it is not 
obvious that it is therefore I am being safe/sensible by following the 
existing convention.


>>>>    }
>>>>
>>>>    void i915_init_vm(struct drm_i915_private *dev_priv, diff --git
>>>> a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
>>>> index eba0acd..db8efaa 100644
>>>> --- a/drivers/gpu/drm/i915/intel_lrc.c
>>>> +++ b/drivers/gpu/drm/i915/intel_lrc.c
>>>> @@ -1287,7 +1287,9 @@ static int logical_ring_init(struct drm_device
>>>> *dev, struct intel_engine_cs *rin
>>>>    	ring->dev = dev;
>>>>    	INIT_LIST_HEAD(&ring->active_list);
>>>>    	INIT_LIST_HEAD(&ring->request_list);
>>>> +	spin_lock_init(&ring->reqlist_lock);
>>>>    	init_waitqueue_head(&ring->irq_queue);
>>>> +	INIT_LIST_HEAD(&ring->delayed_free_list);
>>>>
>>>>    	INIT_LIST_HEAD(&ring->execlist_queue);
>>>>    	spin_lock_init(&ring->execlist_lock);
>>>> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c
>>>> b/drivers/gpu/drm/i915/intel_ringbuffer.c
>>>> index 74c48ed..4338132 100644
>>>> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
>>>> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
>>>> @@ -1808,6 +1808,8 @@ static int intel_init_ring_buffer(struct
>>>> drm_device *dev,
>>>>    	ring->dev = dev;
>>>>    	INIT_LIST_HEAD(&ring->active_list);
>>>>    	INIT_LIST_HEAD(&ring->request_list);
>>>> +	spin_lock_init(&ring->reqlist_lock);
>>>> +	INIT_LIST_HEAD(&ring->delayed_free_list);
>>>>    	INIT_LIST_HEAD(&ring->execlist_queue);
>>>>    	ringbuf->size = 32 * PAGE_SIZE;
>>>>    	ringbuf->ring = ring;
>>>> @@ -2510,6 +2512,7 @@ int intel_render_ring_init_dri(struct
>>>> drm_device *dev, u64 start, u32 size)
>>>>    	ring->dev = dev;
>>>>    	INIT_LIST_HEAD(&ring->active_list);
>>>>    	INIT_LIST_HEAD(&ring->request_list);
>>>> +	INIT_LIST_HEAD(&ring->delayed_free_list);
>>>>
>>>>    	ringbuf->size = size;
>>>>    	ringbuf->effective_size = ringbuf->size; diff --git
>>>> a/drivers/gpu/drm/i915/intel_ringbuffer.h
>>>> b/drivers/gpu/drm/i915/intel_ringbuffer.h
>>>> index 824f5884..3af7b7c 100644
>>>> --- a/drivers/gpu/drm/i915/intel_ringbuffer.h
>>>> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
>>>> @@ -262,6 +262,8 @@ struct  intel_engine_cs {
>>>>    	 * outstanding.
>>>>    	 */
>>>>    	struct list_head request_list;
>>>> +	spinlock_t reqlist_lock;
>>>> +	struct list_head delayed_free_list;
>>>>
>>>>    	/**
>>>>    	 * Do we have some not yet emitted requests outstanding?
>>>> --
>>>> 1.7.9.5
>>>>
>>>> _______________________________________________
>>>> Intel-gfx mailing list
>>>> Intel-gfx@lists.freedesktop.org
>>>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

  reply	other threads:[~2014-11-19 17:08 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-14 12:18 [PATCH v2 00/28] Replace seqno values with request structures John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 01/28] drm/i915: Ensure OLS & PLR are always in sync John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 02/28] drm/i915: Add reference count to request structure John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 03/28] drm/i915: Add helper functions to aid seqno -> request transition John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 04/28] drm/i915: Replace last_[rwf]_seqno with last_[rwf]_req John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 05/28] drm/i915: Convert i915_gem_ring_throttle to use requests John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 06/28] drm/i915: Ensure requests stick around during waits John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 07/28] drm/i915: Remove 'outstanding_lazy_seqno' John.C.Harrison
2014-11-14 12:18 ` [PATCH v2 08/28] drm/i915: Make 'i915_gem_check_olr' actually check by request not seqno John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 09/28] drm/i915: Convert 'last_flip_req' to be a request not a seqno John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 10/28] drm/i915: Convert i915_wait_seqno to i915_wait_request John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 11/28] drm/i915: Add IRQ friendly request deference facility John.C.Harrison
2014-11-18  9:34   ` Daniel, Thomas
2014-11-19 12:25     ` John Harrison
2014-11-19 13:28       ` Daniel, Thomas
2014-11-19 17:05         ` John Harrison [this message]
2014-11-19 17:28           ` Daniel, Thomas
2014-11-19 18:08           ` Dave Gordon
2014-11-14 12:19 ` [PATCH v2 12/28] drm/i915: Convert mmio_flip::seqno to struct request John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 13/28] drm/i915: Convert __wait_seqno() to __wait_request() John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 14/28] drm/i915: Remove obsolete seqno parameter from 'i915_add_request' John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 15/28] drm/i915: Convert 'flip_queued_seqno' into 'flip_queued_request' John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 16/28] drm/i915: Convert trace functions from seqno to request John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 17/28] drm/i915: Convert 'trace_irq' to use requests rather than seqnos John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 18/28] drm/i915: Convert 'ring_idle()' to use requests not seqnos John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 19/28] drm/i915: Connect requests to rings at creation not submission John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 20/28] drm/i915: Convert 'i915_seqno_passed' calls into 'i915_gem_request_completed' John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 21/28] drm/i915: Remove the now redundant 'obj->ring' John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 22/28] drm/i915: Cache request completion status John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 23/28] drm/i915: Zero fill the request structure John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 24/28] drm/i915: Spinlock protection for request list John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 25/28] drm/i915: Interrupt driven request completion John.C.Harrison
2014-11-18  9:40   ` Daniel, Thomas
2014-11-19 12:29     ` John Harrison
2014-11-14 12:19 ` [PATCH v2 26/28] drm/i915: Remove obsolete parameter to i915_gem_request_completed() John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 27/28] drm/i915: Add unique id to the request structure for debugging John.C.Harrison
2014-11-14 12:19 ` [PATCH v2 28/28] drm/i915: Additional request structure tracing John.C.Harrison
2014-11-14 20:54   ` [PATCH v2 28/28] drm/i915: Additional request structure shuang.he
2014-11-19 19:28 ` [PATCH v2 00/28] Replace seqno values with request structures Daniel Vetter
2014-11-20  9:32   ` Daniel, Thomas
2014-11-21 20:52     ` Daniel Vetter
2014-11-21 20:56       ` Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=546CCDD3.40808@Intel.com \
    --to=john.c.harrison@intel.com \
    --cc=Intel-GFX@Lists.FreeDesktop.Org \
    --cc=thomas.daniel@intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.