[dpdk-dev] [PATCH v2 1/3] net/ark: allow unique user data for each port in extension calls

John Miller john.miller at atomicrules.com
Wed Jun 28 12:08:22 CEST 2017


This change allows a user extension to provide unique private
callback data for all ports.

Arkville is a single-function multi-port device.  User_data resides
in the singleton Arkville structure.  This structure is shared across
all ports devices (eth_dev) which are created one per port.  For the
command extension callback we provide an opaque user pointer, which is
currently implemented in the singleton Arkville structure.

With this patch, we are providing a unique user pointer for each port
rather than a common pointer across multiple ports.  The pointers are
stored in an array of size RTE_MAX_ETHPORTS in the arkville structure and
are indexed by port_id in the PMD. The motivation for this change is that
users of the arkville PMD extension have a unique pointer per port rather
then one per function.

Signed-off-by: John Miller <john.miller at atomicrules.com>
---
 drivers/net/ark/ark_ethdev.c | 51 ++++++++++++++++++++++++++++----------------
 drivers/net/ark/ark_global.h |  4 ++--
 2 files changed, 35 insertions(+), 20 deletions(-)

diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c
index c061f7b..e5a8ff7 100644
--- a/drivers/net/ark/ark_ethdev.c
+++ b/drivers/net/ark/ark_ethdev.c
@@ -179,6 +179,7 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	.mac_addr_add = eth_ark_macaddr_add,
 	.mac_addr_remove = eth_ark_macaddr_remove,
 	.mac_addr_set = eth_ark_set_default_mac_addr,
+
 };
 
 static int
@@ -346,8 +347,9 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	}
 
 	if (ark->user_ext.dev_init) {
-		ark->user_data = ark->user_ext.dev_init(dev, ark->a_bar, 0);
-		if (!ark->user_data) {
+		ark->user_data[dev->data->port_id] =
+			ark->user_ext.dev_init(dev, ark->a_bar, 0);
+		if (!ark->user_data[dev->data->port_id]) {
 			PMD_DRV_LOG(INFO,
 				    "Failed to initialize PMD extension!"
 				    " continuing without it\n");
@@ -369,7 +371,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	 */
 	if (ark->user_ext.dev_get_port_count)
 		port_count =
-			ark->user_ext.dev_get_port_count(dev, ark->user_data);
+			ark->user_ext.dev_get_port_count(dev,
+				 ark->user_data[dev->data->port_id]);
 	ark->num_ports = port_count;
 
 	for (p = 0; p < port_count; p++) {
@@ -410,9 +413,10 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 			goto error;
 		}
 
-		if (ark->user_ext.dev_init)
-			ark->user_data =
+		if (ark->user_ext.dev_init) {
+			ark->user_data[eth_dev->data->port_id] =
 				ark->user_ext.dev_init(dev, ark->a_bar, p);
+		}
 	}
 
 	return ret;
@@ -508,7 +512,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 		return 0;
 
 	if (ark->user_ext.dev_uninit)
-		ark->user_ext.dev_uninit(dev, ark->user_data);
+		ark->user_ext.dev_uninit(dev,
+			 ark->user_data[dev->data->port_id]);
 
 	ark_pktgen_uninit(ark->pg);
 	ark_pktchkr_uninit(ark->pc);
@@ -529,7 +534,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 
 	eth_ark_dev_set_link_up(dev);
 	if (ark->user_ext.dev_configure)
-		return ark->user_ext.dev_configure(dev, ark->user_data);
+		return ark->user_ext.dev_configure(dev,
+			   ark->user_data[dev->data->port_id]);
 	return 0;
 }
 
@@ -592,7 +598,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	}
 
 	if (ark->user_ext.dev_start)
-		ark->user_ext.dev_start(dev, ark->user_data);
+		ark->user_ext.dev_start(dev,
+			ark->user_data[dev->data->port_id]);
 
 	return 0;
 }
@@ -614,7 +621,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 
 	/* Stop the extension first */
 	if (ark->user_ext.dev_stop)
-		ark->user_ext.dev_stop(dev, ark->user_data);
+		ark->user_ext.dev_stop(dev,
+		       ark->user_data[dev->data->port_id]);
 
 	/* Stop the packet generator */
 	if (ark->start_pg)
@@ -697,7 +705,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	uint16_t i;
 
 	if (ark->user_ext.dev_close)
-		ark->user_ext.dev_close(dev, ark->user_data);
+		ark->user_ext.dev_close(dev,
+		 ark->user_data[dev->data->port_id]);
 
 	eth_ark_dev_stop(dev);
 	eth_ark_udm_force_close(dev);
@@ -765,7 +774,7 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	if (ark->user_ext.link_update) {
 		return ark->user_ext.link_update
 			(dev, wait_to_complete,
-			 ark->user_data);
+			 ark->user_data[dev->data->port_id]);
 	}
 	return 0;
 }
@@ -778,7 +787,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 		(struct ark_adapter *)dev->data->dev_private;
 
 	if (ark->user_ext.dev_set_link_up)
-		return ark->user_ext.dev_set_link_up(dev, ark->user_data);
+		return ark->user_ext.dev_set_link_up(dev,
+			     ark->user_data[dev->data->port_id]);
 	return 0;
 }
 
@@ -790,7 +800,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 		(struct ark_adapter *)dev->data->dev_private;
 
 	if (ark->user_ext.dev_set_link_down)
-		return ark->user_ext.dev_set_link_down(dev, ark->user_data);
+		return ark->user_ext.dev_set_link_down(dev,
+		       ark->user_data[dev->data->port_id]);
 	return 0;
 }
 
@@ -813,7 +824,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	for (i = 0; i < dev->data->nb_rx_queues; i++)
 		eth_rx_queue_stats_get(dev->data->rx_queues[i], stats);
 	if (ark->user_ext.stats_get)
-		ark->user_ext.stats_get(dev, stats, ark->user_data);
+		ark->user_ext.stats_get(dev, stats,
+			ark->user_data[dev->data->port_id]);
 }
 
 static void
@@ -828,7 +840,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 	for (i = 0; i < dev->data->nb_rx_queues; i++)
 		eth_rx_queue_stats_reset(dev->data->rx_queues[i]);
 	if (ark->user_ext.stats_reset)
-		ark->user_ext.stats_reset(dev, ark->user_data);
+		ark->user_ext.stats_reset(dev,
+			  ark->user_data[dev->data->port_id]);
 }
 
 static int
@@ -845,7 +858,7 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 					   mac_addr,
 					   index,
 					   pool,
-					   ark->user_data);
+			   ark->user_data[dev->data->port_id]);
 		return 0;
 	}
 	return -ENOTSUP;
@@ -858,7 +871,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 		(struct ark_adapter *)dev->data->dev_private;
 
 	if (ark->user_ext.mac_addr_remove)
-		ark->user_ext.mac_addr_remove(dev, index, ark->user_data);
+		ark->user_ext.mac_addr_remove(dev, index,
+			      ark->user_data[dev->data->port_id]);
 }
 
 static void
@@ -869,7 +883,8 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev,
 		(struct ark_adapter *)dev->data->dev_private;
 
 	if (ark->user_ext.mac_addr_set)
-		ark->user_ext.mac_addr_set(dev, mac_addr, ark->user_data);
+		ark->user_ext.mac_addr_set(dev, mac_addr,
+			   ark->user_data[dev->data->port_id]);
 }
 
 static inline int
diff --git a/drivers/net/ark/ark_global.h b/drivers/net/ark/ark_global.h
index a2e9e8f..58af8db 100644
--- a/drivers/net/ark/ark_global.h
+++ b/drivers/net/ark/ark_global.h
@@ -64,7 +64,7 @@
 #define ARK_RCPACING_BASE 0xb0000
 #define ARK_EXTERNAL_BASE 0x100000
 #define ARK_MPU_QOFFSET   0x00100
-#define ARK_MAX_PORTS     8
+#define ARK_MAX_PORTS     RTE_MAX_ETHPORTS
 
 #define offset8(n)     n
 #define offset16(n)   ((n) / 2)
@@ -110,7 +110,7 @@ struct ark_user_ext {
 
 struct ark_adapter {
 	/* User extension private data */
-	void *user_data;
+	void *user_data[ARK_MAX_PORTS];
 
 	/* Pointers to packet generator and checker */
 	int start_pg;
-- 
1.9.1



More information about the dev mailing list