[PATCHv10,7/8] linux-generic: add ipc pktio support

Message ID 20151020141203.GA27190@localhost
State New
Headers show

Commit Message

Stuart Haslam Oct. 20, 2015, 2:12 p.m.
On Tue, Oct 20, 2015 at 04:53:10PM +0300, Maxim Uvarov wrote:
> 
> slave:
> 
> On 10/20/2015 15:41, Stuart Haslam wrote:
> >>+	/* recv() rings */
> >>>+	pktio_entry->s.ipc.recv.r = pktio_entry->s.ipc.m.prod;
> >>>+	pktio_entry->s.ipc.recv.r_p = pktio_entry->s.ipc.m.cons;
> >>>+	/* tx() rings */
> >>>+	pktio_entry->s.ipc.tx.r = pktio_entry->s.ipc.s.prod;
> >>>+	pktio_entry->s.ipc.tx.r_p = pktio_entry->s.ipc.s.cons;
> >>>+
> >This isn't exactly what I had in mind, can't you just use these names
> >directly in the first place in the code above? Is there any reason to
> >retain two copies of the pointers?
> >
> master:
> 
> +	/* recv() rings */
> +	pktio_entry->s.ipc.recv.r = pktio_entry->s.ipc.s.prod;
> +	pktio_entry->s.ipc.recv.r_p = pktio_entry->s.ipc.s.cons;
> +	/* tx() rings */
> +	pktio_entry->s.ipc.tx.r = pktio_entry->s.ipc.m.prod;
> +	pktio_entry->s.ipc.tx.r_p = pktio_entry->s.ipc.m.cons;
> +
> 
> 
> They are crossed. Instead of implementing 2 function slave_recv()
> master_recv()
> I add added one and this links.
> 
> But I can rename rings something like:
> 
> pktio_entry->s.ipc.local.prod
> pktio_entry->s.ipc.local.cons
> pktio_entry->s.ipc.remote.prod
> pktio_entry->s.ipc.remote.cons
> 
> local - will reflect local pool/ring mappings;
> remote - for remote process poll/ring mappings;
> 
> Maxim.

I don't think we're understanding each other, I mean like this (based on
top of this series):

Patch

diff --git a/platform/linux-generic/include/odp_packet_io_internal.h b/platform/linux-generic/include/odp_packet_io_internal.h
index e25e747..5ee3fd3 100644
--- a/platform/linux-generic/include/odp_packet_io_internal.h
+++ b/platform/linux-generic/include/odp_packet_io_internal.h
@@ -42,31 +42,22 @@  typedef struct {
 typedef	struct {
 	/* TX */
 	struct  {
-		odph_ring_t	*prod; /**< ODP ring for IPC msg packets
+		odph_ring_t	*send; /**< ODP ring for IPC msg packets
 					  indexes transmitted to shared
 					  memory */
-		odph_ring_t	*cons; /**< ODP ring for IPC msg packets
+		odph_ring_t	*free; /**< ODP ring for IPC msg packets
 					    indexes already processed by remote
 					    process */
-	} m; /* master */
+	} tx;
 	/* RX */
 	struct {
-		odph_ring_t	*prod; /**< ODP ring for IPC msg packets
+		odph_ring_t	*recv; /**< ODP ring for IPC msg packets
 					    indexes received from shared
 					     memory (from remote process) */
-		odph_ring_t	*cons; /**< ODP ring for IPC msg packets
+		odph_ring_t	*free; /**< ODP ring for IPC msg packets
 					    indexes already processed by
 					    current process */
-	} s; /* slave */
-	struct {
-		odph_ring_t *r;	  /**< ring to receive from */
-		odph_ring_t *r_p; /**< after recv is done place packet descr to
-				       that produced ring */
-	} recv; /* remapped above rings for easy usage in recv() */
-	struct {
-		odph_ring_t *r; /**< ring to transmit packets */
-		odph_ring_t *r_p; /**< ring with already transmitted packets */
-	} tx; /* remapped above rings for easy usage in send() */
+	} rx; /* slave */
 	void		*pool_base;		/**< Remote pool base addr */
 	void		*pool_mdata_base;	/**< Remote pool mdata base addr */
 	uint64_t	pkt_size;		/**< Packet size in remote pool */
diff --git a/platform/linux-generic/pktio/ipc.c b/platform/linux-generic/pktio/ipc.c
index 835de17..791ad1f 100644
--- a/platform/linux-generic/pktio/ipc.c
+++ b/platform/linux-generic/pktio/ipc.c
@@ -116,13 +116,6 @@  static int _ipc_master_post_init(pktio_entry_t *pktio_entry)
 	pktio_entry->s.ipc.pool_mdata_base = (char *)ipc_pool_base +
 					     pinfo->slave.mdata_offset;
 
-	/* recv() rings */
-	pktio_entry->s.ipc.recv.r = pktio_entry->s.ipc.s.prod;
-	pktio_entry->s.ipc.recv.r_p = pktio_entry->s.ipc.s.cons;
-	/* tx() rings */
-	pktio_entry->s.ipc.tx.r = pktio_entry->s.ipc.m.prod;
-	pktio_entry->s.ipc.tx.r_p = pktio_entry->s.ipc.m.cons;
-
 	odp_atomic_store_u32(&pktio_entry->s.ipc.ready, 1);
 
 	ODP_DBG("Post init... DONE.\n");
@@ -152,59 +145,59 @@  static int _ipc_init_master(pktio_entry_t *pktio_entry,
 	 * to be processed packets ring.
 	 */
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev);
-	pktio_entry->s.ipc.m.prod = odph_ring_create(ipc_shm_name,
+	pktio_entry->s.ipc.tx.send = odph_ring_create(ipc_shm_name,
 			PKTIO_IPC_ENTRIES,
 			ODPH_RING_SHM_PROC | ODPH_RING_NO_LIST);
-	if (!pktio_entry->s.ipc.m.prod) {
+	if (!pktio_entry->s.ipc.tx.send) {
 		ODP_DBG("pid %d unable to create ipc ring %s name\n",
 			getpid(), ipc_shm_name);
 		return -1;
 	}
 	ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.m.prod),
-		odph_ring_free_count(pktio_entry->s.ipc.m.prod));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.tx.send),
+		odph_ring_free_count(pktio_entry->s.ipc.tx.send));
 
 	/* generate name in shm like ipc_pktio_p for
 	 * already processed packets
 	 */
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev);
-	pktio_entry->s.ipc.m.cons = odph_ring_create(ipc_shm_name,
+	pktio_entry->s.ipc.tx.free = odph_ring_create(ipc_shm_name,
 			PKTIO_IPC_ENTRIES,
 			ODPH_RING_SHM_PROC | ODPH_RING_NO_LIST);
-	if (!pktio_entry->s.ipc.m.cons) {
+	if (!pktio_entry->s.ipc.tx.free) {
 		ODP_DBG("pid %d unable to create ipc ring %s name\n",
 			getpid(), ipc_shm_name);
 		goto free_m_prod;
 	}
 	ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.m.cons),
-		odph_ring_free_count(pktio_entry->s.ipc.m.cons));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.tx.free),
+		odph_ring_free_count(pktio_entry->s.ipc.tx.free));
 
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev);
-	pktio_entry->s.ipc.s.prod = odph_ring_create(ipc_shm_name,
+	pktio_entry->s.ipc.rx.recv = odph_ring_create(ipc_shm_name,
 			PKTIO_IPC_ENTRIES,
 			ODPH_RING_SHM_PROC | ODPH_RING_NO_LIST);
-	if (!pktio_entry->s.ipc.s.prod) {
+	if (!pktio_entry->s.ipc.rx.recv) {
 		ODP_DBG("pid %d unable to create ipc ring %s name\n",
 			getpid(), ipc_shm_name);
 		goto free_m_cons;
 	}
 	ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.s.prod),
-		odph_ring_free_count(pktio_entry->s.ipc.s.prod));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.rx.recv),
+		odph_ring_free_count(pktio_entry->s.ipc.rx.recv));
 
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev);
-	pktio_entry->s.ipc.s.cons = odph_ring_create(ipc_shm_name,
+	pktio_entry->s.ipc.rx.free = odph_ring_create(ipc_shm_name,
 			PKTIO_IPC_ENTRIES,
 			ODPH_RING_SHM_PROC | ODPH_RING_NO_LIST);
-	if (!pktio_entry->s.ipc.s.cons) {
+	if (!pktio_entry->s.ipc.rx.free) {
 		ODP_DBG("pid %d unable to create ipc ring %s name\n",
 			getpid(), ipc_shm_name);
 		goto free_s_prod;
 	}
 	ODP_DBG("Created IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.s.cons),
-		odph_ring_free_count(pktio_entry->s.ipc.s.cons));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.rx.free),
+		odph_ring_free_count(pktio_entry->s.ipc.rx.free));
 
 	/* Set up pool name for remote info */
 	pinfo = pktio_entry->s.ipc.pinfo;
@@ -316,49 +309,49 @@  static int _ipc_slave_post_init(pktio_entry_t *pktio_entry)
 	const char *dev = pktio_entry->s.name;
 
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_prod", dev);
-	pktio_entry->s.ipc.m.prod  = _ipc_shm_map(ipc_shm_name, ring_size);
-	if (!pktio_entry->s.ipc.m.prod) {
+	pktio_entry->s.ipc.rx.recv  = _ipc_shm_map(ipc_shm_name, ring_size);
+	if (!pktio_entry->s.ipc.rx.recv) {
 		ODP_DBG("pid %d unable to find ipc ring %s name\n",
 			getpid(), dev);
 		sleep(1);
 		return -1;
 	}
 	ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.m.prod),
-		odph_ring_free_count(pktio_entry->s.ipc.m.prod));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.rx.recv),
+		odph_ring_free_count(pktio_entry->s.ipc.rx.recv));
 
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_m_cons", dev);
-	pktio_entry->s.ipc.m.cons = _ipc_shm_map(ipc_shm_name, ring_size);
-	if (!pktio_entry->s.ipc.m.cons) {
+	pktio_entry->s.ipc.rx.free = _ipc_shm_map(ipc_shm_name, ring_size);
+	if (!pktio_entry->s.ipc.rx.free) {
 		ODP_DBG("pid %d unable to find ipc ring %s name\n",
 			getpid(), dev);
 		goto free_m_prod;
 	}
 	ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.m.cons),
-		odph_ring_free_count(pktio_entry->s.ipc.m.cons));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.rx.free),
+		odph_ring_free_count(pktio_entry->s.ipc.rx.free));
 
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_prod", dev);
-	pktio_entry->s.ipc.s.prod = _ipc_shm_map(ipc_shm_name, ring_size);
-	if (!pktio_entry->s.ipc.s.prod) {
+	pktio_entry->s.ipc.tx.send = _ipc_shm_map(ipc_shm_name, ring_size);
+	if (!pktio_entry->s.ipc.tx.send) {
 		ODP_DBG("pid %d unable to find ipc ring %s name\n",
 			getpid(), dev);
 		goto free_m_cons;
 	}
 	ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.s.prod),
-		odph_ring_free_count(pktio_entry->s.ipc.s.prod));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.tx.send),
+		odph_ring_free_count(pktio_entry->s.ipc.tx.send));
 
 	snprintf(ipc_shm_name, sizeof(ipc_shm_name), "%s_s_cons", dev);
-	pktio_entry->s.ipc.s.cons = _ipc_shm_map(ipc_shm_name, ring_size);
-	if (!pktio_entry->s.ipc.s.cons) {
+	pktio_entry->s.ipc.tx.free = _ipc_shm_map(ipc_shm_name, ring_size);
+	if (!pktio_entry->s.ipc.tx.free) {
 		ODP_DBG("pid %d unable to find ipc ring %s name\n",
 			getpid(), dev);
 		goto free_s_prod;
 	}
 	ODP_DBG("Connected IPC ring: %s, count %d, free %d\n",
-		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.s.cons),
-		odph_ring_free_count(pktio_entry->s.ipc.s.cons));
+		ipc_shm_name, odph_ring_count(pktio_entry->s.ipc.tx.free),
+		odph_ring_free_count(pktio_entry->s.ipc.tx.free));
 
 	/* Get info about remote pool */
 	pinfo = pktio_entry->s.ipc.pinfo;
@@ -375,13 +368,6 @@  static int _ipc_slave_post_init(pktio_entry_t *pktio_entry)
 	 */
 	_odp_ipc_export_pool(pinfo, pktio_entry->s.ipc.pool);
 
-	/* recv() rings */
-	pktio_entry->s.ipc.recv.r = pktio_entry->s.ipc.m.prod;
-	pktio_entry->s.ipc.recv.r_p = pktio_entry->s.ipc.m.cons;
-	/* tx() rings */
-	pktio_entry->s.ipc.tx.r = pktio_entry->s.ipc.s.prod;
-	pktio_entry->s.ipc.tx.r_p = pktio_entry->s.ipc.s.cons;
-
 	odp_atomic_store_u32(&pktio_entry->s.ipc.ready, 1);
 
 	ODP_DBG("Post init... DONE.\n");
@@ -497,7 +483,7 @@  int ipc_pktio_recv(pktio_entry_t *pktio_entry,
 		odph_ring_t *tx_r_p;
 
 		rbuf_p = (void *)&r_p_pkts;
-		tx_r_p = pktio_entry->s.ipc.tx.r_p;
+		tx_r_p = pktio_entry->s.ipc.tx.free;
 		ret = odph_ring_mc_dequeue_burst(tx_r_p, rbuf_p,
 						 PKTIO_IPC_ENTRIES);
 		if (0 == ret)
@@ -508,7 +494,7 @@  int ipc_pktio_recv(pktio_entry_t *pktio_entry,
 		}
 	}
 
-	r = pktio_entry->s.ipc.recv.r;
+	r = pktio_entry->s.ipc.rx.recv;
 	pkts = odph_ring_mc_dequeue_burst(r, ipcbufs_p, len);
 	if (odp_unlikely(pkts < 0))
 		ODP_ABORT("error to dequeue no packets\n");
@@ -587,7 +573,7 @@  int ipc_pktio_recv(pktio_entry_t *pktio_entry,
 	}
 
 	/* Now tell other process that we no longer need that buffers.*/
-	r_p = pktio_entry->s.ipc.recv.r_p;
+	r_p = pktio_entry->s.ipc.rx.free;
 	pkts = odph_ring_mp_enqueue_burst(r_p, ipcbufs_p, i);
 	if (odp_unlikely(pkts < 0))
 		ODP_ABORT("ipc: odp_ring_mp_enqueue_bulk r_p fail\n");
@@ -613,7 +599,7 @@  int ipc_pktio_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[],
 		odph_ring_t *r_p;
 
 		rbuf_p = (void *)&r_p_pkts;
-		r_p = pktio_entry->s.ipc.tx.r_p;
+		r_p = pktio_entry->s.ipc.tx.free;
 		ret = odph_ring_mc_dequeue_burst(r_p, rbuf_p,
 						 PKTIO_IPC_ENTRIES);
 		if (0 == ret)
@@ -661,7 +647,7 @@  int ipc_pktio_send(pktio_entry_t *pktio_entry, odp_packet_t pkt_table[],
 
 	/* Put packets to ring to be processed in other process. */
 	rbuf_p = (void *)&pkt_table[0];
-	r = pktio_entry->s.ipc.tx.r;
+	r = pktio_entry->s.ipc.tx.send;
 	ret = odph_ring_mp_enqueue_burst(r, rbuf_p, len);
 	if (odp_unlikely(ret < 0)) {
 		ODP_ERR("pid %d odp_ring_mp_enqueue_bulk fail, ipc_slave %d, ret %d\n",