From: Lukas Wunner <lukas@wunner.de>
To: Hari Vyas <hari.vyas@broadcom.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
linux-pci@vger.kernel.org, Ray Jui <ray.jui@broadcom.com>
Subject: Re: [PATCH] PCI: Data corruption happening due to race condition
Date: Tue, 26 Jun 2018 13:53:56 +0200 [thread overview]
Message-ID: <20180626115356.GA24588@wunner.de> (raw)
In-Reply-To: <CAM5rFu-Bo_prR5R2w2XfM6JkUWo8URiL6i=4tWjOpDuMkcNn-w@mail.gmail.com>
On Tue, Jun 26, 2018 at 03:47:43PM +0530, Hari Vyas wrote:
> On Mon, Jun 25, 2018 at 4:45 PM, Lukas Wunner <lukas@wunner.de> wrote:
> > On Mon, Jun 25, 2018 at 04:27:37PM +0530, Hari Vyas wrote:
> >> This issue is happening with multiple times device removal and
> >> rescan from sysfs. Card is not removed physically.
> >> Is_added bit is set after device attach which probe nvme driver.
> >> NVMe driver starts one workqueue and that one is calling pci_set_master()
> >> to set is_busmaster bit.
> >> With multiple times device removal and rescan from sysfs, race
> >> condition is observed and is_added bit is over-written to 0 from workqueue
> >> started by NVMe driver.
> >
> > Could you add a dump_stack() to pci_bus_add_device() and pci_stop_dev()
> > where the is_added bit is modified, reproduce the issue and attach the
> > resulting dmesg output to a newly opened bug on bugzilla.kernel.org?
> >
>
> I have raised a Bug 200283 - PCI: Data corruption happening due to a
> race condition.
Thanks for taking the time to open the bug and provide more detailed
information.
So the upshot seems to be that is_added and is_busmaster end up in
the same word and two CPUs perform a read-modify-write wherein one
CPU clobbers the result of the other CPU.
While a spinlock may do the job, I think a better solution would be
to move is_added to the priv_flags bitmap in struct pci_dev. The
is_added flag is internal to the PCI core and anything outside has
no business dealing with it.
(Assuming arch/powerpc/kernel/pci-common.c can also be considered
part of the PCI core.)
The flags in priv_flags are defined in drivers/pci/pci.h, so far
there's only one for PCI_DEV_DISCONNECTED which was introduced by
89ee9f768. That commit also introduced accessors, personally I
don't think that's necessary for the few places in the PCI core
that the new PCI_DEV_ADDED flag would be used and I'd just update
those sites to set or test the bit directly.
Moving the is_added flag should already fix the race with is_busmaster.
It may be worth making is_busmaster a bitmap flag as well, but
priv_flags might not be suitable because the flag is also queried
by various drivers. I'll defer that decision to Bjorn.
HTH,
Lukas
next prev parent reply other threads:[~2018-06-26 11:53 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-06-25 10:10 [PATCH] PCI: Data corruption happening due to race condition Hari Vyas
2018-06-25 10:37 ` Lukas Wunner
2018-06-25 10:57 ` Hari Vyas
2018-06-25 11:15 ` Lukas Wunner
2018-06-26 10:17 ` Hari Vyas
2018-06-26 11:53 ` Lukas Wunner [this message]
2018-06-27 9:38 ` [PATCH v1] " Hari Vyas
2018-06-27 16:27 ` Ray Jui
2018-06-27 16:32 ` Hari Vyas
2018-06-27 16:36 ` Ray Jui
2018-06-28 11:23 ` Hari Vyas
[not found] ` <CAM5rFu-Sb5Vhvy19GKesV00=tf0+7Q8hByU11=4F9MVhoO7nWA@mail.gmail.com>
[not found] ` <20180627124920.GA27447@wunner.de>
2018-06-27 13:00 ` [PATCH] " Hari Vyas
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=20180626115356.GA24588@wunner.de \
--to=lukas@wunner.de \
--cc=bhelgaas@google.com \
--cc=hari.vyas@broadcom.com \
--cc=linux-pci@vger.kernel.org \
--cc=ray.jui@broadcom.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;
as well as URLs for NNTP newsgroup(s).