[v6,2/2] bus/pci: fix secondary process save 'FD' problem
Checks
Commit Message
From: Zerun Fu <zerun.fu@corigine.com>
In the previous logic the 'fd' was only saved in the primary process,
but for some devices this value is also used in the secondary logic.
For example, the call of 'rte_pci_find_ext_capability()' will fail in
the secondary process.
Fix this problem by getting and saving the value of 'fd' also in the
secondary process logic.
Fixes: 9b957f378abf ("pci: merge uio functions for linux and bsd")
Cc: mukawa@igel.co.jp
Cc: stable@dpdk.org
Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
---
drivers/bus/pci/linux/pci_uio.c | 5 ++++-
drivers/bus/pci/pci_common_uio.c | 32 ++++++++++++++++----------------
2 files changed, 20 insertions(+), 17 deletions(-)
Comments
Hello,
On Tue, Jul 2, 2024 at 9:40 AM Chaoyong He <chaoyong.he@corigine.com> wrote:
>
> From: Zerun Fu <zerun.fu@corigine.com>
>
> In the previous logic the 'fd' was only saved in the primary process,
> but for some devices this value is also used in the secondary logic.
>
> For example, the call of 'rte_pci_find_ext_capability()' will fail in
> the secondary process.
>
> Fix this problem by getting and saving the value of 'fd' also in the
> secondary process logic.
>
> Fixes: 9b957f378abf ("pci: merge uio functions for linux and bsd")
> Cc: mukawa@igel.co.jp
> Cc: stable@dpdk.org
>
> Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
> Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
> Reviewed-by: Long Wu <long.wu@corigine.com>
> Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
Chenbo,
Are you ok with this fix?
Thanks.
Hi David,
> On Jul 13, 2024, at 01:30, David Marchand <david.marchand@redhat.com> wrote:
>
> External email: Use caution opening links or attachments
>
>
> Hello,
>
> On Tue, Jul 2, 2024 at 9:40 AM Chaoyong He <chaoyong.he@corigine.com> wrote:
>>
>> From: Zerun Fu <zerun.fu@corigine.com>
>>
>> In the previous logic the 'fd' was only saved in the primary process,
>> but for some devices this value is also used in the secondary logic.
>>
>> For example, the call of 'rte_pci_find_ext_capability()' will fail in
>> the secondary process.
>>
>> Fix this problem by getting and saving the value of 'fd' also in the
>> secondary process logic.
>>
>> Fixes: 9b957f378abf ("pci: merge uio functions for linux and bsd")
>> Cc: mukawa@igel.co.jp
>> Cc: stable@dpdk.org
>>
>> Signed-off-by: Zerun Fu <zerun.fu@corigine.com>
>> Reviewed-by: Chaoyong He <chaoyong.he@corigine.com>
>> Reviewed-by: Long Wu <long.wu@corigine.com>
>> Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
>> Acked-by: Anatoly Burakov <anatoly.burakov@intel.com>
>
> Chenbo,
> Are you ok with this fix?
Sorry that I was interrupted when I was reviewing this and later I forgot..
For this patch:
Reviewed-by: Chenbo Xia <chenbox@nvidia.com>
>
> Thanks.
>
> --
> David Marchand
@@ -237,7 +237,7 @@ pci_uio_alloc_resource(struct rte_pci_device *dev,
}
snprintf(devname, sizeof(devname), "/dev/uio%u", uio_num);
- /* save fd if in primary process */
+ /* save fd */
fd = open(devname, O_RDWR);
if (fd < 0) {
RTE_LOG(ERR, EAL, "Cannot open %s: %s\n",
@@ -275,6 +275,9 @@ pci_uio_alloc_resource(struct rte_pci_device *dev,
}
}
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+ return 0;
+
/* allocate the mapping details for secondary processes*/
*uio_res = rte_zmalloc("UIO_RES", sizeof(**uio_res), 0);
if (*uio_res == NULL) {
@@ -106,15 +106,15 @@ pci_uio_map_resource(struct rte_pci_device *dev)
if (rte_intr_dev_fd_set(dev->intr_handle, -1))
return -1;
- /* secondary processes - use already recorded details */
- if (rte_eal_process_type() != RTE_PROC_PRIMARY)
- return pci_uio_map_secondary(dev);
-
/* allocate uio resource */
ret = pci_uio_alloc_resource(dev, &uio_res);
if (ret)
return ret;
+ /* secondary processes - use already recorded details */
+ if (rte_eal_process_type() != RTE_PROC_PRIMARY)
+ return pci_uio_map_secondary(dev);
+
/* Map all BARs */
for (i = 0; i != PCI_MAX_RESOURCE; i++) {
/* skip empty BAR */
@@ -230,6 +230,18 @@ pci_uio_unmap_resource(struct rte_pci_device *dev)
if (uio_res == NULL)
return;
+ /* close fd */
+ if (rte_intr_fd_get(dev->intr_handle) >= 0)
+ close(rte_intr_fd_get(dev->intr_handle));
+ uio_cfg_fd = rte_intr_dev_fd_get(dev->intr_handle);
+ if (uio_cfg_fd >= 0) {
+ close(uio_cfg_fd);
+ rte_intr_dev_fd_set(dev->intr_handle, -1);
+ }
+
+ rte_intr_fd_set(dev->intr_handle, -1);
+ rte_intr_type_set(dev->intr_handle, RTE_INTR_HANDLE_UNKNOWN);
+
/* secondary processes - just free maps */
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return pci_uio_unmap(uio_res);
@@ -241,16 +253,4 @@ pci_uio_unmap_resource(struct rte_pci_device *dev)
/* free uio resource */
rte_free(uio_res);
-
- /* close fd if in primary process */
- if (rte_intr_fd_get(dev->intr_handle) >= 0)
- close(rte_intr_fd_get(dev->intr_handle));
- uio_cfg_fd = rte_intr_dev_fd_get(dev->intr_handle);
- if (uio_cfg_fd >= 0) {
- close(uio_cfg_fd);
- rte_intr_dev_fd_set(dev->intr_handle, -1);
- }
-
- rte_intr_fd_set(dev->intr_handle, -1);
- rte_intr_type_set(dev->intr_handle, RTE_INTR_HANDLE_UNKNOWN);
}