On 12/22/2016 10:02 AM, Kevin Traynor wrote: > On 12/21/2016 07:35 PM, Daniele Di Proietto wrote: >> 2016-12-21 10:18 GMT-08:00 Kevin Traynor <ktray...@redhat.com>: >>> On 12/21/2016 03:02 AM, Daniele Di Proietto wrote: >>>> 2016-12-20 14:08 GMT-08:00 Kevin Traynor <ktray...@redhat.com>: >>>>> On 12/15/2016 11:54 AM, Ciara Loftus wrote: >>>>>> 'dpdk' ports no longer have naming restrictions. Now, instead of >>>>>> specifying the dpdk port ID as part of the name, the PCI address of the >>>>>> device must be specified via the 'dpdk-devargs' option. eg. >>>>>> >>>>>> ovs-vsctl add-port br0 my-port >>>>>> ovs-vsctl set Interface my-port type=dpdk >>>>>> ovs-vsctl set Interface my-port options:dpdk-devargs=0000:06:00.3 >>>>> >>>>> I wouldn't encourage people to split up commands like above as they'll >>>>> see errors and warnings. >>>> >>>> Good point >>>> >>>>> >>>>> If you use the old command (which people surely will), it's not >>>>> intuitive that it's now still a valid cmd but incomplete for setting up >>>>> the port: >>>>> >>>>> []# ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk >>>>> 2016-12-20T19:53:54Z|00051|netdev|WARN|dpdk0: could not set >>>>> configuration (Invalid argument) >>>>> ovs-vsctl: Error detected while setting up 'dpdk0'. See ovs-vswitchd >>>>> log for details. >>>>> >>>>> It would be nice if this was just a warning and more informative - this >>>>> could be an incremental change also. >>>> >>>> You're right, vsctl errors are pretty obscure in this case. I think a first >>>> step is to improve what ovs-vsctl reports to the user. I sent a patch here: >>>> >>>> https://mail.openvswitch.org/pipermail/ovs-dev/2016-December/326542.html >>>> >>>> The second step would be to allow netdev_dpdk_set_config() to return an >>>> error >>>> string, that can be printed by ovs-vsctl. I'm fine with doing that later. >>>> What do you guys think? >>> >>> sounds like a good plan to me. >>> >>> I've done some testing with this patch today and I can't seem to get >>> hotplug working after applying 2/3. It works with 1/3 but I'm seeing >>> hangs with the new scheme in 2/3 and a dpdk seg fault with 3/3. I think >>> maybe my dpdk build is bad or my steps are wrong but it would be good if >>> someone else could test too. >>> >>> - dpdk-devbind.py -u 0000:01:00.0 0000:01:00.1 >>> - start vswitchd and add bridge >>> - dpdk-devbind.py -b igb_uio 0000:01:00.0 0000:01:00.1 >>> - ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk >>> options:dpdk-devargs=0000:01:00.0 >>> >> >> I think there's a bug in DPDK 16.11 that should be fixed by this commit: >> >> f9ae888b1e19("ethdev: fix port lookup if none"). >> >> Does it work if you include the fix in your DPDK build? > > yes - that was the issue I was hitting for the seg fault, thanks. The > hang is fixed too, I think my igb_uio was out of date. > > It is a reasonable that someone might try to mistakenly add a port when > there are no devices in dpdk but the dpdk fix won't be available until a > 16.11.1, so we need the equivalent check in OVS. I tested attach/detach > when no device with/without this incremental and it works now.
pah...I didn't test when there was a single device bound after vswitchd starts and of course it breaks, so it should be: diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c index 75559fe..11c007d 100644 --- a/lib/netdev-dpdk.c +++ b/lib/netdev-dpdk.c @@ -1097,8 +1097,9 @@ netdev_dpdk_process_devargs(const char *devargs) { uint8_t new_port_id = UINT8_MAX; - if (rte_eth_dev_get_port_by_name(devargs, &new_port_id) - || !rte_eth_dev_is_valid_port(new_port_id)) { + if (!rte_eth_dev_count() + || rte_eth_dev_get_port_by_name(devargs, &new_port_id) + || !rte_eth_dev_is_valid_port(new_port_id)) { /* Device not found in DPDK, attempt to attach it */ if (!rte_eth_dev_attach(devargs, &new_port_id)) { /* Attach successful */ @@ -2397,7 +2398,7 @@ netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED, ovs_mutex_lock(&dpdk_mutex); - if (rte_eth_dev_get_port_by_name(argv[1], &port_id)) { + if (!rte_eth_dev_count() || rte_eth_dev_get_port_by_name(argv[1], &port_id)) { response = xasprintf("Device '%s' not found in DPDK", argv[1]); goto error; } > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index 75559fe..bedff86 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -1097,6 +1097,10 @@ netdev_dpdk_process_devargs(const char *devargs) > { > uint8_t new_port_id = UINT8_MAX; > > + if (!rte_eth_dev_count()) { > + goto out; > + } > + > if (rte_eth_dev_get_port_by_name(devargs, &new_port_id) > || !rte_eth_dev_is_valid_port(new_port_id)) { > /* Device not found in DPDK, attempt to attach it */ > @@ -1109,6 +1113,7 @@ netdev_dpdk_process_devargs(const char *devargs) > } > } > > +out: > return new_port_id; > } > > @@ -2397,7 +2402,7 @@ netdev_dpdk_detach(struct unixctl_conn *conn, int > argc OVS_UNUSED, > > ovs_mutex_lock(&dpdk_mutex); > > - if (rte_eth_dev_get_port_by_name(argv[1], &port_id)) { > + if (!rte_eth_dev_count() || rte_eth_dev_get_port_by_name(argv[1], > &port_id)) { > response = xasprintf("Device '%s' not found in DPDK", argv[1]); > goto error; > } > > >> >>> >>>> >>>>> >>>>>> >>>>>> The user must no longer hotplug attach DPDK ports by issuing the >>>>>> specific ovs-appctl netdev-dpdk/attach command. The hotplug is now >>>>>> automatically invoked when a valid PCI address is set in the >>>>>> dpdk-devargs. The format for ovs-appctl netdev-dpdk/detach command >>>>>> has changed in that the user now must specify the relevant PCI address >>>>>> as input instead of the port name. >>>>>> >>>>>> Signed-off-by: Ciara Loftus <ciara.lof...@intel.com> >>>>>> Signed-off-by: Daniele Di Proietto <diproiet...@vmware.com> >>>>>> Co-authored-by: Daniele Di Proietto <diproiet...@vmware.com> >>>> >>>> I think netdev_dpdk_set_config() should compare new_devargs with >>>> dev->devargs >>>> and avoid calling netdev_dpdk_process_devargs() if they're equal and >>>> if the port_id >>>> is valid. I've noticed that rte_eth_dev_get_port_by_name() sometimes >>>> doesn't find >>>> an existing device and I think comparing the strings will fix the problem. >>>> >>>> Also, could you add a log message if rte_eth_dev_attach fails? >>>> >>>> I've been playing with this for a while and I guess I'm fine with the >>>> rest of the series. >>>> >>>> Thanks, >>>> >>>> Daniele >>>> >>>>>> --- >>>>>> Changelog: >>>>>> * Keep port-detach appctl function - use PCI as input arg >>>>>> * Add requires_mutex to devargs processing functions >>>>>> * use reconfigure infrastructure for devargs changes >>>>>> * process devargs even if valid portid ie. device already configured >>>>>> * report err if dpdk-devargs is not specified >>>>>> * Add Daniele's incremental patch & Sign-off + Co-author tags >>>>>> * Update details of detach command to reflect PCI is needed instead of >>>>>> port name >>>>>> * Update NEWS to mention that the new naming scheme is not backwards >>>>>> compatible >>>>>> * Use existing DPDk functions to get port ID from PCI address/devname >>>>>> * Merged process_devargs and process_pdevargs functions >>>>>> * Removed unnecessary requires_mutex from devargs processing fn >>>>>> * Fix case where port is re-attached after detach >>>>>> * Add note to documentation that devices won't work until devargs set. >>>>>> >>>>>> Documentation/intro/install/dpdk-advanced.rst | 5 +- >>>>>> Documentation/intro/install/dpdk.rst | 15 ++- >>>>>> NEWS | 5 + >>>>>> lib/netdev-dpdk.c | 169 >>>>>> +++++++++++++++++--------- >>>>>> vswitchd/vswitch.xml | 8 ++ >>>>>> 5 files changed, 138 insertions(+), 64 deletions(-) >>> > > _______________________________________________ > dev mailing list > d...@openvswitch.org > https://mail.openvswitch.org/mailman/listinfo/ovs-dev > _______________________________________________ dev mailing list d...@openvswitch.org https://mail.openvswitch.org/mailman/listinfo/ovs-dev