Hi, Thomas

The new comments are as follows, and look forward to your reply. Thanks!


在 2021/9/8 15:20, Thomas Monjalon 写道:
08/09/2021 04:01, Huisong Li:
在 2021/9/7 16:53, Thomas Monjalon 写道:
07/09/2021 05:41, Huisong Li:
Calling rte_eth_dev_close() will release resources of eth device and close
it. But rte_pci_device struct isn't released when app exit, which will lead
to memory leak.
That's a PMD issue.
When the last port of a PCI device is closed, the device should be freed.
Why is this a PMD problem? I don't understand.
In the PMD close function, freeing of PCI device must be managed,
so the app doesn't have to bother.

I know what you mean. Currently, there are two ways to close PMD device (rte_eth_dev_close() and rte_dev_remove()).

For rte_dev_remove(), eth device can be closed and rte_pci_device also can be freed, so it can make app not care about that.

But dev_close() is only used to close eth device, and nothing about rte_pci_device is involved in the framework layer

call stack of dev_close(). The rte_pci_device is allocated and initialized when the rte_pci_bus scans "/sys/bus/pci/devices" directory.

Generally, the PMD of eth devices operates on the basis of eth devices, and rarely on rte_pci_device.

And the rte_pci_device corresponding to the eth devices managed and processed by rte_pci_bus.

So, PMD is closed only based on the port ID of the eth device, whilch only shuts down eth devices, not frees rte_pci_device

and remove it from rte_pci_bus.


As far as I know, most apps or examples in the DPDK project have only
one port for a pci device.
The number of ports per PCI device is driver-specific.

When the port is closed, the rte_pci_device should be freed. But none of
the apps seem to do this.
That's because from the app point of view, only ports should be managed.
The hardware device is managed by the PMD.
Only drivers (PMDs) have to do the relation between class ports
and hardware devices.

Yes. But the current app only closes the port to disable the PMD, and the rte_pci_device cannot be freed.

Because rte_pci_device cannot be released in dev_close() of PMD, and is managed by framework layer.


Btw. Excluding rte_dev_probe() and rte_dev_remove(),  it seems that the DPDK framework only automatically

scans PCI devices, but does not automatically release PCI devices when the process exits.

Above "automatic", I means that it doesn't involve apps or PMDs.


+               /* Retrieve device address in eth device before closing it. */
+               eth_dev = &rte_eth_devices[portid];
You should not access this array, considered internal.
We have to save the address of rte_device to free rte_pci_device before
closing eth device.

Because the the device address in rte_eth_dev struct will be set to a
NULL after closing eth device.

It's also handled in OVS in this way.
No you don't have to call rte_dev_remove at all from an app.

+               rte_dev = eth_dev->device;
                rte_eth_dev_close(portid);
+               ret = rte_dev_remove(rte_dev);


.

Reply via email to