On 13-Jun-19 7:42 AM, Jakub Grajciar wrote:
Multi-process support for memif PMD.
Primary process handles connection establishment.
Secondary process queries for memory regions.

Signed-off-by: Jakub Grajciar <jgraj...@cisco.com>
---

<snip>

+/*
+ * Request regions
+ * Called by secondary process, when ports link status goes up.
+ */
+static int
+memif_mp_request_regions(struct rte_eth_dev *dev)
+{
+       int ret, i;
+       struct timespec timeout = {.tv_sec = 5, .tv_nsec = 0};
+       struct rte_mp_msg msg, *reply;
+       struct rte_mp_reply replies;
+       struct mp_region_msg *msg_param = (struct mp_region_msg *)msg.param;
+       struct mp_region_msg *reply_param;
+       struct memif_region *r;
+       struct pmd_process_private *proc_private = dev->process_private;
+
+       MIF_LOG(DEBUG, "Requesting memory regions");
+
+       for (i = 0; i < ETH_MEMIF_MAX_REGION_NUM; i++) {
+               /* Prepare the message */
+               memset(&msg, 0, sizeof(msg));
+               strlcpy(msg.name, MEMIF_MP_SEND_REGION, sizeof(msg.name));
+               strlcpy(msg_param->port_name, dev->data->name,
+                       sizeof(msg_param->port_name));
+               msg_param->idx = i;
+               msg.len_param = sizeof(*msg_param);
+
+               /* Send message */
+               ret = rte_mp_request_sync(&msg, &replies, &timeout);
+               if (ret < 0 || replies.nb_received != 1) {
+                       MIF_LOG(ERR, "Failed to send mp msg: %d",
+                               rte_errno);
+                       return -1;
+               }
+
+               reply = &replies.msgs[0];
+               reply_param = (struct mp_region_msg *)reply->param;

Replies need to be freed after use, otherwise you're leaking memory. See rte_mp_request_sync API doc [1] and the PG [2].

[1] https://doc.dpdk.org/api/rte__eal_8h.html#abc35eb3d9139a0e7b9277a844dd2a61f

[2] https://doc.dpdk.org/guides/prog_guide/multi_proc_support.html#communication-between-multiple-processes

+
+               if (reply_param->size > 0) {
+                       r = rte_zmalloc("region", sizeof(struct memif_region), 
0);
+                       if (r == NULL) {
+                               MIF_LOG(ERR, "Failed to alloc memif region.");
+                               return -ENOMEM;
+                       }
+                       r->region_size = reply_param->size;
+                       if (reply->num_fds < 1) {
+                               MIF_LOG(ERR, "Missing file descriptor.");
+                               return -1;
+                       }
+                       r->fd = reply->fds[0];
+                       r->addr = NULL;
+
+                       proc_private->regions[reply_param->idx] = r;
+                       proc_private->regions_num++;
+               }
+       }
+


--
Thanks,
Anatoly

Reply via email to