DPDK patches and discussions
 help / color / mirror / Atom feed
* [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values
@ 2017-07-05 16:55 Stephen Hemminger
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 1/3] pci: remove unnecessary casts from strtoul Stephen Hemminger
                   ` (3 more replies)
  0 siblings, 4 replies; 5+ messages in thread
From: Stephen Hemminger @ 2017-07-05 16:55 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger

Changes to PCI and EAL to handle full width of PCI domain
value. It turns out that PCI domain is only 16 bits in ACPI,
but some environments use the extra bits in PCI standard to allow
encoding of PCI buses that are outside of ACPI.

This version fixes both Mellanox drivers.

Stephen Hemminger (3):
  pci: remove unnecessary casts from strtoul
  eal: PCI domain should be 32 bits
  mlx4,5: handle 32 bit PCI domain

 drivers/net/mlx4/mlx4.c                 |  2 +-
 drivers/net/mlx5/mlx5_ethdev.c          |  2 +-
 lib/librte_eal/common/include/rte_pci.h | 12 ++++++------
 lib/librte_eal/linuxapp/eal/eal_pci.c   |  8 ++++----
 4 files changed, 12 insertions(+), 12 deletions(-)

-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-dev] [PATCH v3 1/3] pci: remove unnecessary casts from strtoul
  2017-07-05 16:55 [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Stephen Hemminger
@ 2017-07-05 16:55 ` Stephen Hemminger
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 2/3] eal: PCI domain should be 32 bits Stephen Hemminger
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 5+ messages in thread
From: Stephen Hemminger @ 2017-07-05 16:55 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Stephen Hemminger

The function strtoul returns unsigned long and can be directly
assigned to a smaller type. Removing the casts allows easier
expansion of PCI domain.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 lib/librte_eal/linuxapp/eal/eal_pci.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/lib/librte_eal/linuxapp/eal/eal_pci.c b/lib/librte_eal/linuxapp/eal/eal_pci.c
index c817b4c3954d..7d9e1a99b9c4 100644
--- a/lib/librte_eal/linuxapp/eal/eal_pci.c
+++ b/lib/librte_eal/linuxapp/eal/eal_pci.c
@@ -430,10 +430,10 @@ parse_pci_addr_format(const char *buf, int bufsize, struct rte_pci_addr *addr)
 
 	/* now convert to int values */
 	errno = 0;
-	addr->domain = (uint16_t)strtoul(splitaddr.domain, NULL, 16);
-	addr->bus = (uint8_t)strtoul(splitaddr.bus, NULL, 16);
-	addr->devid = (uint8_t)strtoul(splitaddr.devid, NULL, 16);
-	addr->function = (uint8_t)strtoul(splitaddr.function, NULL, 10);
+	addr->domain = strtoul(splitaddr.domain, NULL, 16);
+	addr->bus = strtoul(splitaddr.bus, NULL, 16);
+	addr->devid = strtoul(splitaddr.devid, NULL, 16);
+	addr->function = strtoul(splitaddr.function, NULL, 10);
 	if (errno != 0)
 		goto error;
 
-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-dev] [PATCH v3 2/3] eal: PCI domain should be 32 bits
  2017-07-05 16:55 [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Stephen Hemminger
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 1/3] pci: remove unnecessary casts from strtoul Stephen Hemminger
@ 2017-07-05 16:55 ` Stephen Hemminger
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 3/3] mlx4,5: handle 32 bit PCI domain Stephen Hemminger
  2017-07-05 23:19 ` [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Thomas Monjalon
  3 siblings, 0 replies; 5+ messages in thread
From: Stephen Hemminger @ 2017-07-05 16:55 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Stephen Hemminger

In some environments, the PCI domain can be larger than 16 bits.
For example, a PCI device passed through in Azure gets a synthetic domain
id  which is internally generated based on GUID. The PCI standard does
not restrict domain to be 16 bits.

This change breaks ABI for API's that expose PCI address structure.

The printf format for PCI remains unchanged, so that on most
systems (with only 16 bit domain) the output format is unchanged
and is 4 characters wide.  For example: 0000:00:01.0 
Only on sysetms with higher bits will the domain take up more
space; example: 12000:00:01.0

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
 lib/librte_eal/common/include/rte_pci.h | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/lib/librte_eal/common/include/rte_pci.h b/lib/librte_eal/common/include/rte_pci.h
index 0284a6208aa5..e416714b32ff 100644
--- a/lib/librte_eal/common/include/rte_pci.h
+++ b/lib/librte_eal/common/include/rte_pci.h
@@ -63,7 +63,7 @@ const char *pci_get_sysfs_path(void);
 
 /** Formatting string for PCI device identifier: Ex: 0000:00:01.0 */
 #define PCI_PRI_FMT "%.4" PRIx16 ":%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8
-#define PCI_PRI_STR_SIZE sizeof("XXXX:XX:XX.X")
+#define PCI_PRI_STR_SIZE sizeof("XXXXXXXX:XX:XX.X")
 
 /** Short formatting string, without domain, for PCI device: Ex: 00:01.0 */
 #define PCI_SHORT_PRI_FMT "%.2" PRIx8 ":%.2" PRIx8 ".%" PRIx8
@@ -112,7 +112,7 @@ struct rte_pci_id {
  * A structure describing the location of a PCI device.
  */
 struct rte_pci_addr {
-	uint16_t domain;                /**< Device domain */
+	uint32_t domain;                /**< Device domain */
 	uint8_t bus;                    /**< Device bus */
 	uint8_t devid;                  /**< Device ID */
 	uint8_t function;               /**< Device function. */
@@ -346,10 +346,10 @@ rte_eal_compare_pci_addr(const struct rte_pci_addr *addr,
 	if ((addr == NULL) || (addr2 == NULL))
 		return -1;
 
-	dev_addr = (addr->domain << 24) | (addr->bus << 16) |
-				(addr->devid << 8) | addr->function;
-	dev_addr2 = (addr2->domain << 24) | (addr2->bus << 16) |
-				(addr2->devid << 8) | addr2->function;
+	dev_addr = ((uint64_t)addr->domain << 24) |
+		(addr->bus << 16) | (addr->devid << 8) | addr->function;
+	dev_addr2 = ((uint64_t)addr2->domain << 24) |
+		(addr2->bus << 16) | (addr2->devid << 8) | addr2->function;
 
 	if (dev_addr > dev_addr2)
 		return 1;
-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [dpdk-dev] [PATCH v3 3/3] mlx4,5: handle 32 bit PCI domain
  2017-07-05 16:55 [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Stephen Hemminger
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 1/3] pci: remove unnecessary casts from strtoul Stephen Hemminger
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 2/3] eal: PCI domain should be 32 bits Stephen Hemminger
@ 2017-07-05 16:55 ` Stephen Hemminger
  2017-07-05 23:19 ` [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Thomas Monjalon
  3 siblings, 0 replies; 5+ messages in thread
From: Stephen Hemminger @ 2017-07-05 16:55 UTC (permalink / raw)
  To: dev; +Cc: Stephen Hemminger, Stephen Hemminger

The PCI domain in Azure maybe 32 bits. When device is passed through
the domain is synthesize from the internal GUID. The code that
parses for PCI address in Mellanox drivers needs to use wider
scanf format.

Signed-off-by: Stephen Hemminger <sthemmin@microsoft.com>
---
v3 - add MLX4

 drivers/net/mlx4/mlx4.c        | 2 +-
 drivers/net/mlx5/mlx5_ethdev.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c
index 16cafae7d741..902a669c923a 100644
--- a/drivers/net/mlx4/mlx4.c
+++ b/drivers/net/mlx4/mlx4.c
@@ -5239,7 +5239,7 @@ mlx4_ibv_device_to_pci_addr(const struct ibv_device *device,
 		/* Extract information. */
 		if (sscanf(line,
 			   "PCI_SLOT_NAME="
-			   "%" SCNx16 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 "\n",
+			   "%" SCNx32 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 "\n",
 			   &pci_addr->domain,
 			   &pci_addr->bus,
 			   &pci_addr->devid,
diff --git a/drivers/net/mlx5/mlx5_ethdev.c b/drivers/net/mlx5/mlx5_ethdev.c
index 96bccd5fd201..039335e2e470 100644
--- a/drivers/net/mlx5/mlx5_ethdev.c
+++ b/drivers/net/mlx5/mlx5_ethdev.c
@@ -1185,7 +1185,7 @@ mlx5_ibv_device_to_pci_addr(const struct ibv_device *device,
 		/* Extract information. */
 		if (sscanf(line,
 			   "PCI_SLOT_NAME="
-			   "%" SCNx16 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 "\n",
+			   "%" SCNx32 ":%" SCNx8 ":%" SCNx8 ".%" SCNx8 "\n",
 			   &pci_addr->domain,
 			   &pci_addr->bus,
 			   &pci_addr->devid,
-- 
2.11.0

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values
  2017-07-05 16:55 [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Stephen Hemminger
                   ` (2 preceding siblings ...)
  2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 3/3] mlx4,5: handle 32 bit PCI domain Stephen Hemminger
@ 2017-07-05 23:19 ` Thomas Monjalon
  3 siblings, 0 replies; 5+ messages in thread
From: Thomas Monjalon @ 2017-07-05 23:19 UTC (permalink / raw)
  To: Stephen Hemminger; +Cc: dev

05/07/2017 18:55, Stephen Hemminger:
> Changes to PCI and EAL to handle full width of PCI domain
> value. It turns out that PCI domain is only 16 bits in ACPI,
> but some environments use the extra bits in PCI standard to allow
> encoding of PCI buses that are outside of ACPI.
> 
> This version fixes both Mellanox drivers.
> 
> Stephen Hemminger (3):
>   pci: remove unnecessary casts from strtoul
>   eal: PCI domain should be 32 bits
>   mlx4,5: handle 32 bit PCI domain

Patches 2 and 3 have been squashed to avoid breaking compilation
in the middle.

Applied, thanks

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2017-07-05 23:19 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-07-05 16:55 [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Stephen Hemminger
2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 1/3] pci: remove unnecessary casts from strtoul Stephen Hemminger
2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 2/3] eal: PCI domain should be 32 bits Stephen Hemminger
2017-07-05 16:55 ` [dpdk-dev] [PATCH v3 3/3] mlx4,5: handle 32 bit PCI domain Stephen Hemminger
2017-07-05 23:19 ` [dpdk-dev] [PATCH v3 0/3] pci: handle 32 bit domain values Thomas Monjalon

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).