All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Marchand <david.marchand@redhat.com>
To: Thomas Monjalon <thomas@monjalon.net>
Cc: dev <dev@dpdk.org>, "Yigit, Ferruh" <ferruh.yigit@intel.com>,
	Gaetan Rivet <grive@u256.net>,
	 "Zhang, AlvinX" <alvinx.zhang@intel.com>,
	Beilei Xing <beilei.xing@intel.com>,
	 Jeff Guo <jia.guo@intel.com>,
	"Burakov, Anatoly" <anatoly.burakov@intel.com>,
	 Bruce Richardson <bruce.richardson@intel.com>,
	Dmitry Kozlyuk <dmitry.kozliuk@gmail.com>,
	navasile@linux.microsoft.com,
	 "Dmitry Malloy (MESHCHANINOV)" <dmitrym@microsoft.com>,
	Pallavi Kadam <pallavi.kadam@intel.com>,
	 Tal Shnaiderman <talshn@mellanox.com>
Subject: Re: [dpdk-dev] [PATCH] pci: keep API compatibility with mmap values
Date: Fri, 10 Jul 2020 15:34:13 +0200	[thread overview]
Message-ID: <CAJFAV8zeLaMLap4udO1P-dohmXFKaaqpsCwcMsLHEQVsP+wcCQ@mail.gmail.com> (raw)
In-Reply-To: <20200710115324.3902559-1-thomas@monjalon.net>

On Fri, Jul 10, 2020 at 1:53 PM Thomas Monjalon <thomas@monjalon.net> wrote:
>
> The function pci_map_resource() returns MAP_FAILED in case of error.
> When replacing the call to mmap() by rte_mem_map(),
> the error code became NULL, breaking the API.
> This function is probably not used outside of DPDK,
> but it is still a problem for two reasons:
>         - the deprecation process was not followed
>         - the Linux function pci_vfio_mmap_bar() is broken for i40e
>
> The error code is reverted to the Unix value MAP_FAILED.
> Windows needs to define this special value (-1 as in Unix).
> After proper deprecation process, the API could be changed again
> if really needed.
>
> Because of the switch from mmap() to rte_mem_map(),
> another part of the API was changed: "int additional_flags"
> are defined as "additional flags for the mapping range"
> without mentioning it was directly used in mmap().
> Currently it is directly used in rte_mem_map(),
> that's why the values rte_map_flags must be mapped (sic) on the mmap ones
> in case of Unix OS.
>
> These are side effects of a badly defined API using Unix values.
>
> Bugzilla ID: 503
> Fixes: 2fd3567e5425 ("pci: use OS generic memory mapping functions")
> Cc: talshn@mellanox.com
>
> Reported-by: David Marchand <david.marchand@redhat.com>
> Signed-off-by: Thomas Monjalon <thomas@monjalon.net>
> ---
>  drivers/bus/pci/bsd/pci.c                 | 2 +-
>  drivers/bus/pci/linux/pci_uio.c           | 2 +-
>  drivers/bus/pci/linux/pci_vfio.c          | 4 ++--
>  drivers/bus/pci/pci_common_uio.c          | 2 +-
>  lib/librte_eal/include/rte_eal_paging.h   | 8 ++++++++
>  lib/librte_eal/windows/include/sys/mman.h | 9 +++++++++
>  lib/librte_pci/rte_pci.c                  | 1 +
>  lib/librte_pci/rte_pci.h                  | 2 +-
>  8 files changed, 24 insertions(+), 6 deletions(-)
>  create mode 100644 lib/librte_eal/windows/include/sys/mman.h
>
> diff --git a/drivers/bus/pci/bsd/pci.c b/drivers/bus/pci/bsd/pci.c
> index 8bc473eb9a..6ec27b4b5b 100644
> --- a/drivers/bus/pci/bsd/pci.c
> +++ b/drivers/bus/pci/bsd/pci.c
> @@ -192,7 +192,7 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
>         mapaddr = pci_map_resource(NULL, fd, (off_t)offset,
>                         (size_t)dev->mem_resource[res_idx].len, 0);
>         close(fd);
> -       if (mapaddr == NULL)
> +       if (mapaddr == MAP_FAILED)
>                 goto error;
>
>         maps[map_idx].phaddr = dev->mem_resource[res_idx].phys_addr;
> diff --git a/drivers/bus/pci/linux/pci_uio.c b/drivers/bus/pci/linux/pci_uio.c
> index b622001539..097dc19225 100644
> --- a/drivers/bus/pci/linux/pci_uio.c
> +++ b/drivers/bus/pci/linux/pci_uio.c
> @@ -345,7 +345,7 @@ pci_uio_map_resource_by_index(struct rte_pci_device *dev, int res_idx,
>         mapaddr = pci_map_resource(pci_map_addr, fd, 0,
>                         (size_t)dev->mem_resource[res_idx].len, 0);
>         close(fd);
> -       if (mapaddr == NULL)
> +       if (mapaddr == MAP_FAILED)
>                 goto error;
>
>         pci_map_addr = RTE_PTR_ADD(mapaddr,
> diff --git a/drivers/bus/pci/linux/pci_vfio.c b/drivers/bus/pci/linux/pci_vfio.c
> index fdeb9a8caf..07e072e13f 100644
> --- a/drivers/bus/pci/linux/pci_vfio.c
> +++ b/drivers/bus/pci/linux/pci_vfio.c
> @@ -566,7 +566,7 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,
>                 }
>
>                 /* if there's a second part, try to map it */
> -               if (map_addr != NULL
> +               if (map_addr != MAP_FAILED
>                         && memreg[1].offset && memreg[1].size) {
>                         void *second_addr = RTE_PTR_ADD(bar_addr,
>                                                 (uintptr_t)(memreg[1].offset -
> @@ -578,7 +578,7 @@ pci_vfio_mmap_bar(int vfio_dev_fd, struct mapped_pci_resource *vfio_res,
>                                                         RTE_MAP_FORCE_ADDRESS);
>                 }
>
> -               if (map_addr == NULL) {
> +               if (map_addr == NULL || map_addr == MAP_FAILED) {
>                         munmap(bar_addr, bar->size);
>                         bar_addr = MAP_FAILED;
>                         RTE_LOG(ERR, EAL, "Failed to map pci BAR%d\n",
> diff --git a/drivers/bus/pci/pci_common_uio.c b/drivers/bus/pci/pci_common_uio.c
> index 793dfd0a7c..f4dca9da91 100644
> --- a/drivers/bus/pci/pci_common_uio.c
> +++ b/drivers/bus/pci/pci_common_uio.c
> @@ -58,7 +58,7 @@ pci_uio_map_secondary(struct rte_pci_device *dev)
>                                         "Cannot mmap device resource file %s to address: %p\n",
>                                         uio_res->maps[i].path,
>                                         uio_res->maps[i].addr);
> -                               if (mapaddr != NULL) {
> +                               if (mapaddr != MAP_FAILED) {
>                                         /* unmap addrs correctly mapped */
>                                         for (j = 0; j < i; j++)
>                                                 pci_unmap_resource(
> diff --git a/lib/librte_eal/include/rte_eal_paging.h b/lib/librte_eal/include/rte_eal_paging.h
> index ed98e70e9e..680a7f2505 100644
> --- a/lib/librte_eal/include/rte_eal_paging.h
> +++ b/lib/librte_eal/include/rte_eal_paging.h
> @@ -3,6 +3,7 @@
>   */
>
>  #include <stdint.h>
> +#include <sys/mman.h>
>
>  #include <rte_compat.h>
>
> @@ -22,6 +23,7 @@ enum rte_mem_prot {
>
>  /** Additional flags for memory mapping. */
>  enum rte_map_flags {
> +#ifdef RTE_EXEC_ENV_WINDOWS
>         /** Changes to the mapped memory are visible to other processes. */
>         RTE_MAP_SHARED = 1 << 0,
>         /** Mapping is not backed by a regular file. */
> @@ -35,6 +37,12 @@ enum rte_map_flags {
>          * it is not required to do so, thus mapping with this flag may fail.
>          */
>         RTE_MAP_FORCE_ADDRESS = 1 << 3
> +#else /* map mmap flags because they are exposed in pci_map_resource() API */
> +       RTE_MAP_SHARED = MAP_SHARED,
> +       RTE_MAP_ANONYMOUS = MAP_ANONYMOUS,
> +       RTE_MAP_PRIVATE = MAP_PRIVATE,
> +       RTE_MAP_FORCE_ADDRESS = MAP_FIXED,
> +#endif
>  };
>
>  /**
> diff --git a/lib/librte_eal/windows/include/sys/mman.h b/lib/librte_eal/windows/include/sys/mman.h
> new file mode 100644
> index 0000000000..0b4b10df1f
> --- /dev/null
> +++ b/lib/librte_eal/windows/include/sys/mman.h
> @@ -0,0 +1,9 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright 2020 Mellanox Technologies, Ltd
> + */
> +
> +/*
> + * The syscall mmap does not exist on Windows,
> + * but this error code is used in a badly defined DPDK API for PCI mapping.
> + */
> +#define MAP_FAILED ((void *) -1)
> diff --git a/lib/librte_pci/rte_pci.c b/lib/librte_pci/rte_pci.c
> index d8272b9076..1d1cbc75ac 100644
> --- a/lib/librte_pci/rte_pci.c
> +++ b/lib/librte_pci/rte_pci.c
> @@ -163,6 +163,7 @@ pci_map_resource(void *requested_addr, int fd, off_t offset, size_t size,
>                         __func__, fd, requested_addr, size,
>                         (unsigned long long)offset,
>                         rte_strerror(rte_errno), mapaddr);
> +               mapaddr = MAP_FAILED; /* API uses mmap error code */
>         } else
>                 RTE_LOG(DEBUG, EAL, "  PCI memory mapped at %p\n", mapaddr);
>
> diff --git a/lib/librte_pci/rte_pci.h b/lib/librte_pci/rte_pci.h
> index 104b2bb858..a03235da1f 100644
> --- a/lib/librte_pci/rte_pci.h
> +++ b/lib/librte_pci/rte_pci.h
> @@ -160,7 +160,7 @@ int rte_pci_addr_parse(const char *str, struct rte_pci_addr *addr);
>   *      The additional flags for the mapping range.
>   * @return
>   *   - On success, the function returns a pointer to the mapped area.
> - *   - On error, NULL is returned.
> + *   - On error, MAP_FAILED is returned.
>   */
>  void *pci_map_resource(void *requested_addr, int fd, off_t offset,
>                 size_t size, int additional_flags);
> --
> 2.27.0
>

As we discussed offlist, I am not really ecstatic about this.
But the function was exposed, so no breaking.

Reviewed-by: David Marchand <david.marchand@redhat.com>

-- 
David Marchand


  reply	other threads:[~2020-07-10 13:34 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-07-10 11:53 [dpdk-dev] [PATCH] pci: keep API compatibility with mmap values Thomas Monjalon
2020-07-10 13:34 ` David Marchand [this message]
2020-07-10 15:39 ` Burakov, Anatoly
2020-07-10 16:17   ` Thomas Monjalon
2020-07-13  8:56     ` Burakov, Anatoly
2020-07-15  8:01     ` David Marchand
2020-07-10 17:10 ` Thomas Monjalon
2020-07-10 18:31 ` Dmitry Kozlyuk
2020-07-10 20:02   ` Thomas Monjalon
2020-07-10 20:40 ` [dpdk-dev] [PATCH v2] " Thomas Monjalon
2020-07-10 21:07   ` Dmitry Kozlyuk
2020-07-11  9:51     ` Thomas Monjalon
2020-07-11  3:27   ` Ma, LihongX
2020-07-11  9:50     ` Thomas Monjalon
2020-07-11  3:18 ` [dpdk-dev] [PATCH] " Ma, LihongX

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CAJFAV8zeLaMLap4udO1P-dohmXFKaaqpsCwcMsLHEQVsP+wcCQ@mail.gmail.com \
    --to=david.marchand@redhat.com \
    --cc=alvinx.zhang@intel.com \
    --cc=anatoly.burakov@intel.com \
    --cc=beilei.xing@intel.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=dmitry.kozliuk@gmail.com \
    --cc=dmitrym@microsoft.com \
    --cc=ferruh.yigit@intel.com \
    --cc=grive@u256.net \
    --cc=jia.guo@intel.com \
    --cc=navasile@linux.microsoft.com \
    --cc=pallavi.kadam@intel.com \
    --cc=talshn@mellanox.com \
    --cc=thomas@monjalon.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.