lkml.org 
[lkml]   [2017]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.10 089/167] PCI: hv: Fix wslot_to_devfn() to fix warnings on device removal
    Date
    4.10-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Dexuan Cui <decui@microsoft.com>

    commit 60e2e2fbafdd1285ae1b4ad39ded41603e0c74d0 upstream.

    The devfn of 00:02.0 is 0x10. devfn_to_wslot(0x10) == 0x2, and
    wslot_to_devfn(0x2) should be 0x10, while it's 0x2 in the current code.

    Due to this, hv_eject_device_work() -> pci_get_domain_bus_and_slot()
    returns NULL and pci_stop_and_remove_bus_device() is not called.

    Later when the real device driver's .remove() is invoked by
    hv_pci_remove() -> pci_stop_root_bus(), some warnings can be noticed
    because the VM has lost the access to the underlying device at that
    time.

    Signed-off-by: Jake Oshins <jakeo@microsoft.com>
    Signed-off-by: Dexuan Cui <decui@microsoft.com>
    Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
    Acked-by: Haiyang Zhang <haiyangz@microsoft.com>
    CC: K. Y. Srinivasan <kys@microsoft.com>
    CC: Stephen Hemminger <sthemmin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    drivers/pci/host/pci-hyperv.c | 8 +++++---
    1 file changed, 5 insertions(+), 3 deletions(-)

    --- a/drivers/pci/host/pci-hyperv.c
    +++ b/drivers/pci/host/pci-hyperv.c
    @@ -130,7 +130,8 @@ union pci_version {
    */
    union win_slot_encoding {
    struct {
    - u32 func:8;
    + u32 dev:5;
    + u32 func:3;
    u32 reserved:24;
    } bits;
    u32 slot;
    @@ -485,7 +486,8 @@ static u32 devfn_to_wslot(int devfn)
    union win_slot_encoding wslot;

    wslot.slot = 0;
    - wslot.bits.func = PCI_SLOT(devfn) | (PCI_FUNC(devfn) << 5);
    + wslot.bits.dev = PCI_SLOT(devfn);
    + wslot.bits.func = PCI_FUNC(devfn);

    return wslot.slot;
    }
    @@ -503,7 +505,7 @@ static int wslot_to_devfn(u32 wslot)
    union win_slot_encoding slot_no;

    slot_no.slot = wslot;
    - return PCI_DEVFN(0, slot_no.bits.func);
    + return PCI_DEVFN(slot_no.bits.dev, slot_no.bits.func);
    }

    /*

    \
     
     \ /
      Last update: 2017-03-10 11:05    [W:4.424 / U:0.536 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site