[Intel-gfx] [PATCH 01/11] drm/i915/guc: Use system workqueue for log capture
Daniele Ceraolo Spurio
daniele.ceraolospurio at intel.com
Sat Jul 13 16:44:32 UTC 2019
On 7/13/2019 3:00 AM, Chris Wilson wrote:
> We only employ a single task for log capture, and created a workqueue
> for the purpose of ensuring we had a high priority queue for low
> latency. We can simply use the system_highpri_wq and avoid the
> complication with creating our own admist the maze of mutexes.
> (Currently we create the wq early before we even know we need it in
> order to avoid trying to create it on demand while we hold the logging
> mutex.)
Michal had suggested the same, but I wasn't sure about it since I have a
very vague recollection that on a very busy system the system_wq wasn't
low-latency enough at high verbosity levels with smaller buffer sizes.
However, the same could apply to a dedicated wq and we can now enable
bigger log buffers that should significantly reduce the amount of
flushes (and thus the latency requirements), so:
Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
Daniele
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio at intel.com>
> Cc: Michal Wajdeczko <michal.wajdeczko at intel.com>
> Cc: Michał Winiarski <michal.winiarski at intel.com>
> ---
> drivers/gpu/drm/i915/intel_guc.c | 39 ----------------------------
> drivers/gpu/drm/i915/intel_guc_log.c | 4 +--
> drivers/gpu/drm/i915/intel_guc_log.h | 1 -
> 3 files changed, 2 insertions(+), 42 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_guc.c b/drivers/gpu/drm/i915/intel_guc.c
> index 501b74f44374..183ab9b03ed0 100644
> --- a/drivers/gpu/drm/i915/intel_guc.c
> +++ b/drivers/gpu/drm/i915/intel_guc.c
> @@ -99,47 +99,9 @@ void intel_guc_init_early(struct intel_guc *guc)
> }
> }
>
> -static int guc_init_wq(struct intel_guc *guc)
> -{
> - /*
> - * GuC log buffer flush work item has to do register access to
> - * send the ack to GuC and this work item, if not synced before
> - * suspend, can potentially get executed after the GFX device is
> - * suspended.
> - * By marking the WQ as freezable, we don't have to bother about
> - * flushing of this work item from the suspend hooks, the pending
> - * work item if any will be either executed before the suspend
> - * or scheduled later on resume. This way the handling of work
> - * item can be kept same between system suspend & rpm suspend.
> - */
> - guc->log.relay.flush_wq =
> - alloc_ordered_workqueue("i915-guc_log",
> - WQ_HIGHPRI | WQ_FREEZABLE);
> - if (!guc->log.relay.flush_wq) {
> - DRM_ERROR("Couldn't allocate workqueue for GuC log\n");
> - return -ENOMEM;
> - }
> -
> - return 0;
> -}
> -
> -static void guc_fini_wq(struct intel_guc *guc)
> -{
> - struct workqueue_struct *wq;
> -
> - wq = fetch_and_zero(&guc->log.relay.flush_wq);
> - if (wq)
> - destroy_workqueue(wq);
> -}
> -
> int intel_guc_init_misc(struct intel_guc *guc)
> {
> struct drm_i915_private *i915 = guc_to_i915(guc);
> - int ret;
> -
> - ret = guc_init_wq(guc);
> - if (ret)
> - return ret;
>
> intel_uc_fw_fetch(i915, &guc->fw);
>
> @@ -149,7 +111,6 @@ int intel_guc_init_misc(struct intel_guc *guc)
> void intel_guc_fini_misc(struct intel_guc *guc)
> {
> intel_uc_fw_cleanup_fetch(&guc->fw);
> - guc_fini_wq(guc);
> }
>
> static int guc_shared_data_create(struct intel_guc *guc)
> diff --git a/drivers/gpu/drm/i915/intel_guc_log.c b/drivers/gpu/drm/i915/intel_guc_log.c
> index 06c09ac52c74..9be5d3a6fb5f 100644
> --- a/drivers/gpu/drm/i915/intel_guc_log.c
> +++ b/drivers/gpu/drm/i915/intel_guc_log.c
> @@ -578,7 +578,7 @@ int intel_guc_log_relay_open(struct intel_guc_log *log)
> * the flush notification. This means that we need to unconditionally
> * flush on relay enabling, since GuC only notifies us once.
> */
> - queue_work(log->relay.flush_wq, &log->relay.flush_work);
> + queue_work(system_highpri_wq, &log->relay.flush_work);
>
> return 0;
>
> @@ -628,5 +628,5 @@ void intel_guc_log_relay_close(struct intel_guc_log *log)
>
> void intel_guc_log_handle_flush_event(struct intel_guc_log *log)
> {
> - queue_work(log->relay.flush_wq, &log->relay.flush_work);
> + queue_work(system_highpri_wq, &log->relay.flush_work);
> }
> diff --git a/drivers/gpu/drm/i915/intel_guc_log.h b/drivers/gpu/drm/i915/intel_guc_log.h
> index 7bc763f10c03..1969572f1f79 100644
> --- a/drivers/gpu/drm/i915/intel_guc_log.h
> +++ b/drivers/gpu/drm/i915/intel_guc_log.h
> @@ -66,7 +66,6 @@ struct intel_guc_log {
> struct i915_vma *vma;
> struct {
> void *buf_addr;
> - struct workqueue_struct *flush_wq;
> struct work_struct flush_work;
> struct rchan *channel;
> struct mutex lock;
More information about the Intel-gfx
mailing list