> On 05/11/2015 01:56 PM, Ciara Loftus wrote:
> > This patch adds support for a new port type to the userspace
> > datapath called dpdkvhostuser.
> >
> > A new dpdkvhostuser port will create a unix domain socket which
> > when provided to QEMU is used to facilitate communication between
> > the virtio-net device on the VM and the OVS port on the host.
> >
> > vhost-cuse ('dpdkvhost') ports are still available, and will be
> > enabled if vhost-cuse support is detected in the DPDK build
> > specified during compilation of the switch. Otherwise, vhost-user
> > ports are enabled.
> >
> > Signed-off-by: Ciara Loftus <[email protected]>
> > ---
> [...]
> > diff --git a/acinclude.m4 b/acinclude.m4
> > index e9d0ed9..2873480 100644
> > --- a/acinclude.m4
> > +++ b/acinclude.m4
> > @@ -218,6 +218,9 @@ AC_DEFUN([OVS_CHECK_DPDK], [
> >       DPDK_vswitchd_LDFLAGS=-Wl,--whole-archive,$DPDK_LIB,--no-whole-
> archive
> >       AC_SUBST([DPDK_vswitchd_LDFLAGS])
> >       AC_DEFINE([DPDK_NETDEV], [1], [System uses the DPDK module.])
> > +
> > +    OVS_GREP_IFELSE([$RTE_SDK/include/rte_config.h], [define
> RTE_LIBRTE_VHOST_USER 1],
> > +                    [], [AC_DEFINE([VHOST_CUSE], [1], [DPDK vhost-cuse 
> > support
> enabled, vhost-user disabled.])])
> >     else
> >       RTE_SDK=
> >     fi
> 
> This isn't really needed, you could just include rte_config.h from
> netdev-dpdk.c ... but maybe this is better afterall as it leaves a trace
> in the build log as to which version was chosen.

Will keep it in for the reason you mention above.

> 
> [...]
> > +static int
> > +new_device_vhost_user(struct virtio_net *dev)
> > +{
> > +    struct netdev_dpdk *netdev;
> > +    bool exists = false;
> > +
> > +    ovs_mutex_lock(&dpdk_mutex);
> > +    /* Add device to the vhost port with the same name as that passed
> down. */
> > +    LIST_FOR_EACH(netdev, list_node, &dpdk_list) {
> > +        if (strncmp(dev->ifname, netdev->socket_path, IF_NAME_SZ) == 0) {
> > +            ovs_mutex_lock(&netdev->mutex);
> > +            ovsrcu_set(&netdev->virtio_dev, dev);
> > +            ovs_mutex_unlock(&netdev->mutex);
> > +            exists = true;
> > +            dev->flags |= VIRTIO_DEV_RUNNING;
> > +            /* Disable notifications. */
> > +            set_irq_status(dev);
> > +            break;
> > +        }
> > +    }
> > +    ovs_mutex_unlock(&dpdk_mutex);
> > +
> > +    if (!exists) {
> > +        VLOG_INFO("vHost Device '%s' (%ld) can't be added - name not
> found",
> > +                   dev->ifname, dev->device_fh);
> > +
> > +        return -1;
> > +    }
> > +
> > +    VLOG_INFO("vHost Device '%s' (%ld) has been added",
> > +               dev->ifname, dev->device_fh);
> > +    return 0;
> > +}
> > +
> >   /*
> >    * Remove a virtio-net device from the specific vhost port.  Use dev-
> >remove
> >    * flag to stop any more packets from being sent or received to/from a VM
> and
> 
> Sorry for missing this the last time around, but this too seems like
> unwanted code duplication since the whole thing differs from the vhost
> case by just that one strncmp() line. Its a little trickier than the
> constructor case since the struct member to compare differs but solvable.

Makes sense, I've introduced a helper function in v4.

> 
> [...]
> > +static int
> > +process_vhost_flags(char* flag, char* default_val, int size, char** argv,
> char** new_val)
> > +{
> > +   int changed = 0;
> 
> The indentation is off here, there's a tab where other code on this
> level is at four spaces.

Fixed in v4.

> 
> > +
> > +    /* Depending on which version of vhost is in use, process the vhost-
> specific
> > +     * flag if it is provided on the vswitchd command line, otherwise 
> > resort
> to
> > +     * a default value.
> > +     *
> > +     * For vhost-user: Process "--cuse_dev_name" to set the custom
> location of
> > +     * the vhost-user socket(s).
> > +     * For vhost-cuse: Process "--vhost_sock_dir" to set the custom name
> of the
> > +     * vhost-cuse character device.
> > +     */
> > +    if (!strcmp(argv[1], flag) &&
> > +       (strlen(argv[2]) <= size)) {
> 
> Why the line-split? This fits easily on one line ... okay it was that
> way already, but no reason not to "fix" it when moving around.

Fixed in v4.

> 
> > +
> > +        *new_val = strdup(argv[2]);
> > +
> > +        VLOG_ERR("User-provided %s in use: %s", flag, *new_val);
> > +        changed = 1;
> > +    } else {
> > +        *new_val = default_val;
> > +        VLOG_INFO("No %s provided - defaulting to %s", flag, default_val);
> > +    }
> > +
> > +    return changed;
> > +}
> > +
> >   int
> >   dpdk_init(int argc, char **argv)
> >   {
> >       int result;
> >       int base = 0;
> >       char *pragram_name = argv[0];
> > +    int flag_processed = 0;
> >
> >       if (argc < 2 || strcmp(argv[1], "--dpdk"))
> >           return 0;
> > @@ -1869,27 +1983,17 @@ dpdk_init(int argc, char **argv)
> >       argc--;
> >       argv++;
> >
> > -    /* If the cuse_dev_name parameter has been provided, set
> 'cuse_dev_name' to
> > -     * this string if it meets the correct criteria. Otherwise, set it to 
> > the
> > -     * default (vhost-net).
> > -     */
> > -    if (!strcmp(argv[1], "--cuse_dev_name") &&
> > -        (strlen(argv[2]) <= NAME_MAX)) {
> > -
> > -        cuse_dev_name = strdup(argv[2]);
> > +    flag_processed = (process_vhost_flags("--cuse_dev_name", "vhost-
> net", PATH_MAX, argv, &cuse_dev_name) ||
> > +            process_vhost_flags("--vhost_sock_dir", strdup(ovs_rundir()),
> NAME_MAX, argv, &vhost_sock_dir));
> 
> This seems problematic in a number of ways:
> - The lines are rather long and wrap nastily on a 80 char terminal.
> - For what it does, its unnecessarily hard to read and understand. It
> seems like it accepts both variants (and sort of does) but only the
> first will actually work, and then the rest will get passed down to dpdk
> which will choke on it. Or something like that.
> - AFAICS it'll mumble about vhost-cuse defaults when vhost-cuse is not
> even enabled, and about vhost-user on vhost-cuse build if defaults are used.
> 
> Certainly there are any number of ways to make it clearer and all but at
> least I wouldn't mind a simple #ifdef here as it makes the thing so
> blatantly obvious.
> 
> In addition, the cuse_dev_name/vhost_sock_dir allocation is
> inconsistent: in other cases its strdup()'ed but default cuse name is
> not. Doesn't matter technically since nothing is freeing it at the
> moment but in my experience its better to avoid such inconsistencies in
> the first place, they have a tendency to come back to bite you.

I've attempted to simplify this in v4 and added in the #define as suggested.

> 
> Anyway, nitpicking over tabs vs spaces should be a fair indicator its
> getting there :)
> 
>       - Panu -

Thanks for your feedback.

Ciara
_______________________________________________
dev mailing list
[email protected]
http://openvswitch.org/mailman/listinfo/dev

Reply via email to