From: "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com>
To: Imre Deak <imre.deak@intel.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 3/3] drm/dp_mst: Fix flushing the delayed port/mstb destroy work
Date: Wed, 10 Jun 2020 10:29:54 +0300 [thread overview]
Message-ID: <20200610072954.GA10678@intel.com> (raw)
In-Reply-To: <20200607212522.16935-3-imre.deak@intel.com>
On Mon, Jun 08, 2020 at 12:25:22AM +0300, Imre Deak wrote:
> Atm, a pending delayed destroy work during module removal will be
> canceled, leaving behind MST ports, mstbs. Fix this by using a dedicated
> workqueue which will be drained of requeued items as well when
> destroying it.
>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
> drivers/gpu/drm/drm_dp_mst_topology.c | 17 ++++++++++++++---
> include/drm/drm_dp_mst_helper.h | 8 ++++++++
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 083255c33ee0..075fb5ac9264 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -1630,7 +1630,7 @@ static void drm_dp_destroy_mst_branch_device(struct kref *kref)
> mutex_lock(&mgr->delayed_destroy_lock);
> list_add(&mstb->destroy_next, &mgr->destroy_branch_device_list);
> mutex_unlock(&mgr->delayed_destroy_lock);
> - schedule_work(&mgr->delayed_destroy_work);
> + queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
> }
>
> /**
> @@ -1747,7 +1747,7 @@ static void drm_dp_destroy_port(struct kref *kref)
> mutex_lock(&mgr->delayed_destroy_lock);
> list_add(&port->next, &mgr->destroy_port_list);
> mutex_unlock(&mgr->delayed_destroy_lock);
> - schedule_work(&mgr->delayed_destroy_work);
> + queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
> }
>
> /**
> @@ -5208,6 +5208,15 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
> INIT_LIST_HEAD(&mgr->destroy_port_list);
> INIT_LIST_HEAD(&mgr->destroy_branch_device_list);
> INIT_LIST_HEAD(&mgr->up_req_list);
> +
> + /*
> + * delayed_destroy_work will be queued on a dedicated WQ, so that any
> + * requeuing will be also flushed when deiniting the topology manager.
> + */
> + mgr->delayed_destroy_wq = alloc_ordered_workqueue("drm_dp_mst_wq", 0);
> + if (mgr->delayed_destroy_wq == NULL)
> + return -ENOMEM;
> +
> INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work);
> INIT_WORK(&mgr->tx_work, drm_dp_tx_work);
> INIT_WORK(&mgr->delayed_destroy_work, drm_dp_delayed_destroy_work);
> @@ -5252,7 +5261,9 @@ void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr)
> {
> drm_dp_mst_topology_mgr_set_mst(mgr, false);
> flush_work(&mgr->work);
> - cancel_work_sync(&mgr->delayed_destroy_work);
> + /* The following will also drain any requeued work on the WQ. */
> + destroy_workqueue(mgr->delayed_destroy_wq);
> + mgr->delayed_destroy_wq = NULL;
> mutex_lock(&mgr->payload_lock);
> kfree(mgr->payloads);
> mgr->payloads = NULL;
> diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h
> index b230ff6f7081..8b9eb4db3381 100644
> --- a/include/drm/drm_dp_mst_helper.h
> +++ b/include/drm/drm_dp_mst_helper.h
> @@ -681,6 +681,14 @@ struct drm_dp_mst_topology_mgr {
> * @destroy_branch_device_list.
> */
> struct mutex delayed_destroy_lock;
> +
> + /**
> + * @delayed_destroy_wq: Workqueue used for delayed_destroy_work items.
> + * A dedicated WQ makes it possible to drain any requeued work items
> + * on it.
> + */
> + struct workqueue_struct *delayed_destroy_wq;
> +
> /**
> * @delayed_destroy_work: Work item to destroy MST port and branch
> * devices, needed to avoid locking inversion.
> --
> 2.23.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
WARNING: multiple messages have this Message-ID (diff)
From: "Lisovskiy, Stanislav" <stanislav.lisovskiy@intel.com>
To: Imre Deak <imre.deak@intel.com>
Cc: intel-gfx@lists.freedesktop.org, dri-devel@lists.freedesktop.org
Subject: Re: [Intel-gfx] [PATCH 3/3] drm/dp_mst: Fix flushing the delayed port/mstb destroy work
Date: Wed, 10 Jun 2020 10:29:54 +0300 [thread overview]
Message-ID: <20200610072954.GA10678@intel.com> (raw)
In-Reply-To: <20200607212522.16935-3-imre.deak@intel.com>
On Mon, Jun 08, 2020 at 12:25:22AM +0300, Imre Deak wrote:
> Atm, a pending delayed destroy work during module removal will be
> canceled, leaving behind MST ports, mstbs. Fix this by using a dedicated
> workqueue which will be drained of requeued items as well when
> destroying it.
>
Reviewed-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
> drivers/gpu/drm/drm_dp_mst_topology.c | 17 ++++++++++++++---
> include/drm/drm_dp_mst_helper.h | 8 ++++++++
> 2 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
> index 083255c33ee0..075fb5ac9264 100644
> --- a/drivers/gpu/drm/drm_dp_mst_topology.c
> +++ b/drivers/gpu/drm/drm_dp_mst_topology.c
> @@ -1630,7 +1630,7 @@ static void drm_dp_destroy_mst_branch_device(struct kref *kref)
> mutex_lock(&mgr->delayed_destroy_lock);
> list_add(&mstb->destroy_next, &mgr->destroy_branch_device_list);
> mutex_unlock(&mgr->delayed_destroy_lock);
> - schedule_work(&mgr->delayed_destroy_work);
> + queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
> }
>
> /**
> @@ -1747,7 +1747,7 @@ static void drm_dp_destroy_port(struct kref *kref)
> mutex_lock(&mgr->delayed_destroy_lock);
> list_add(&port->next, &mgr->destroy_port_list);
> mutex_unlock(&mgr->delayed_destroy_lock);
> - schedule_work(&mgr->delayed_destroy_work);
> + queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
> }
>
> /**
> @@ -5208,6 +5208,15 @@ int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
> INIT_LIST_HEAD(&mgr->destroy_port_list);
> INIT_LIST_HEAD(&mgr->destroy_branch_device_list);
> INIT_LIST_HEAD(&mgr->up_req_list);
> +
> + /*
> + * delayed_destroy_work will be queued on a dedicated WQ, so that any
> + * requeuing will be also flushed when deiniting the topology manager.
> + */
> + mgr->delayed_destroy_wq = alloc_ordered_workqueue("drm_dp_mst_wq", 0);
> + if (mgr->delayed_destroy_wq == NULL)
> + return -ENOMEM;
> +
> INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work);
> INIT_WORK(&mgr->tx_work, drm_dp_tx_work);
> INIT_WORK(&mgr->delayed_destroy_work, drm_dp_delayed_destroy_work);
> @@ -5252,7 +5261,9 @@ void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr)
> {
> drm_dp_mst_topology_mgr_set_mst(mgr, false);
> flush_work(&mgr->work);
> - cancel_work_sync(&mgr->delayed_destroy_work);
> + /* The following will also drain any requeued work on the WQ. */
> + destroy_workqueue(mgr->delayed_destroy_wq);
> + mgr->delayed_destroy_wq = NULL;
> mutex_lock(&mgr->payload_lock);
> kfree(mgr->payloads);
> mgr->payloads = NULL;
> diff --git a/include/drm/drm_dp_mst_helper.h b/include/drm/drm_dp_mst_helper.h
> index b230ff6f7081..8b9eb4db3381 100644
> --- a/include/drm/drm_dp_mst_helper.h
> +++ b/include/drm/drm_dp_mst_helper.h
> @@ -681,6 +681,14 @@ struct drm_dp_mst_topology_mgr {
> * @destroy_branch_device_list.
> */
> struct mutex delayed_destroy_lock;
> +
> + /**
> + * @delayed_destroy_wq: Workqueue used for delayed_destroy_work items.
> + * A dedicated WQ makes it possible to drain any requeued work items
> + * on it.
> + */
> + struct workqueue_struct *delayed_destroy_wq;
> +
> /**
> * @delayed_destroy_work: Work item to destroy MST port and branch
> * devices, needed to avoid locking inversion.
> --
> 2.23.1
>
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/dri-devel
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx
next prev parent reply other threads:[~2020-06-10 7:33 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-07 21:25 [PATCH 1/3] drm/dp_mst: Fix the DDC I2C device unregistration of an MST port Imre Deak
2020-06-07 21:25 ` Imre Deak
2020-06-07 21:25 ` [Intel-gfx] " Imre Deak
2020-06-07 21:25 ` [PATCH 2/3] drm/dp_mst: Fix the DDC I2C device registration " Imre Deak
2020-06-07 21:25 ` Imre Deak
2020-06-07 21:25 ` [Intel-gfx] " Imre Deak
2020-06-10 8:03 ` Lisovskiy, Stanislav
2020-06-10 8:03 ` Lisovskiy, Stanislav
2020-06-10 8:03 ` [Intel-gfx] " Lisovskiy, Stanislav
2020-06-10 10:09 ` Imre Deak
2020-06-10 10:09 ` Imre Deak
2020-06-10 10:09 ` [Intel-gfx] " Imre Deak
2020-06-10 10:59 ` Lisovskiy, Stanislav
2020-06-10 10:59 ` Lisovskiy, Stanislav
2020-06-10 10:59 ` [Intel-gfx] " Lisovskiy, Stanislav
2020-06-07 21:25 ` [PATCH 3/3] drm/dp_mst: Fix flushing the delayed port/mstb destroy work Imre Deak
2020-06-07 21:25 ` [Intel-gfx] " Imre Deak
2020-06-10 7:29 ` Lisovskiy, Stanislav [this message]
2020-06-10 7:29 ` Lisovskiy, Stanislav
2020-06-10 13:47 ` [PATCH v2 " Imre Deak
2020-06-10 13:47 ` [Intel-gfx] " Imre Deak
2020-06-10 15:54 ` Lyude Paul
2020-06-10 15:54 ` [Intel-gfx] " Lyude Paul
2020-06-07 21:59 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/3] drm/dp_mst: Fix the DDC I2C device unregistration of an MST port Patchwork
2020-06-07 22:22 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-06-07 23:22 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2020-06-09 20:45 ` [Intel-gfx] [PATCH 1/3] " Lisovskiy, Stanislav
2020-06-09 20:45 ` Lisovskiy, Stanislav
2020-06-09 20:45 ` Lisovskiy, Stanislav
2020-06-10 13:56 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for series starting with [1/3] drm/dp_mst: Fix the DDC I2C device unregistration of an MST port (rev2) Patchwork
2020-06-10 14:18 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2020-06-11 8:46 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
2020-06-11 12:51 ` Imre Deak
2020-06-11 12:51 ` [Intel-gfx] " Imre Deak
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=20200610072954.GA10678@intel.com \
--to=stanislav.lisovskiy@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=imre.deak@intel.com \
--cc=intel-gfx@lists.freedesktop.org \
/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.