@@ -287,6 +287,13 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)intrc;structcontroller*ctrl;+/* do not claim pcie port device */+if(pci_is_pcie(dev)&&+((pci_pcie_type(dev)==PCI_EXP_TYPE_ROOT_PORT)||+(pci_pcie_type(dev)==PCI_EXP_TYPE_UPSTREAM)||+(pci_pcie_type(dev)==PCI_EXP_TYPE_DOWNSTREAM)))+return-ENODEV;+if(!is_shpc_capable(pdev))return-ENODEV;
From: kbuild test robot <hidden> Date: 2018-06-12 06:57:44
Hi Pingfan,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on v4.17]
[cannot apply to pci/next next-20180612]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Pingfan-Liu/pci-shpchp-no-claim-on-pcie-port-device/20180612-144419
config: i386-randconfig-x009-201823 (attached as .config)
compiler: gcc-7 (Debian 7.3.0-16) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All errors (new ones prefixed by >>):
drivers/pci/hotplug/shpchp_core.c: In function 'shpc_probe':
quoted
drivers/pci/hotplug/shpchp_core.c:291:18: error: 'dev' undeclared (first use in this function); did you mean 'pdev'?
if (pci_is_pcie(dev) &&
^~~
pdev
drivers/pci/hotplug/shpchp_core.c:291:18: note: each undeclared identifier is reported only once for each function it appears in
vim +291 drivers/pci/hotplug/shpchp_core.c
284
285 static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
286 {
287 int rc;
288 struct controller *ctrl;
289
290 /* do not claim pcie port device */
> 291 if (pci_is_pcie(dev) &&
292 ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) ||
293 (pci_pcie_type(dev) == PCI_EXP_TYPE_UPSTREAM) ||
294 (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM)))
295 return -ENODEV;
296
297 if (!is_shpc_capable(pdev))
298 return -ENODEV;
299
300 ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
301 if (!ctrl)
302 goto err_out_none;
303
304 INIT_LIST_HEAD(&ctrl->slot_list);
305
306 rc = shpc_init(ctrl, pdev);
307 if (rc) {
308 ctrl_dbg(ctrl, "Controller initialization failed\n");
309 goto err_out_free_ctrl;
310 }
311
312 pci_set_drvdata(pdev, ctrl);
313
314 /* Setup the slot information structures */
315 rc = init_slots(ctrl);
316 if (rc) {
317 ctrl_err(ctrl, "Slot initialization failed\n");
318 goto err_out_release_ctlr;
319 }
320
321 rc = shpchp_create_ctrl_files(ctrl);
322 if (rc)
323 goto err_cleanup_slots;
324
325 return 0;
326
327 err_cleanup_slots:
328 cleanup_slots(ctrl);
329 err_out_release_ctlr:
330 ctrl->hpc_ops->release_ctlr(ctrl);
331 err_out_free_ctrl:
332 kfree(ctrl);
333 err_out_none:
334 return -ENODEV;
335 }
336
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
@@ -287,6 +287,13 @@ static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)intrc;structcontroller*ctrl;+/* do not claim pcie port device */+if(pci_is_pcie(dev)&&+((pci_pcie_type(dev)==PCI_EXP_TYPE_ROOT_PORT)||+(pci_pcie_type(dev)==PCI_EXP_TYPE_UPSTREAM)||+(pci_pcie_type(dev)==PCI_EXP_TYPE_DOWNSTREAM)))+return-ENODEV;+
Sorry, should s/dev/pdev/. I will try to loan a power9 to test it.
NACK it, I will send out v2.
Thanks,
Pingfan
if (!is_shpc_capable(pdev))
return -ENODEV;
--
2.7.4
From: Pingfan Liu <hidden> Date: 2018-06-12 07:20:29
On Tue, Jun 12, 2018 at 2:57 PM Christoph Hellwig [off-list ref] wrote:
On Tue, Jun 12, 2018 at 02:42:13PM +0800, Pingfan Liu wrote:
quoted
The Linux Device Driver Model allows a physical device to be handled
by only a single driver. But at present, both shpchp and portdrv_pci
claim PCI_CLASS_BRIDGE_PCI, and touch devices_kset. This causes a
few problems, one is the wrong shutdown seq of devices, owing to the
broken devices_kset.
How can they both touch devices_kset? Once one driver has claimed the
device it should not be available to others.
Unfortunately, it could be. There are two code path for do_one_initcall
kernel_init->..->do_one_initcall->pcie_portdrv_init
And
load_module->do_init_module->do_one_initcall->shpcd_init
quoted
+ /* do not claim pcie port device */
+ if (pci_is_pcie(dev) &&
+ ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) ||
+ (pci_pcie_type(dev) == PCI_EXP_TYPE_UPSTREAM) ||
+ (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM)))
+ return -ENODEV;
From: Christoph Hellwig <hch@infradead.org> Date: 2018-06-12 07:29:29
On Tue, Jun 12, 2018 at 02:42:13PM +0800, Pingfan Liu wrote:
The Linux Device Driver Model allows a physical device to be handled
by only a single driver. But at present, both shpchp and portdrv_pci
claim PCI_CLASS_BRIDGE_PCI, and touch devices_kset. This causes a
few problems, one is the wrong shutdown seq of devices, owing to the
broken devices_kset.
How can they both touch devices_kset? Once one driver has claimed the
device it should not be available to others.
+ /* do not claim pcie port device */
+ if (pci_is_pcie(dev) &&
+ ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) ||
+ (pci_pcie_type(dev) == PCI_EXP_TYPE_UPSTREAM) ||
+ (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM)))
+ return -ENODEV;
From: kbuild test robot <hidden> Date: 2018-06-12 07:37:50
Hi Pingfan,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on v4.17]
[cannot apply to pci/next next-20180612]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Pingfan-Liu/pci-shpchp-no-claim-on-pcie-port-device/20180612-144419
config: i386-randconfig-a1-201823 (attached as .config)
compiler: gcc-4.9 (Debian 4.9.4-2) 4.9.4
reproduce:
# save the attached .config to linux build tree
make ARCH=i386
All errors (new ones prefixed by >>):
drivers/pci/hotplug/shpchp_core.c: In function 'shpc_probe':
quoted
drivers/pci/hotplug/shpchp_core.c:291:18: error: 'dev' undeclared (first use in this function)
if (pci_is_pcie(dev) &&
^
drivers/pci/hotplug/shpchp_core.c:291:18: note: each undeclared identifier is reported only once for each function it appears in
vim +/dev +291 drivers/pci/hotplug/shpchp_core.c
284
285 static int shpc_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
286 {
287 int rc;
288 struct controller *ctrl;
289
290 /* do not claim pcie port device */
> 291 if (pci_is_pcie(dev) &&
292 ((pci_pcie_type(dev) == PCI_EXP_TYPE_ROOT_PORT) ||
293 (pci_pcie_type(dev) == PCI_EXP_TYPE_UPSTREAM) ||
294 (pci_pcie_type(dev) == PCI_EXP_TYPE_DOWNSTREAM)))
295 return -ENODEV;
296
297 if (!is_shpc_capable(pdev))
298 return -ENODEV;
299
300 ctrl = kzalloc(sizeof(*ctrl), GFP_KERNEL);
301 if (!ctrl)
302 goto err_out_none;
303
304 INIT_LIST_HEAD(&ctrl->slot_list);
305
306 rc = shpc_init(ctrl, pdev);
307 if (rc) {
308 ctrl_dbg(ctrl, "Controller initialization failed\n");
309 goto err_out_free_ctrl;
310 }
311
312 pci_set_drvdata(pdev, ctrl);
313
314 /* Setup the slot information structures */
315 rc = init_slots(ctrl);
316 if (rc) {
317 ctrl_err(ctrl, "Slot initialization failed\n");
318 goto err_out_release_ctlr;
319 }
320
321 rc = shpchp_create_ctrl_files(ctrl);
322 if (rc)
323 goto err_cleanup_slots;
324
325 return 0;
326
327 err_cleanup_slots:
328 cleanup_slots(ctrl);
329 err_out_release_ctlr:
330 ctrl->hpc_ops->release_ctlr(ctrl);
331 err_out_free_ctrl:
332 kfree(ctrl);
333 err_out_none:
334 return -ENODEV;
335 }
336
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation