From: Daniel Vetter <daniel@ffwll.ch>
To: Ramalingam C <ramalingam.c@intel.com>
Cc: daniel.vetter@ffwll.ch, intel-gfx@lists.freedesktop.org,
dri-devel@lists.freedesktop.org, uma.shankar@intel.com,
seanpaul@chromium.org, Daniel Vetter <daniel.vetter@intel.com>,
tomas.winkler@intel.com
Subject: Re: [PATCH v9 03/39] drivers/base: use a worker for sysfs unbind
Date: Wed, 19 Dec 2018 14:38:31 +0100 [thread overview]
Message-ID: <20181219133831.GA21184@phenom.ffwll.local> (raw)
In-Reply-To: <1544673701-6353-4-git-send-email-ramalingam.c@intel.com>
On Thu, Dec 13, 2018 at 09:31:05AM +0530, Ramalingam C wrote:
> From: Daniel Vetter <daniel.vetter@intel.com>
>
> Drivers might want to remove some sysfs files, which needs the same
> locks and ends up angering lockdep. Relevant snippet of the stack
> trace:
>
> kernfs_remove_by_name_ns+0x3b/0x80
> bus_remove_driver+0x92/0xa0
> acpi_video_unregister+0x24/0x40
> i915_driver_unload+0x42/0x130 [i915]
> i915_pci_remove+0x19/0x30 [i915]
> pci_device_remove+0x36/0xb0
> device_release_driver_internal+0x185/0x250
> unbind_store+0xaf/0x180
> kernfs_fop_write+0x104/0x190
>
> I've stumbled over this because some new patches by Ram connect the
> snd-hda-intel unload (where we do use sysfs unbind) with the locking
> chains in the i915 unload code (but without creating a new loop),
> which upset our CI. But the bug is already there and can be easily
> reproduced by unbind i915 directly.
>
> No idea whether this is the correct place to fix this, should at least
> get CI happy again.
>
> Note that the bus locking is already done by device_release_driver ->
> device_release_driver_internal, so I dropped that part. Also note that
> we don't recheck that the device is still bound by the same driver,
> but neither does the current code do that without races. And I figured
> that's a obscure enough corner case to not bother.
>
> v2: Use a task work. An entirely async work leads to impressive
> fireworks in our CI, notably in the vtcon bind/unbind code. Task work
> will be as synchronous as the current code, and so keep all these
> preexisting races neatly tugged under the rug.
>
> Cc: Ramalingam C <ramalingam.c@intel.com>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Revised version of this just landed, so we won't need this anymore for
merging. I'll put my patch into topic/core-for-CI, so you can drop this
for the next version.
-Daniel
> ---
> drivers/base/bus.c | 35 +++++++++++++++++++++++++++++------
> 1 file changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/base/bus.c b/drivers/base/bus.c
> index 8bfd27ec73d6..095c4a140d76 100644
> --- a/drivers/base/bus.c
> +++ b/drivers/base/bus.c
> @@ -17,6 +17,7 @@
> #include <linux/string.h>
> #include <linux/mutex.h>
> #include <linux/sysfs.h>
> +#include <linux/task_work.h>
> #include "base.h"
> #include "power/power.h"
>
> @@ -174,22 +175,44 @@ static const struct kset_uevent_ops bus_uevent_ops = {
>
> static struct kset *bus_kset;
>
> +struct unbind_work {
> + struct callback_head twork;
> + struct device *dev;
> +};
> +
> +void unbind_work_fn(struct callback_head *work)
> +{
> + struct unbind_work *unbind_work =
> + container_of(work, struct unbind_work, twork);
> +
> + device_release_driver_internal(unbind_work->dev, NULL,
> + unbind_work->dev->parent);
> + put_device(unbind_work->dev);
> + kfree(unbind_work);
> +}
> +
> /* Manually detach a device from its associated driver. */
> static ssize_t unbind_store(struct device_driver *drv, const char *buf,
> size_t count)
> {
> struct bus_type *bus = bus_get(drv->bus);
> + struct unbind_work *unbind_work;
> struct device *dev;
> int err = -ENODEV;
>
> dev = bus_find_device_by_name(bus, NULL, buf);
> if (dev && dev->driver == drv) {
> - if (dev->parent && dev->bus->need_parent_lock)
> - device_lock(dev->parent);
> - device_release_driver(dev);
> - if (dev->parent && dev->bus->need_parent_lock)
> - device_unlock(dev->parent);
> - err = count;
> + unbind_work = kmalloc(sizeof(*unbind_work), GFP_KERNEL);
> + if (unbind_work) {
> + unbind_work->dev = dev;
> + get_device(dev);
> + init_task_work(&unbind_work->twork, unbind_work_fn);
> + task_work_add(current, &unbind_work->twork, true);
> +
> + err = count;
> + } else {
> + err = -ENOMEM;
> + }
> }
> put_device(dev);
> bus_put(bus);
> --
> 2.7.4
>
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2018-12-19 13:38 UTC|newest]
Thread overview: 102+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-12-13 4:01 [PATCH v9 00/39] drm/i915: Implement HDCP2.2 Ramalingam C
2018-12-13 4:01 ` [PATCH v9 01/39] drm/i915: Gathering the HDCP1.4 routines together Ramalingam C
2018-12-13 8:17 ` Winkler, Tomas
2018-12-13 11:21 ` C, Ramalingam
2018-12-19 13:35 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 02/39] drm: header for i915 - MEI_HDCP interface Ramalingam C
2018-12-17 11:28 ` Winkler, Tomas
2018-12-17 13:27 ` Daniel Vetter
2018-12-17 13:42 ` Winkler, Tomas
2018-12-17 13:59 ` Daniel Vetter
2018-12-19 13:37 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 03/39] drivers/base: use a worker for sysfs unbind Ramalingam C
2018-12-19 13:38 ` Daniel Vetter [this message]
2018-12-13 4:01 ` [PATCH v9 04/39] component: alloc component_match without any comp to match Ramalingam C
2018-12-19 13:42 ` Daniel Vetter
2018-12-19 15:04 ` Greg Kroah-Hartman
2018-12-13 4:01 ` [PATCH v9 05/39] drm/i915: component master at i915 driver load Ramalingam C
2018-12-19 13:45 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 06/39] drm/i915: Initialize HDCP2.2 Ramalingam C
2018-12-19 13:45 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 07/39] drm/i915: MEI interface definition Ramalingam C
2018-12-19 14:00 ` Daniel Vetter
2018-12-19 15:15 ` C, Ramalingam
2018-12-19 15:21 ` Daniel Vetter
2018-12-20 13:18 ` C, Ramalingam
2018-12-20 14:47 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 08/39] drm/i915: hdcp1.4 CP_IRQ handling and SW encryption tracking Ramalingam C
2018-12-19 15:48 ` Daniel Vetter
2018-12-20 11:29 ` C, Ramalingam
2018-12-20 14:53 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 09/39] drm/i915: Enable and Disable of HDCP2.2 Ramalingam C
2018-12-19 15:54 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 10/39] drm/i915: Implement HDCP2.2 receiver authentication Ramalingam C
2018-12-19 14:35 ` Daniel Vetter
2018-12-19 15:05 ` C, Ramalingam
2018-12-19 15:35 ` Daniel Vetter
2018-12-19 15:48 ` C, Ramalingam
2018-12-19 18:40 ` Jani Nikula
2018-12-19 21:36 ` Winkler, Tomas
2018-12-20 7:42 ` Jani Nikula
2018-12-20 14:28 ` Winkler, Tomas
2018-12-20 14:55 ` Daniel Vetter
2018-12-21 18:06 ` Ville Syrjälä
2018-12-13 4:01 ` [PATCH v9 11/39] drm: helper functions for hdcp2 seq_num to from u32 Ramalingam C
2018-12-19 14:38 ` Daniel Vetter
2018-12-13 4:01 ` [PATCH v9 12/39] drm/i915: Implement HDCP2.2 repeater authentication Ramalingam C
2018-12-13 8:22 ` Winkler, Tomas
2018-12-13 11:18 ` C, Ramalingam
2018-12-19 14:48 ` Daniel Vetter
2018-12-19 15:35 ` C, Ramalingam
2018-12-13 4:01 ` [PATCH v9 13/39] drm: HDCP2.2 link check related constants Ramalingam C
2018-12-19 15:16 ` Daniel Vetter
2018-12-19 15:39 ` C, Ramalingam
2018-12-19 15:58 ` Daniel Vetter
2018-12-19 16:22 ` C, Ramalingam
2018-12-19 16:35 ` Daniel Vetter
2018-12-19 17:01 ` C, Ramalingam
2018-12-13 4:01 ` [PATCH v9 14/39] drm/i915: Implement HDCP2.2 link integrity check Ramalingam C
2018-12-13 4:01 ` [PATCH v9 15/39] drm/i915: Handle HDCP2.2 downstream topology change Ramalingam C
2018-12-13 4:01 ` [PATCH v9 16/39] drm/i915: Implement the HDCP2.2 support for DP Ramalingam C
2018-12-13 4:01 ` [PATCH v9 17/39] drm/i915: Implement the HDCP2.2 support for HDMI Ramalingam C
2018-12-13 4:01 ` [PATCH v9 18/39] drm/i915: Add HDCP2.2 support for DP connectors Ramalingam C
2018-12-13 4:01 ` [PATCH v9 19/39] drm/i915: Add HDCP2.2 support for HDMI connectors Ramalingam C
2018-12-13 4:01 ` [PATCH v9 20/39] mei: bus: whitelist hdcp client Ramalingam C
2018-12-13 4:01 ` [PATCH v9 21/39] mei: bus: export to_mei_cl_device for mei client device drivers Ramalingam C
2018-12-13 4:01 ` [PATCH v9 22/39] misc/mei/hdcp: Client driver for HDCP application Ramalingam C
2018-12-13 4:01 ` [PATCH v9 23/39] misc/mei/hdcp: Define ME FW interface for HDCP2.2 Ramalingam C
2018-12-13 4:01 ` [PATCH v9 24/39] misc/mei/hdcp: Initiate Wired HDCP2.2 Tx Session Ramalingam C
2018-12-13 4:01 ` [PATCH v9 25/39] misc/mei/hdcp: Verify Receiver Cert and prepare km Ramalingam C
2018-12-13 4:01 ` [PATCH v9 26/39] misc/mei/hdcp: Verify H_prime Ramalingam C
2018-12-13 4:01 ` [PATCH v9 27/39] misc/mei/hdcp: Store the HDCP Pairing info Ramalingam C
2018-12-13 4:01 ` [PATCH v9 28/39] misc/mei/hdcp: Initiate Locality check Ramalingam C
2018-12-13 4:01 ` [PATCH v9 29/39] misc/mei/hdcp: Verify L_prime Ramalingam C
2018-12-13 4:01 ` [PATCH v9 30/39] misc/mei/hdcp: Prepare Session Key Ramalingam C
2018-12-13 4:01 ` [PATCH v9 31/39] misc/mei/hdcp: Repeater topology verification and ack Ramalingam C
2018-12-13 4:01 ` [PATCH v9 32/39] misc/mei/hdcp: Verify M_prime Ramalingam C
2018-12-13 4:01 ` [PATCH v9 33/39] misc/mei/hdcp: Enabling the HDCP authentication Ramalingam C
2018-12-13 4:01 ` [PATCH v9 34/39] misc/mei/hdcp: Closing wired HDCP2.2 Tx Session Ramalingam C
2018-12-13 4:01 ` [PATCH v9 35/39] misc/mei/hdcp: Component framework for I915 Interface Ramalingam C
2018-12-13 12:36 ` C, Ramalingam
2018-12-13 16:11 ` Daniel Vetter
2018-12-13 16:27 ` Winkler, Tomas
2018-12-13 17:35 ` Daniel Vetter
2018-12-15 21:20 ` Winkler, Tomas
2018-12-17 9:39 ` Daniel Vetter
2018-12-17 9:59 ` Daniel Vetter
2018-12-17 10:57 ` Winkler, Tomas
2018-12-17 13:46 ` Daniel Vetter
2018-12-19 6:45 ` C, Ramalingam
2018-12-20 15:59 ` C, Ramalingam
2018-12-20 16:06 ` Winkler, Tomas
2018-12-20 16:47 ` C, Ramalingam
2018-12-13 4:01 ` [PATCH v9 36/39] drm/i915: Commit CP without modeset Ramalingam C
2018-12-13 4:01 ` [PATCH v9 37/39] drm/i915: Fix KBL HDCP2.2 encrypt status signalling Ramalingam C
2018-12-19 15:40 ` Daniel Vetter
2018-12-19 16:16 ` C, Ramalingam
2018-12-13 4:01 ` [PATCH v9 38/39] FOR_TEST: i915/Kconfig: Select mei_hdcp by I915 Ramalingam C
2018-12-13 4:01 ` [PATCH v9 39/39] FOR_TESTING_ONLY: debugfs: Excluding the LSPCon for HDCP1.4 Ramalingam C
2018-12-13 4:17 ` ✗ Fi.CI.CHECKPATCH: warning for drm/i915: Implement HDCP2.2 (rev11) Patchwork
2018-12-13 4:27 ` ✗ Fi.CI.SPARSE: " Patchwork
2018-12-13 4:44 ` ✗ Fi.CI.BAT: failure " Patchwork
2018-12-20 16:58 ` ✗ Fi.CI.BAT: failure for drm/i915: Implement HDCP2.2 (rev12) Patchwork
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=20181219133831.GA21184@phenom.ffwll.local \
--to=daniel@ffwll.ch \
--cc=daniel.vetter@ffwll.ch \
--cc=daniel.vetter@intel.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=intel-gfx@lists.freedesktop.org \
--cc=ramalingam.c@intel.com \
--cc=seanpaul@chromium.org \
--cc=tomas.winkler@intel.com \
--cc=uma.shankar@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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox