From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Message-ID: <505F2A01.7010109@gmail.com> Date: Sun, 23 Sep 2012 23:25:53 +0800 From: Jiang Liu MIME-Version: 1.0 To: Yinghai Lu CC: Bjorn Helgaas , Len Brown , Taku Izumi , Jiang Liu , x86 , Andrew Morton , Linus Torvalds , Greg Kroah-Hartman , linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, Dave Airlie , Julia Lawall , Matthew Garrett Subject: Re: [PATCH 01/40] PCI: fix default vga ref_count References: <1348080894-23412-1-git-send-email-yinghai@kernel.org> <1348080894-23412-2-git-send-email-yinghai@kernel.org> In-Reply-To: <1348080894-23412-2-git-send-email-yinghai@kernel.org> Content-Type: text/plain; charset=ISO-8859-1 Sender: linux-acpi-owner@vger.kernel.org List-ID: On 09/20/2012 02:54 AM, Yinghai Lu wrote: > when __ARCH_HAS_VGA_DEFAULT_DEVICE is not defined, aka EFIFB is not used, > for static path, vga_default setting is through vga_arbiter_add_pci_device. > and later x86 pci_fixup_video, will skip setting again. > - subsys_initcall(vga_arb_device_init) come first to call vga_arbiter_add_pci_device. It will call pci_get_dev to hold one reference. > > for hotplug add path, even vga_arbiter_add_pci_device is called via notifier, > but it will check VGA_RSRC_LEGACY_MASK that is not set for hotplug path. > So x86 pci_fixup_video will take over to call vga_set_default_device(). > It will not hold one refrence. > > Later for hotplug remove path, vga_arbiter_del_pci_device that does not check > VGA_RSRC_LEGACY_MASK will call put_device and it will cause ref_count to > decrease extra. that will have that pci device get deleted early wrongly. > > Need to make get/put balance for both cases. > > -v2: According to Bjorn, update vga_set_default_device instead... > > Signed-off-by: Yinghai Lu > Cc: x86@kernel.org > Cc: Dave Airlie > Cc: Andrew Morton > Cc: Julia Lawall > Cc: Matthew Garrett > --- > drivers/gpu/vga/vgaarb.c | 14 +++++++++----- > 1 files changed, 9 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/vga/vgaarb.c b/drivers/gpu/vga/vgaarb.c > index b6852b7..0888951e 100644 > --- a/drivers/gpu/vga/vgaarb.c > +++ b/drivers/gpu/vga/vgaarb.c > @@ -141,6 +141,12 @@ EXPORT_SYMBOL_GPL(vga_default_device); > > void vga_set_default_device(struct pci_dev *pdev) > { > + if (vga_default) > + pci_dev_put(vga_default); > + > + if (pdev) > + pdev = pci_dev_get(pdev); > + > vga_default = pdev; > } Seems it could be simplified as void vga_set_default_device(struct pci_dev *pdev) { pci_dev_put(vga_default); vga_default = pci_dev_get(pdev); } --Gerry > #endif > @@ -577,7 +583,7 @@ static bool vga_arbiter_add_pci_device(struct pci_dev *pdev) > #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE > if (vga_default == NULL && > ((vgadev->owns & VGA_RSRC_LEGACY_MASK) == VGA_RSRC_LEGACY_MASK)) > - vga_default = pci_dev_get(pdev); > + vga_set_default_device(pdev); > #endif > > vga_arbiter_check_bridge_sharing(vgadev); > @@ -613,10 +619,8 @@ static bool vga_arbiter_del_pci_device(struct pci_dev *pdev) > } > > #ifndef __ARCH_HAS_VGA_DEFAULT_DEVICE > - if (vga_default == pdev) { > - pci_dev_put(vga_default); > - vga_default = NULL; > - } > + if (vga_default == pdev) > + vga_set_default_device(NULL); > #endif > > if (vgadev->decodes & (VGA_RSRC_LEGACY_IO | VGA_RSRC_LEGACY_MEM)) >