All of lore.kernel.org
 help / color / mirror / Atom feed
From: <pbhagavatula@marvell.com>
To: <jerinj@marvell.com>, <konstantin.ananyev@intel.com>,
	Marko Kovacevic <marko.kovacevic@intel.com>,
	Ori Kam <orika@mellanox.com>,
	Bruce Richardson <bruce.richardson@intel.com>,
	Radu Nicolau <radu.nicolau@intel.com>,
	"Akhil Goyal" <akhil.goyal@nxp.com>,
	Tomasz Kantecki <tomasz.kantecki@intel.com>,
	Sunil Kumar Kori <skori@marvell.com>,
	Pavan Nikhilesh <pbhagavatula@marvell.com>
Cc: <dev@dpdk.org>
Subject: [dpdk-dev] [PATCH v4 05/11] examples/l3fwd: add event port and queue setup
Date: Wed, 22 Jan 2020 23:58:11 +0530	[thread overview]
Message-ID: <20200122182817.1667-6-pbhagavatula@marvell.com> (raw)
In-Reply-To: <20200122182817.1667-1-pbhagavatula@marvell.com>

From: Sunil Kumar Kori <skori@marvell.com>

Add event device queue and port setup based on event eth Tx adapter
capabilities.

Signed-off-by: Sunil Kumar Kori <skori@marvell.com>
---
 examples/l3fwd/l3fwd_event.c               |  28 +++++-
 examples/l3fwd/l3fwd_event.h               |   1 +
 examples/l3fwd/l3fwd_event_generic.c       | 103 +++++++++++++++++++++
 examples/l3fwd/l3fwd_event_internal_port.c |  98 ++++++++++++++++++++
 4 files changed, 229 insertions(+), 1 deletion(-)

diff --git a/examples/l3fwd/l3fwd_event.c b/examples/l3fwd/l3fwd_event.c
index f9491ecc6..b58f9b79a 100644
--- a/examples/l3fwd/l3fwd_event.c
+++ b/examples/l3fwd/l3fwd_event.c
@@ -188,10 +188,30 @@ l3fwd_event_capability_setup(void)
 		l3fwd_event_set_internal_port_ops(&evt_rsrc->ops);
 }
 
+int
+l3fwd_get_free_event_port(struct l3fwd_event_resources *evt_rsrc)
+{
+	static int index;
+	int port_id;
+
+	rte_spinlock_lock(&evt_rsrc->evp.lock);
+	if (index >= evt_rsrc->evp.nb_ports) {
+		printf("No free event port is available\n");
+		return -1;
+	}
+
+	port_id = evt_rsrc->evp.event_p_id[index];
+	index++;
+	rte_spinlock_unlock(&evt_rsrc->evp.lock);
+
+	return port_id;
+}
+
 void
 l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)
 {
 	struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+	uint32_t event_queue_cfg;
 
 	if (!evt_rsrc->enabled)
 		return;
@@ -206,5 +226,11 @@ l3fwd_event_resource_setup(struct rte_eth_conf *port_conf)
 	l3fwd_eth_dev_port_setup(port_conf);
 
 	/* Event device configuration */
-	evt_rsrc->ops.event_device_setup();
+	event_queue_cfg = evt_rsrc->ops.event_device_setup();
+
+	/* Event queue configuration */
+	evt_rsrc->ops.event_queue_setup(event_queue_cfg);
+
+	/* Event port configuration */
+	evt_rsrc->ops.event_port_setup();
 }
diff --git a/examples/l3fwd/l3fwd_event.h b/examples/l3fwd/l3fwd_event.h
index 53feea069..4bceca920 100644
--- a/examples/l3fwd/l3fwd_event.h
+++ b/examples/l3fwd/l3fwd_event.h
@@ -73,6 +73,7 @@ struct l3fwd_event_resources {
 
 struct l3fwd_event_resources *l3fwd_get_eventdev_rsrc(void);
 void l3fwd_event_resource_setup(struct rte_eth_conf *port_conf);
+int l3fwd_get_free_event_port(struct l3fwd_event_resources *eventdev_rsrc);
 void l3fwd_event_set_generic_ops(struct l3fwd_event_setup_ops *ops);
 void l3fwd_event_set_internal_port_ops(struct l3fwd_event_setup_ops *ops);
 
diff --git a/examples/l3fwd/l3fwd_event_generic.c b/examples/l3fwd/l3fwd_event_generic.c
index c831cfd66..2532839bf 100644
--- a/examples/l3fwd/l3fwd_event_generic.c
+++ b/examples/l3fwd/l3fwd_event_generic.c
@@ -81,8 +81,111 @@ l3fwd_event_device_setup_generic(void)
 	return event_queue_cfg;
 }
 
+static void
+l3fwd_event_port_setup_generic(void)
+{
+	struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+	uint8_t event_d_id = evt_rsrc->event_d_id;
+	struct rte_event_port_conf event_p_conf = {
+		.dequeue_depth = 32,
+		.enqueue_depth = 32,
+		.new_event_threshold = 4096
+	};
+	struct rte_event_port_conf def_p_conf;
+	uint8_t event_p_id;
+	int32_t ret;
+
+	evt_rsrc->evp.event_p_id = (uint8_t *)malloc(sizeof(uint8_t) *
+					evt_rsrc->evp.nb_ports);
+	if (!evt_rsrc->evp.event_p_id)
+		rte_panic("No space is available\n");
+
+	memset(&def_p_conf, 0, sizeof(struct rte_event_port_conf));
+	rte_event_port_default_conf_get(event_d_id, 0, &def_p_conf);
+
+	if (def_p_conf.new_event_threshold < event_p_conf.new_event_threshold)
+		event_p_conf.new_event_threshold =
+			def_p_conf.new_event_threshold;
+
+	if (def_p_conf.dequeue_depth < event_p_conf.dequeue_depth)
+		event_p_conf.dequeue_depth = def_p_conf.dequeue_depth;
+
+	if (def_p_conf.enqueue_depth < event_p_conf.enqueue_depth)
+		event_p_conf.enqueue_depth = def_p_conf.enqueue_depth;
+
+	event_p_conf.disable_implicit_release =
+		evt_rsrc->disable_implicit_release;
+	evt_rsrc->deq_depth = def_p_conf.dequeue_depth;
+
+	for (event_p_id = 0; event_p_id < evt_rsrc->evp.nb_ports;
+								event_p_id++) {
+		ret = rte_event_port_setup(event_d_id, event_p_id,
+					   &event_p_conf);
+		if (ret < 0)
+			rte_panic("Error in configuring event port %d\n",
+				  event_p_id);
+
+		ret = rte_event_port_link(event_d_id, event_p_id,
+					  evt_rsrc->evq.event_q_id,
+					  NULL,
+					  evt_rsrc->evq.nb_queues - 1);
+		if (ret != (evt_rsrc->evq.nb_queues - 1))
+			rte_panic("Error in linking event port %d to queues\n",
+				  event_p_id);
+		evt_rsrc->evp.event_p_id[event_p_id] = event_p_id;
+	}
+	/* init spinlock */
+	rte_spinlock_init(&evt_rsrc->evp.lock);
+
+	evt_rsrc->def_p_conf = event_p_conf;
+}
+
+static void
+l3fwd_event_queue_setup_generic(uint32_t event_queue_cfg)
+{
+	struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+	uint8_t event_d_id = evt_rsrc->event_d_id;
+	struct rte_event_queue_conf event_q_conf = {
+		.nb_atomic_flows = 1024,
+		.nb_atomic_order_sequences = 1024,
+		.event_queue_cfg = event_queue_cfg,
+		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL
+	};
+	struct rte_event_queue_conf def_q_conf;
+	uint8_t event_q_id;
+	int32_t ret;
+
+	event_q_conf.schedule_type = evt_rsrc->sched_type;
+	evt_rsrc->evq.event_q_id = (uint8_t *)malloc(sizeof(uint8_t) *
+					evt_rsrc->evq.nb_queues);
+	if (!evt_rsrc->evq.event_q_id)
+		rte_panic("Memory allocation failure\n");
+
+	rte_event_queue_default_conf_get(event_d_id, 0, &def_q_conf);
+	if (def_q_conf.nb_atomic_flows < event_q_conf.nb_atomic_flows)
+		event_q_conf.nb_atomic_flows = def_q_conf.nb_atomic_flows;
+
+	for (event_q_id = 0; event_q_id < (evt_rsrc->evq.nb_queues - 1);
+								event_q_id++) {
+		ret = rte_event_queue_setup(event_d_id, event_q_id,
+					    &event_q_conf);
+		if (ret < 0)
+			rte_panic("Error in configuring event queue\n");
+		evt_rsrc->evq.event_q_id[event_q_id] = event_q_id;
+	}
+
+	event_q_conf.event_queue_cfg |= RTE_EVENT_QUEUE_CFG_SINGLE_LINK;
+	event_q_conf.priority = RTE_EVENT_DEV_PRIORITY_HIGHEST,
+	ret = rte_event_queue_setup(event_d_id, event_q_id, &event_q_conf);
+	if (ret < 0)
+		rte_panic("Error in configuring event queue for Tx adapter\n");
+	evt_rsrc->evq.event_q_id[event_q_id] = event_q_id;
+}
+
 void
 l3fwd_event_set_generic_ops(struct l3fwd_event_setup_ops *ops)
 {
 	ops->event_device_setup = l3fwd_event_device_setup_generic;
+	ops->event_queue_setup = l3fwd_event_queue_setup_generic;
+	ops->event_port_setup = l3fwd_event_port_setup_generic;
 }
diff --git a/examples/l3fwd/l3fwd_event_internal_port.c b/examples/l3fwd/l3fwd_event_internal_port.c
index f3e1ab3a2..59b7d35b7 100644
--- a/examples/l3fwd/l3fwd_event_internal_port.c
+++ b/examples/l3fwd/l3fwd_event_internal_port.c
@@ -80,9 +80,107 @@ l3fwd_event_device_setup_internal_port(void)
 	return event_queue_cfg;
 }
 
+static void
+l3fwd_event_port_setup_internal_port(void)
+{
+	struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+	uint8_t event_d_id = evt_rsrc->event_d_id;
+	struct rte_event_port_conf event_p_conf = {
+		.dequeue_depth = 32,
+		.enqueue_depth = 32,
+		.new_event_threshold = 4096
+	};
+	struct rte_event_port_conf def_p_conf;
+	uint8_t event_p_id;
+	int32_t ret;
+
+	evt_rsrc->evp.event_p_id = (uint8_t *)malloc(sizeof(uint8_t) *
+					evt_rsrc->evp.nb_ports);
+	if (!evt_rsrc->evp.event_p_id)
+		rte_panic("Failed to allocate memory for Event Ports\n");
+
+	rte_event_port_default_conf_get(event_d_id, 0, &def_p_conf);
+	if (def_p_conf.new_event_threshold < event_p_conf.new_event_threshold)
+		event_p_conf.new_event_threshold =
+						def_p_conf.new_event_threshold;
+
+	if (def_p_conf.dequeue_depth < event_p_conf.dequeue_depth)
+		event_p_conf.dequeue_depth = def_p_conf.dequeue_depth;
+
+	if (def_p_conf.enqueue_depth < event_p_conf.enqueue_depth)
+		event_p_conf.enqueue_depth = def_p_conf.enqueue_depth;
+
+	event_p_conf.disable_implicit_release =
+		evt_rsrc->disable_implicit_release;
+
+	for (event_p_id = 0; event_p_id < evt_rsrc->evp.nb_ports;
+								event_p_id++) {
+		ret = rte_event_port_setup(event_d_id, event_p_id,
+					   &event_p_conf);
+		if (ret < 0)
+			rte_panic("Error in configuring event port %d\n",
+				  event_p_id);
+
+		ret = rte_event_port_link(event_d_id, event_p_id, NULL,
+					  NULL, 0);
+		if (ret < 0)
+			rte_panic("Error in linking event port %d to queue\n",
+				  event_p_id);
+		evt_rsrc->evp.event_p_id[event_p_id] = event_p_id;
+
+		/* init spinlock */
+		rte_spinlock_init(&evt_rsrc->evp.lock);
+	}
+
+	evt_rsrc->def_p_conf = event_p_conf;
+}
+
+static void
+l3fwd_event_queue_setup_internal_port(uint32_t event_queue_cfg)
+{
+	struct l3fwd_event_resources *evt_rsrc = l3fwd_get_eventdev_rsrc();
+	uint8_t event_d_id = evt_rsrc->event_d_id;
+	struct rte_event_queue_conf event_q_conf = {
+		.nb_atomic_flows = 1024,
+		.nb_atomic_order_sequences = 1024,
+		.event_queue_cfg = event_queue_cfg,
+		.priority = RTE_EVENT_DEV_PRIORITY_NORMAL
+	};
+	struct rte_event_queue_conf def_q_conf;
+	uint8_t event_q_id = 0;
+	int32_t ret;
+
+	rte_event_queue_default_conf_get(event_d_id, event_q_id, &def_q_conf);
+
+	if (def_q_conf.nb_atomic_flows < event_q_conf.nb_atomic_flows)
+		event_q_conf.nb_atomic_flows = def_q_conf.nb_atomic_flows;
+
+	if (def_q_conf.nb_atomic_order_sequences <
+					event_q_conf.nb_atomic_order_sequences)
+		event_q_conf.nb_atomic_order_sequences =
+					def_q_conf.nb_atomic_order_sequences;
+
+	event_q_conf.event_queue_cfg = event_queue_cfg;
+	event_q_conf.schedule_type = evt_rsrc->sched_type;
+	evt_rsrc->evq.event_q_id = (uint8_t *)malloc(sizeof(uint8_t) *
+					evt_rsrc->evq.nb_queues);
+	if (!evt_rsrc->evq.event_q_id)
+		rte_panic("Memory allocation failure\n");
+
+	for (event_q_id = 0; event_q_id < evt_rsrc->evq.nb_queues;
+								event_q_id++) {
+		ret = rte_event_queue_setup(event_d_id, event_q_id,
+					    &event_q_conf);
+		if (ret < 0)
+			rte_panic("Error in configuring event queue\n");
+		evt_rsrc->evq.event_q_id[event_q_id] = event_q_id;
+	}
+}
 
 void
 l3fwd_event_set_internal_port_ops(struct l3fwd_event_setup_ops *ops)
 {
 	ops->event_device_setup = l3fwd_event_device_setup_internal_port;
+	ops->event_queue_setup = l3fwd_event_queue_setup_internal_port;
+	ops->event_port_setup = l3fwd_event_port_setup_internal_port;
 }
-- 
2.17.1


  parent reply	other threads:[~2020-01-22 18:29 UTC|newest]

Thread overview: 78+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-12-04 14:43 [dpdk-dev] [PATCH v2 00/11] example/l3fwd: introduce event device support pbhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 01/11] examples/l3fwd: add framework for event device pbhagavatula
2020-01-03 12:49   ` Ananyev, Konstantin
2020-01-06  4:27     ` Pavan Nikhilesh Bhagavatula
2020-01-06 12:32       ` Ananyev, Konstantin
2020-01-07 16:34         ` Pavan Nikhilesh Bhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 02/11] examples/l3fwd: split pipelines based on capability pbhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 03/11] examples/l3fwd: add event device configuration pbhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 04/11] examples/l3fwd: add ethdev setup based on eventdev pbhagavatula
2019-12-27 13:33   ` Nipun Gupta
2019-12-29 15:42     ` Pavan Nikhilesh Bhagavatula
2019-12-30  7:40       ` Nipun Gupta
2020-01-02  6:21         ` Pavan Nikhilesh Bhagavatula
2020-01-02  8:49           ` Nipun Gupta
2020-01-02  9:33             ` Jerin Jacob
2020-01-03  9:06               ` Nipun Gupta
2020-01-03  9:09                 ` Jerin Jacob
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 05/11] examples/l3fwd: add event port and queue setup pbhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 06/11] examples/l3fwd: add event eth Rx/Tx adapter setup pbhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 07/11] examples/l3fwd: add service core setup based on caps pbhagavatula
2020-01-03 13:07   ` Ananyev, Konstantin
2020-01-06  4:29     ` Pavan Nikhilesh Bhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 08/11] examples/l3fwd: add event lpm main loop pbhagavatula
2020-01-03 13:16   ` Ananyev, Konstantin
2020-01-06  4:43     ` Pavan Nikhilesh Bhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 09/11] examples/l3fwd: add event em " pbhagavatula
2020-01-03 13:45   ` Ananyev, Konstantin
2020-01-06  4:44     ` Pavan Nikhilesh Bhagavatula
2020-01-06 12:27       ` Ananyev, Konstantin
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 10/11] examples/l3fwd: add graceful teardown for eventdevice pbhagavatula
2020-01-03 13:52   ` Ananyev, Konstantin
2020-01-06  4:50     ` Pavan Nikhilesh Bhagavatula
2020-01-06 12:12       ` Ananyev, Konstantin
2020-01-07 16:28         ` Pavan Nikhilesh Bhagavatula
2019-12-04 14:43 ` [dpdk-dev] [PATCH v2 11/11] doc: update l3fwd user guide to support eventdev pbhagavatula
2019-12-04 15:16 ` [dpdk-dev] [PATCH v2 00/11] example/l3fwd: introduce event device support Jerin Jacob
2020-01-11 13:47 ` [dpdk-dev] [PATCH v3 " pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 01/11] examples/l3fwd: add framework for event device pbhagavatula
2020-01-21  8:44     ` Jerin Jacob
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 02/11] examples/l3fwd: split pipelines based on capability pbhagavatula
2020-01-21  8:46     ` Jerin Jacob
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 03/11] examples/l3fwd: add event device configuration pbhagavatula
2020-01-21  8:51     ` Jerin Jacob
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 04/11] examples/l3fwd: add ethdev setup based on eventdev pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 05/11] examples/l3fwd: add event port and queue setup pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 06/11] examples/l3fwd: add event eth Rx/Tx adapter setup pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 07/11] examples/l3fwd: add service core setup based on caps pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 08/11] examples/l3fwd: add event lpm main loop pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 09/11] examples/l3fwd: add event em " pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 10/11] examples/l3fwd: add graceful teardown for eventdevice pbhagavatula
2020-01-11 13:47   ` [dpdk-dev] [PATCH v3 11/11] doc: update l3fwd user guide to support eventdev pbhagavatula
2020-01-13 12:02   ` [dpdk-dev] [PATCH v3 00/11] example/l3fwd: introduce event device support Nipun Gupta
2020-01-22 18:28   ` [dpdk-dev] [PATCH v4 " pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 01/11] examples/l3fwd: add framework for event device pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 02/11] examples/l3fwd: split pipelines based on capability pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 03/11] examples/l3fwd: add event device configuration pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 04/11] examples/l3fwd: add ethdev setup based on eventdev pbhagavatula
2020-01-22 18:28     ` pbhagavatula [this message]
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 06/11] examples/l3fwd: add event eth Rx/Tx adapter setup pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 07/11] examples/l3fwd: add service core setup based on caps pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 08/11] examples/l3fwd: add event lpm main loop pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 09/11] examples/l3fwd: add event em " pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 10/11] examples/l3fwd: add graceful teardown for eventdevice pbhagavatula
2020-01-22 18:28     ` [dpdk-dev] [PATCH v4 11/11] doc: update l3fwd user guide to support eventdev pbhagavatula
2020-01-23  5:25       ` Jerin Jacob
2020-01-24  4:05     ` [dpdk-dev] [PATCH v5 00/11] example/l3fwd: introduce event device support pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 01/11] examples/l3fwd: add framework for event device pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 02/11] examples/l3fwd: split pipelines based on capability pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 03/11] examples/l3fwd: add event device configuration pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 04/11] examples/l3fwd: add ethdev setup based on eventdev pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 05/11] examples/l3fwd: add event port and queue setup pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 06/11] examples/l3fwd: add event eth Rx/Tx adapter setup pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 07/11] examples/l3fwd: add service core setup based on caps pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 08/11] examples/l3fwd: add event lpm main loop pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 09/11] examples/l3fwd: add event em " pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 10/11] examples/l3fwd: add graceful teardown for eventdevice pbhagavatula
2020-01-24  4:05       ` [dpdk-dev] [PATCH v5 11/11] doc: update l3fwd user guide to support eventdev pbhagavatula
2020-01-27 16:17       ` [dpdk-dev] [PATCH v5 00/11] example/l3fwd: introduce event device support Jerin Jacob

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=20200122182817.1667-6-pbhagavatula@marvell.com \
    --to=pbhagavatula@marvell.com \
    --cc=akhil.goyal@nxp.com \
    --cc=bruce.richardson@intel.com \
    --cc=dev@dpdk.org \
    --cc=jerinj@marvell.com \
    --cc=konstantin.ananyev@intel.com \
    --cc=marko.kovacevic@intel.com \
    --cc=orika@mellanox.com \
    --cc=radu.nicolau@intel.com \
    --cc=skori@marvell.com \
    --cc=tomasz.kantecki@intel.com \
    /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.