X-Git-Url: https://gerrit.fd.io/r/gitweb?a=blobdiff_plain;f=src%2Fvlib%2Flinux%2Fvmbus.c;h=d50b539910b62bca82814715bf2a94eedf30db56;hb=982272974;hp=c1d8eb9b71589fc4fac3079b77fa75cdf4e99bc0;hpb=29f0a5d25c208115c8d5c2b7f96062eaef205592;p=vpp.git diff --git a/src/vlib/linux/vmbus.c b/src/vlib/linux/vmbus.c index c1d8eb9b715..d50b539910b 100644 --- a/src/vlib/linux/vmbus.c +++ b/src/vlib/linux/vmbus.c @@ -118,8 +118,8 @@ linux_vmbus_main_t linux_vmbus_main; * "f2c086b2-ff2e-11e8-88de-7bad0a57de05" and convert * it to u8[16] */ -static uword -unformat_vlib_vmbus_addr (unformat_input_t * input, va_list * args) +uword +unformat_vlib_vmbus_addr (unformat_input_t *input, va_list *args) { vlib_vmbus_addr_t *addr = va_arg (*args, vlib_vmbus_addr_t *); uword ret = 0; @@ -137,8 +137,8 @@ unformat_vlib_vmbus_addr (unformat_input_t * input, va_list * args) } /* Convert bus address to standard UUID string */ -static u8 * -format_vlib_vmbus_addr (u8 * s, va_list * va) +u8 * +format_vlib_vmbus_addr (u8 *s, va_list *va) { vlib_vmbus_addr_t *addr = va_arg (*va, vlib_vmbus_addr_t *); char tmp[40]; @@ -199,6 +199,16 @@ done: return error; } +static int +directory_exists (char *path) +{ + struct stat s = { 0 }; + if (stat (path, &s) == -1) + return 0; + + return S_ISDIR (s.st_mode); +} + clib_error_t * vlib_vmbus_bind_to_uio (vlib_vmbus_addr_t * addr) { @@ -223,6 +233,10 @@ vlib_vmbus_bind_to_uio (vlib_vmbus_addr_t * addr) if (!driver_name || strcmp ("hv_netvsc", (char *) driver_name) != 0) goto done; + /* if uio_hv_generic is not loaded, then can't use native DPDK driver. */ + if (!directory_exists ("/sys/module/uio_hv_generic")) + goto done; + s = format (s, "%v/net%c", dev_dir_name, 0); dir = opendir ((char *) s); vec_reset_length (s); @@ -277,27 +291,35 @@ vlib_vmbus_bind_to_uio (vlib_vmbus_addr_t * addr) goto done; } - error = vlib_vmbus_raise_lower (fd, ifname); - close (fd); - - if (error) - goto done; - - /* tell uio_hv_generic about netvsc device type */ if (uio_new_id_needed) { - uio_new_id_needed = 0; - vec_reset_length (s); s = format (s, "%s/%s/new_id%c", sysfs_vmbus_drv_path, uio_drv_name, 0); error = clib_sysfs_write ((char *) s, "%s", netvsc_uuid); - + /* If device already exists, we can bind/unbind/override driver */ if (error) - goto done; + { + if (error->code == EEXIST) + { + clib_error_free (error); + } + else + { + close (fd); + goto done; + } + } + uio_new_id_needed = 0; } + error = vlib_vmbus_raise_lower (fd, ifname); + close (fd); + + if (error) + goto done; + /* prefer the simplier driver_override model */ vec_reset_length (s); s = format (s, "%/driver_override%c", dev_dir_name, 0); @@ -391,10 +413,15 @@ linux_vmbus_init (vlib_main_t * vm) pm->vlib_main = vm; - return vlib_call_init_function (vm, unix_input_init); + return 0; } -VLIB_INIT_FUNCTION (linux_vmbus_init); +/* *INDENT-OFF* */ +VLIB_INIT_FUNCTION (linux_vmbus_init) = +{ + .runs_before = VLIB_INITS("unix_input_init"), +}; +/* *INDENT-ON* */ /* * fd.io coding-style-patch-verification: ON