CC: [email protected]
BCC: [email protected]
In-Reply-To: <[email protected]>
References: <[email protected]>
TO: Lizhi Hou <[email protected]>
TO: [email protected]
TO: [email protected]
TO: [email protected]
CC: Lizhi Hou <[email protected]>
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: [email protected]
CC: Max Zhen <[email protected]>

Hi Lizhi,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on robh/for-next]
[also build test WARNING on helgaas-pci/next linus/master 
pinchartl-media/drm/du/next v5.17-rc7 next-20220309]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    
https://github.com/0day-ci/linux/commits/Lizhi-Hou/Infrastructure-to-define-apertures-in-a-PCIe-device-with-a-flattened-device-tree/20220307-141939
base:   https://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git for-next
:::::: branch date: 3 days ago
:::::: commit date: 3 days ago
config: i386-randconfig-m021-20220307 
(https://download.01.org/0day-ci/archive/20220310/[email protected]/config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

smatch warnings:
drivers/pci/of.c:762 devm_of_pci_create_bus_endpoint() error: double free of 
'prop'

vim +/prop +762 drivers/pci/of.c

3a2c08c0f0ef77 Lizhi Hou 2022-03-04  663  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  664  /**
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  665   * devm_of_pci_create_bus_endpoint - 
Create a device node for the given pci device.
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  666   * @pdev: PCI device pointer.
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  667   *
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  668   * For PCI device which uses 
flattened device tree to describe apertures in its BARs,
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  669   * a device node for the given pci 
device is required. Then the flattened device tree
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  670   * overlay from the device can be 
applied to the base tree.
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  671   * The device node is under root node 
and act like bus node. It contains a "ranges"
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  672   * property which is used for address 
translation of its children. Each child node
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  673   * corresponds an aperture and use 
BAR index and offset as its address.
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  674  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  675   * Returns 0 on success or a negative 
error-code on failure.
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  676   */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  677  int 
devm_of_pci_create_bus_endpoint(struct pci_dev *pdev)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  678  {
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  679        struct property *proplist = 
NULL;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  680        struct device *dev = &pdev->dev;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  681        int range_ncells, addr_ncells;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  682        struct device_node *node;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  683        void *prop = NULL;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  684        u32 *range_cell;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  685        __be32 val;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  686        int i, ret;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  687  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  688        node = of_ep_alloc_node(pdev, 
"pci-ep-bus");
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  689        if (!node)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  690                return -ENOMEM;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  691  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  692        /* the endpoint node works as 
'simple-bus' to translate aperture addresses. */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  693        prop = "simple-bus";
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  694        ret = of_ep_add_property(dev, 
&proplist, "compatible", strlen(prop) + 1, prop);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  695        if (ret)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  696                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  697  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  698        /* The address and size cells 
of nodes underneath are 2 */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  699        val = cpu_to_be32(2);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  700        ret = of_ep_add_property(dev, 
&proplist, "#address-cells", sizeof(u32), &val);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  701        if (ret)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  702                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  703  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  704        ret = of_ep_add_property(dev, 
&proplist, "#size-cells", sizeof(u32), &val);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  705        if (ret)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  706                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  707  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  708        /* child address format: 
0xIooooooo oooooooo, I = bar index, o = offset on bar */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  709        addr_ncells = 
of_n_addr_cells(node);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  710        if (addr_ncells > 2) {
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  711                /* does not support 
number of address cells greater than 2 */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  712                ret = -EINVAL;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  713                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  714        }
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  715  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  716        /* range cells include <node 
addr cells> <child addr cells> <child size cells> */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  717        range_ncells = addr_ncells + 4;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  718        prop = kzalloc(range_ncells * 
sizeof(u32) * PCI_STD_NUM_BARS, GFP_KERNEL);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  719        if (!prop) {
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  720                ret = -ENOMEM;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  721                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  722        }
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  723  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  724        range_cell = prop;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  725        for (i = 0; i < 
PCI_STD_NUM_BARS; i++) {
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  726                if 
(!pci_resource_len(pdev, i))
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  727                        continue;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  728                /* highest 4 bits of 
address are bar index */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  729                *(__be64 *)range_cell = 
cpu_to_be64((u64)i << 60);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  730                range_cell += 2;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  731                if (addr_ncells == 2)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  732                        *(__be64 
*)range_cell = cpu_to_be64((u64)pci_resource_start(pdev, i));
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  733                else
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  734                        *(__be32 
*)range_cell = cpu_to_be32((u32)pci_resource_start(pdev, i));
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  735  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  736                range_cell += 
addr_ncells;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  737                *(__be64 *)range_cell = 
cpu_to_be64((u64)pci_resource_len(pdev, i));
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  738                range_cell += 2;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  739        }
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  740  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  741        /* error out if there is not 
PCI BAR been found */
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  742        if ((void *)range_cell == prop) 
{
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  743                ret = -EINVAL;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  744                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  745        }
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  746  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  747        ret = of_ep_add_property(dev, 
&proplist, "ranges", (void *)range_cell - prop, prop);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  748        kfree(prop);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  749        if (ret)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  750                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  751  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  752        node->properties = proplist;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  753        ret = of_attach_node(node);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  754        if (ret)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  755                goto cleanup;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  756  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  757        devres_add(dev, node);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  758  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  759        return 0;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  760  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  761  cleanup:
3a2c08c0f0ef77 Lizhi Hou 2022-03-04 @762        kfree(prop);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  763        if (node)
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  764                devres_free(node);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  765  
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  766        return ret;
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  767  }
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  768  
EXPORT_SYMBOL_GPL(devm_of_pci_create_bus_endpoint);
3a2c08c0f0ef77 Lizhi Hou 2022-03-04  769  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]
_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to