On 19-Apr-18 5:50 PM, Jianfeng Tan wrote:
To scan the vdevs in primary, we send request to primary process
to obtain the names for vdevs.

Only the name is shared from the primary. In probe(), the device
driver is supposed to locate (or request more) the detail
information from the primary.

Signed-off-by: Jianfeng Tan <jianfeng....@intel.com>
Reviewed-by: Qi Zhang <qi.z.zh...@intel.com>
---

<...>

+static int
+vdev_action(const struct rte_mp_msg *mp_msg, const void *peer)
+{
+       struct rte_vdev_device *dev;
+       struct rte_mp_msg mp_resp;
+       struct vdev_param *ou = (struct vdev_param *)&mp_resp.param;
+       const struct vdev_param *in = (const struct vdev_param *)mp_msg->param;
+       const char *devname;
+       int num;
+
+       strcpy(mp_resp.name, "vdev");
+       mp_resp.len_param = sizeof(*ou);
+       mp_resp.num_fds = 0;
+
+       switch (in->type) {
+       case VDEV_SCAN_REQ:
+               ou->type = VDEV_SCAN_ONE;
+               ou->num = 1;
+               num = 0;
+
+               rte_spinlock_lock(&vdev_device_list_lock);
+               TAILQ_FOREACH(dev, &vdev_device_list, next) {
+                       devname = rte_vdev_device_name(dev);
+                       if (strlen(devname) == 0)
+                               VDEV_LOG(INFO, "vdev with no name is not sent");
+                       VDEV_LOG(INFO, "send vdev, %s", devname);
+                       strncpy(ou->name, devname, RTE_DEV_NAME_MAX_LEN);

Probably better use strlcpy as it always null-terminates.

+                       if (rte_mp_sendmsg(&mp_resp) < 0)
+                               VDEV_LOG(ERR, "send vdev, %s, failed, %s",
+                                        devname, strerror(rte_errno));
+                       num++;

Some comments on what is going on here (why are we sending messages in response? why multiple? who will receive these messages?) would be nice. I have a sneaking suspicion that you could've packed the response into one single message, but i'm not completely sure what is going on here, so maybe what you have here makes sense...

+               }
+               rte_spinlock_unlock(&vdev_device_list_lock);
+
+               ou->type = VDEV_SCAN_REP;
+               ou->num = num;
+               if (rte_mp_reply(&mp_resp, peer) < 0)
+                       VDEV_LOG(ERR, "Failed to reply a scan request");
+               break;

<...>

--
Thanks,
Anatoly

Reply via email to