From: Stephen Hemminger <stephen@networkplumber.org>
To: Adrien Mazarguil <adrien.mazarguil@6wind.com>
Cc: Ferruh Yigit <ferruh.yigit@intel.com>, dev@dpdk.org
Subject: Re: [PATCH v1 2/3] net/hyperv: implement core functionality
Date: Mon, 18 Dec 2017 10:34:12 -0800 [thread overview]
Message-ID: <20171218103412.342adcbc@xeon-e3> (raw)
In-Reply-To: <20171218162443.12971-3-adrien.mazarguil@6wind.com>
On Mon, 18 Dec 2017 17:46:23 +0100
Adrien Mazarguil <adrien.mazarguil@6wind.com> wrote:
>
> /**
> + * Destroy a hyperv context instance.
> + *
> + * @param ctx
> + * Context to destroy.
> + */
> +static void
> +hyperv_ctx_destroy(struct hyperv_ctx *ctx)
> +{
> + if (ctx->pipe[0] != -1)
> + close(ctx->pipe[0]);
> + if (ctx->pipe[1] != -1)
> + close(ctx->pipe[1]);
> + /* Poisoning for debugging purposes. */
> + memset(ctx, 0x22, sizeof(*ctx));
Don't leave debug code in submitted drivers
> + free(ctx);
> +}
> +
> +/**
> + * Iterate over system network interfaces.
> + *
> + * This function runs a given callback function for each netdevice found on
> + * the system.
> + *
> + * @param func
> + * Callback function pointer. List traversal is aborted when this function
> + * returns a nonzero value.
> + * @param ...
> + * Variable parameter list passed as @p va_list to @p func.
> + *
> + * @return
> + * 0 when the entire list is traversed successfully, a negative error code
> + * in case or failure, or the nonzero value returned by @p func when list
> + * traversal is aborted.
> + */
> +static int
> +hyperv_foreach_iface(int (*func)(const struct if_nameindex *iface,
> + const struct ether_addr *eth_addr,
> + va_list ap), ...)
> +{
> + struct if_nameindex *iface = if_nameindex();
> + int s = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP);
> + unsigned int i;
> + int ret = 0;
> +
> + if (!iface) {
> + ret = -ENOBUFS;
> + ERROR("cannot retrieve system network interfaces");
> + goto error;
> + }
> + if (s == -1) {
> + ret = -errno;
> + ERROR("cannot open socket: %s", rte_strerror(errno));
> + goto error;
> + }
> + for (i = 0; iface[i].if_name; ++i) {
> + struct ifreq req;
> + struct ether_addr eth_addr;
> + va_list ap;
> +
> + strncpy(req.ifr_name, iface[i].if_name, sizeof(req.ifr_name));
> + if (ioctl(s, SIOCGIFHWADDR, &req) == -1) {
> + WARN("cannot retrieve information about interface"
> + " \"%s\": %s",
> + req.ifr_name, rte_strerror(errno));
> + continue;
> + }
> + memcpy(eth_addr.addr_bytes, req.ifr_hwaddr.sa_data,
> + RTE_DIM(eth_addr.addr_bytes));
> + va_start(ap, func);
> + ret = func(&iface[i], ð_addr, ap);
> + va_end(ap);
> + if (ret)
> + break;
> + }
> +error:
> + if (s != -1)
> + close(s);
> + if (iface)
> + if_freenameindex(iface);
> + return ret;
> +}
> +
> +/**
> + * Determine if a network interface is NetVSC.
> + *
> + * @param[in] iface
> + * Pointer to netdevice description structure (name and index).
> + *
> + * @return
> + * A nonzero value when interface is detected as NetVSC. In case of error,
> + * rte_errno is updated and 0 returned.
> + */
> +static int
> +hyperv_iface_is_netvsc(const struct if_nameindex *iface)
> +{
> + static const char temp[] = "/sys/class/net/%s/device/class_id";
> + char path[snprintf(NULL, 0, temp, iface->if_name) + 1];
Doing this snprintf is gross. Either use PATH_MAX or asprintf
> + FILE *f;
> + int ret;
> + int len = 0;
> +
> + snprintf(path, sizeof(path), temp, iface->if_name);
> + f = fopen(path, "r");
> + if (!f) {
> + rte_errno = errno;
> + return 0;
> + }
> + ret = fscanf(f, NETVSC_CLASS_ID "%n", &len);
> + if (ret == EOF)
> + rte_errno = errno;
> + ret = len == (int)strlen(NETVSC_CLASS_ID);
> + fclose(f);
> + return ret;
> +}
> +
> +/**
> + * Retrieve the last component of a path.
> + *
> + * This is a simplified basename() that does not modify its input buffer to
> + * handle trailing backslashes.
> + *
> + * @param[in] path
> + * Path to retrieve the last component from.
> + *
> + * @return
> + * Pointer to the last component.
> + */
> +static const char *
> +hyperv_basename(const char *path)
> +{
> + const char *tmp = path;
> +
> + while (*tmp)
> + if (*(tmp++) == '/')
Too may ()
> + path = tmp;
> + return path;
> +}
> +
> +/**
> + * Retrieve network interface data from sysfs symbolic link.
> + *
> + * @param[out] buf
> + * Output data buffer.
> + * @param size
> + * Output buffer size.
> + * @param[in] if_name
> + * Netdevice name.
> + * @param[in] relpath
> + * Symbolic link path relative to netdevice sysfs entry.
> + *
> + * @return
> + * 0 on success, a negative error code otherwise.
> + */
> +static int
> +hyperv_sysfs_readlink(char *buf, size_t size, const char *if_name,
> + const char *relpath)
> +{
> + int ret;
> +
> + ret = snprintf(buf, size, "/sys/class/net/%s/%s", if_name, relpath);
> + if (ret == -1 || (size_t)ret >= size - 1)
> + return -ENOBUFS;
> + ret = readlink(buf, buf, size);
> + if (ret == -1)
> + return -errno;
> + if ((size_t)ret >= size - 1)
> + return -ENOBUFS;
> + buf[ret] = '\0';
> + return 0;
> +}
> +
> +/**
> + * Probe a network interface to associate with hyperv context.
> + *
> + * This function determines if the network device matches the properties of
> + * the NetVSC interface associated with the hyperv context and communicates
> + * its bus address to the fail-safe PMD instance if so.
> + *
> + * It is normally used with hyperv_foreach_iface().
> + *
> + * @param[in] iface
> + * Pointer to netdevice description structure (name and index).
> + * @param[in] eth_addr
> + * MAC address associated with @p iface.
> + * @param ap
> + * Variable arguments list comprising:
> + *
> + * - struct hyperv_ctx *ctx:
> + * Context to associate network interface with.
> + *
> + * @return
> + * A nonzero value when interface matches, 0 otherwise or in case of
> + * error.
> + */
> +static int
> +hyperv_device_probe(const struct if_nameindex *iface,
> + const struct ether_addr *eth_addr,
> + va_list ap)
> +{
> + struct hyperv_ctx *ctx = va_arg(ap, struct hyperv_ctx *);
> + char buf[RTE_MAX(sizeof(ctx->yield), 256u)];
> + const char *addr;
> + size_t len;
> + int ret;
> +
> + /* Skip non-matching or unwanted NetVSC interfaces. */
> + if (ctx->if_index == iface->if_index) {
> + if (!strcmp(ctx->if_name, iface->if_name))
> + return 0;
> + DEBUG("NetVSC interface \"%s\" (index %u) renamed \"%s\"",
> + ctx->if_name, ctx->if_index, iface->if_name);
> + strncpy(ctx->if_name, iface->if_name, sizeof(ctx->if_name));
> + return 0;
> + }
> + if (hyperv_iface_is_netvsc(iface))
> + return 0;
> + if (!is_same_ether_addr(eth_addr, &ctx->if_addr))
> + return 0;
> + /* Look for associated PCI device. */
> + ret = hyperv_sysfs_readlink(buf, sizeof(buf), iface->if_name,
> + "device/subsystem");
> + if (ret)
> + return 0;
> + if (strcmp(hyperv_basename(buf), "pci"))
> + return 0;
> + ret = hyperv_sysfs_readlink(buf, sizeof(buf), iface->if_name,
> + "device");
> + if (ret)
> + return 0;
> + addr = hyperv_basename(buf);
> + len = strlen(addr);
> + if (!len)
> + return 0;
> + /* Send PCI device argument to fail-safe PMD instance if updated. */
> + if (!strcmp(addr, ctx->yield))
> + return 1;
> + DEBUG("associating PCI device \"%s\" with NetVSC interface \"%s\""
> + " (index %u)",
> + addr, ctx->if_name, ctx->if_index);
> + memmove(buf, addr, len + 1);
> + addr = buf;
> + buf[len] = '\n';
> + ret = write(ctx->pipe[1], addr, len + 1);
> + buf[len] = '\0';
> + if (ret == -1) {
> + if (errno == EINTR || errno == EAGAIN)
> + return 1;
> + WARN("cannot associate PCI device name \"%s\" with interface"
> + " \"%s\": %s",
> + addr, ctx->if_name, rte_strerror(errno));
> + return 1;
> + }
> + if ((size_t)ret != len + 1) {
> + /*
> + * Attempt to override previous partial write, no need to
> + * recover if that fails.
> + */
> + ret = write(ctx->pipe[1], "\n", 1);
> + (void)ret;
> + return 1;
> + }
> + fsync(ctx->pipe[1]);
> + memcpy(ctx->yield, addr, len + 1);
> + return 1;
> +}
> +
> +/**
> + * Alarm callback that regularly probes system network interfaces.
> + *
> + * This callback runs at a frequency determined by HYPERV_PROBE_MS as long
> + * as an hyperv context instance exists.
> + *
> + * @param arg
> + * Ignored.
> + */
> +static void
> +hyperv_alarm(void *arg)
> +{
> + struct hyperv_ctx *ctx;
> + int ret;
> +
> + (void)arg;
I assume you are trying to suppress unused warnings.
The DPDK method of doing this __rte_unused
> + LIST_FOREACH(ctx, &hyperv_ctx_list, entry) {
> + ret = hyperv_foreach_iface(hyperv_device_probe, ctx);
> + if (ret)
> + break;
> + }
> + if (!hyperv_ctx_count)
> + return;
> + ret = rte_eal_alarm_set(HYPERV_PROBE_MS * 1000, hyperv_alarm, NULL);
> + if (ret < 0) {
> + ERROR("unable to reschedule alarm callback: %s",
> + rte_strerror(-ret));
> + }
> +}
> +
> +/**
> + * Probe a NetVSC interface to generate a hyperv context from.
> + *
> + * This function instantiates hyperv contexts either for all NetVSC devices
> + * found on the system or only a subset provided as device arguments.
> + *
> + * It is normally used with hyperv_foreach_iface().
> + *
> + * @param[in] iface
> + * Pointer to netdevice description structure (name and index).
> + * @param[in] eth_addr
> + * MAC address associated with @p iface.
> + * @param ap
> + * Variable arguments list comprising:
> + *
> + * - const char *name:
> + * Name associated with current driver instance.
> + *
> + * - struct rte_kvargs *kvargs:
> + * Device arguments provided to current driver instance.
> + *
> + * - unsigned int specified:
> + * Number of specific netdevices provided as device arguments.
> + *
> + * - unsigned int *matched:
> + * The number of specified netdevices matched by this function.
> + *
> + * @return
> + * A nonzero value when interface matches, 0 otherwise or in case of
> + * error.
> + */
> +static int
> +hyperv_netvsc_probe(const struct if_nameindex *iface,
> + const struct ether_addr *eth_addr,
> + va_list ap)
> +{
> + const char *name = va_arg(ap, const char *);
> + struct rte_kvargs *kvargs = va_arg(ap, struct rte_kvargs *);
> + unsigned int specified = va_arg(ap, unsigned int);
> + unsigned int *matched = va_arg(ap, unsigned int *);
> + unsigned int i;
> + struct hyperv_ctx *ctx;
> + uint16_t port_id;
> + int ret;
> +
> + /* Probe all interfaces when none are specified. */
> + if (specified) {
> + for (i = 0; i != kvargs->count; ++i) {
> + const struct rte_kvargs_pair *pair = &kvargs->pairs[i];
> +
> + if (!strcmp(pair->key, HYPERV_ARG_IFACE)) {
> + if (!strcmp(pair->value, iface->if_name))
> + break;
> + } else if (!strcmp(pair->key, HYPERV_ARG_MAC)) {
> + struct ether_addr tmp;
> +
> + if (ether_addr_from_str(&tmp, pair->value)) {
> + ERROR("invalid MAC address format"
> + " \"%s\"",
> + pair->value);
> + return -EINVAL;
> + }
> + if (!is_same_ether_addr(eth_addr, &tmp))
> + break;
> + }
> + }
> + if (i == kvargs->count)
> + return 0;
> + ++(*matched);
> + }
> + /* Weed out interfaces already handled. */
> + LIST_FOREACH(ctx, &hyperv_ctx_list, entry)
> + if (ctx->if_index == iface->if_index)
> + break;
> + if (ctx) {
> + if (!specified)
> + return 0;
> + WARN("interface \"%s\" (index %u) is already handled, skipping",
> + iface->if_name, iface->if_index);
> + return 0;
> + }
> + if (!hyperv_iface_is_netvsc(iface)) {
> + if (!specified)
> + return 0;
> + WARN("interface \"%s\" (index %u) is not NetVSC, skipping",
> + iface->if_name, iface->if_index);
> + return 0;
> + }
> + /* Create interface context. */
> + ctx = calloc(1, sizeof(*ctx));
> + if (!ctx) {
> + ret = -errno;
> + ERROR("cannot allocate context for interface \"%s\": %s",
> + iface->if_name, rte_strerror(errno));
> + goto error;
> + }
> + ctx->id = hyperv_ctx_count;
> + strncpy(ctx->if_name, iface->if_name, sizeof(ctx->if_name));
> + ctx->if_index = iface->if_index;
> + ctx->if_addr = *eth_addr;
> + ctx->pipe[0] = -1;
> + ctx->pipe[1] = -1;
> + ctx->yield[0] = '\0';
> + if (pipe(ctx->pipe) == -1) {
> + ret = -errno;
> + ERROR("cannot allocate control pipe for interface \"%s\": %s",
> + ctx->if_name, rte_strerror(errno));
> + goto error;
> + }
> + for (i = 0; i != RTE_DIM(ctx->pipe); ++i) {
> + int flf = fcntl(ctx->pipe[i], F_GETFL);
> + int fdf = fcntl(ctx->pipe[i], F_GETFD);
> +
> + if (flf != -1 &&
> + fcntl(ctx->pipe[i], F_SETFL, flf | O_NONBLOCK) != -1 &&
> + fdf != -1 &&
> + fcntl(ctx->pipe[i], F_SETFD,
> + i ? fdf | FD_CLOEXEC : fdf & ~FD_CLOEXEC) != -1)
> + continue;
> + ret = -errno;
> + ERROR("cannot toggle non-blocking or close-on-exec flags on"
> + " control file descriptor #%u (%d): %s",
> + i, ctx->pipe[i], rte_strerror(errno));
> + goto error;
> + }
> + /* Generate virtual device name and arguments. */
> + i = 0;
> + ret = snprintf(ctx->name, sizeof(ctx->name), "%s_id%u",
> + name, ctx->id);
> + if (ret == -1 || (size_t)ret >= sizeof(ctx->name) - 1)
> + ++i;
> + ret = snprintf(ctx->devname, sizeof(ctx->devname), "net_failsafe_%s",
> + ctx->name);
> + if (ret == -1 || (size_t)ret >= sizeof(ctx->devname) - 1)
> + ++i;
> + /*
> + * Note: bash replaces the default sh interpreter used by popen()
> + * because as seen with dash, POSIX-compliant shells do not
> + * necessarily support redirections with file descriptor numbers
> + * above 9.
> + */
> + ret = snprintf(ctx->devargs, sizeof(ctx->devargs),
> + "exec(exec bash -c "
> + "'while read -r tmp <&%u 2> /dev/null;"
> + " do dev=$tmp; done;"
> + " echo $dev"
> + "'),dev(net_tap_%s,remote=%s)",
> + ctx->pipe[0], ctx->name, ctx->if_name);
Write real code. Shelling out to bash is messy, error prone and potential
security issue.
> + if (ret == -1 || (size_t)ret >= sizeof(ctx->devargs) - 1)
> + ++i;
> + if (i) {
> + ret = -ENOBUFS;
> + ERROR("generated virtual device name or argument list too long"
> + " for interface \"%s\"", ctx->if_name);
> + goto error;
> + }
> + /*
> + * Remove any competing rte_eth_dev entries sharing the same MAC
> + * address, fail-safe instances created by this PMD will handle them
> + * as sub-devices later.
> + */
> + RTE_ETH_FOREACH_DEV(port_id) {
> + struct rte_device *dev = rte_eth_devices[port_id].device;
> + struct rte_bus *bus = rte_bus_find_by_device(dev);
> + struct ether_addr tmp;
> +
> + rte_eth_macaddr_get(port_id, &tmp);
> + if (!is_same_ether_addr(eth_addr, &tmp))
> + continue;
> + WARN("removing device \"%s\" with identical MAC address to"
> + " re-create it as a fail-safe sub-device",
> + dev->name);
> + if (!bus)
> + ret = -EINVAL;
> + else
> + ret = rte_eal_hotplug_remove(bus->name, dev->name);
> + if (ret < 0) {
> + ERROR("unable to remove device \"%s\": %s",
> + dev->name, rte_strerror(-ret));
> + goto error;
> + }
> + }
> + /* Request virtual device generation. */
> + DEBUG("generating virtual device \"%s\" with arguments \"%s\"",
> + ctx->devname, ctx->devargs);
> + ret = rte_eal_hotplug_add("vdev", ctx->devname, ctx->devargs);
> + if (ret)
> + goto error;
> + LIST_INSERT_HEAD(&hyperv_ctx_list, ctx, entry);
> + ++hyperv_ctx_count;
> + DEBUG("added NetVSC interface \"%s\" to context list", ctx->if_name);
> + return 0;
> +error:
> + if (ctx)
> + hyperv_ctx_destroy(ctx);
> + return ret;
> +}
> +
> +/**
> * Probe NetVSC interfaces.
> *
> + * This function probes system netdevices according to the specified device
> + * arguments and starts a periodic alarm callback to notify the resulting
> + * fail-safe PMD instances of their sub-devices whereabouts.
> + *
> * @param dev
> * Virtual device context for PMD instance.
> *
> @@ -92,12 +706,38 @@ hyperv_vdev_probe(struct rte_vdev_device *dev)
> const char *args = rte_vdev_device_args(dev);
> struct rte_kvargs *kvargs = rte_kvargs_parse(args ? args : "",
> hyperv_arg);
> + unsigned int specified = 0;
> + unsigned int matched = 0;
> + unsigned int i;
> + int ret;
>
> DEBUG("invoked as \"%s\", using arguments \"%s\"", name, args);
> if (!kvargs) {
> ERROR("cannot parse arguments list");
> goto error;
> }
> + for (i = 0; i != kvargs->count; ++i) {
> + const struct rte_kvargs_pair *pair = &kvargs->pairs[i];
> +
> + if (!strcmp(pair->key, HYPERV_ARG_IFACE) ||
> + !strcmp(pair->key, HYPERV_ARG_MAC))
> + ++specified;
> + }
> + rte_eal_alarm_cancel(hyperv_alarm, NULL);
> + /* Gather interfaces. */
> + ret = hyperv_foreach_iface(hyperv_netvsc_probe, name, kvargs,
> + specified, &matched);
> + if (ret < 0)
> + goto error;
> + if (matched < specified)
> + WARN("some of the specified parameters did not match valid"
> + " network interfaces");
> + ret = rte_eal_alarm_set(HYPERV_PROBE_MS * 1000, hyperv_alarm, NULL);
> + if (ret < 0) {
> + ERROR("unable to schedule alarm callback: %s",
> + rte_strerror(-ret));
> + goto error;
> + }
> error:
> if (kvargs)
> rte_kvargs_free(kvargs);
> @@ -108,6 +748,9 @@ hyperv_vdev_probe(struct rte_vdev_device *dev)
> /**
> * Remove PMD instance.
> *
> + * The alarm callback and underlying hyperv context instances are only
> + * destroyed after the last PMD instance is removed.
> + *
> * @param dev
> * Virtual device context for PMD instance.
> *
> @@ -118,7 +761,16 @@ static int
> hyperv_vdev_remove(struct rte_vdev_device *dev)
> {
> (void)dev;
> - --hyperv_ctx_inst;
> + if (--hyperv_ctx_inst)
> + return 0;
> + rte_eal_alarm_cancel(hyperv_alarm, NULL);
> + while (!LIST_EMPTY(&hyperv_ctx_list)) {
> + struct hyperv_ctx *ctx = LIST_FIRST(&hyperv_ctx_list);
> +
> + LIST_REMOVE(ctx, entry);
> + --hyperv_ctx_count;
> + hyperv_ctx_destroy(ctx);
> + }
> return 0;
> }
>
next prev parent reply other threads:[~2017-12-18 18:34 UTC|newest]
Thread overview: 112+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <20171124160801.GU4062@6wind.com>
[not found] ` <20171124164812.GV4062@6wind.com>
2017-11-24 17:21 ` [RFC] Introduce virtual PMD for Hyper-V/Azure platforms Adrien Mazarguil
2017-12-18 16:46 ` [PATCH v1 0/3] " Adrien Mazarguil
2017-12-18 16:46 ` [PATCH v1 1/3] net/hyperv: introduce MS Hyper-V platform driver Adrien Mazarguil
2017-12-18 18:28 ` Stephen Hemminger
2017-12-18 19:54 ` Thomas Monjalon
2017-12-18 21:17 ` Stephen Hemminger
2017-12-19 10:01 ` Adrien Mazarguil
2017-12-19 11:15 ` Thomas Monjalon
2017-12-19 13:13 ` Adrien Mazarguil
2017-12-18 16:46 ` [PATCH v1 2/3] net/hyperv: implement core functionality Adrien Mazarguil
2017-12-18 17:04 ` Wiles, Keith
2017-12-18 17:59 ` Adrien Mazarguil
2017-12-18 18:43 ` Wiles, Keith
2017-12-19 8:25 ` Nelio Laranjeiro
2017-12-18 18:26 ` Stephen Hemminger
2017-12-18 20:21 ` Adrien Mazarguil
2017-12-18 21:03 ` Thomas Monjalon
2017-12-18 21:19 ` Stephen Hemminger
2017-12-18 18:34 ` Stephen Hemminger [this message]
2017-12-18 20:23 ` Adrien Mazarguil
2017-12-19 9:53 ` Bruce Richardson
2017-12-19 10:15 ` Adrien Mazarguil
2017-12-19 15:31 ` Stephen Hemminger
2017-12-18 23:59 ` Stephen Hemminger
2017-12-19 10:01 ` Adrien Mazarguil
2017-12-19 15:37 ` Stephen Hemminger
2017-12-19 1:54 ` Ferruh Yigit
2017-12-19 15:06 ` Adrien Mazarguil
2017-12-19 20:44 ` Ferruh Yigit
2017-12-20 14:13 ` Thomas Monjalon
2017-12-21 16:19 ` Adrien Mazarguil
2017-12-18 16:46 ` [PATCH v1 3/3] net/hyperv: add "force" parameter Adrien Mazarguil
2017-12-18 18:23 ` [PATCH v1 0/3] Introduce virtual PMD for Hyper-V/Azure platforms Stephen Hemminger
2017-12-18 20:13 ` Thomas Monjalon
2017-12-19 0:40 ` Stephen Hemminger
2017-12-18 20:21 ` Adrien Mazarguil
2017-12-22 18:01 ` [PATCH v2 0/5] " Adrien Mazarguil
2017-12-22 18:01 ` [PATCH v2 1/5] net/failsafe: fix invalid free Adrien Mazarguil
2017-12-22 18:01 ` [PATCH v2 2/5] net/failsafe: add "fd" parameter Adrien Mazarguil
2017-12-22 18:01 ` [PATCH v2 3/5] net/vdev_netvsc: introduce Hyper-V platform driver Adrien Mazarguil
2017-12-22 18:01 ` [PATCH v2 4/5] net/vdev_netvsc: implement core functionality Adrien Mazarguil
2017-12-22 18:01 ` [PATCH v2 5/5] net/vdev_netvsc: add "force" parameter Adrien Mazarguil
2017-12-23 2:06 ` [PATCH v2 0/5] Introduce virtual PMD for Hyper-V/Azure platforms Stephen Hemminger
2017-12-23 14:28 ` Thomas Monjalon
2018-01-09 14:47 ` [PATCH v3 0/8] Introduce virtual driver " Matan Azrad
2018-01-09 14:47 ` [PATCH v3 1/8] net/failsafe: fix invalid free Matan Azrad
2018-01-16 10:24 ` Gaëtan Rivet
2018-01-09 14:47 ` [PATCH v3 2/8] net/failsafe: add "fd" parameter Matan Azrad
2018-01-16 10:54 ` Gaëtan Rivet
2018-01-16 11:19 ` Gaëtan Rivet
2018-01-16 16:17 ` Matan Azrad
2018-01-09 14:47 ` [PATCH v3 3/8] net/failsafe: support probed sub-devices getting Matan Azrad
2018-01-16 11:09 ` Gaëtan Rivet
2018-01-16 12:27 ` Matan Azrad
2018-01-16 14:40 ` Gaëtan Rivet
2018-01-16 16:15 ` Matan Azrad
2018-01-16 16:54 ` Gaëtan Rivet
2018-01-16 17:20 ` Matan Azrad
2018-01-16 22:31 ` Gaëtan Rivet
2018-01-17 8:40 ` Matan Azrad
2018-01-09 14:47 ` [PATCH v3 4/8] net/vdev_netvsc: introduce Hyper-V platform driver Matan Azrad
2018-01-09 14:47 ` [PATCH v3 5/8] net/vdev_netvsc: implement core functionality Matan Azrad
2018-01-09 18:49 ` Stephen Hemminger
2018-01-10 15:02 ` Matan Azrad
2018-01-17 16:51 ` Thomas Monjalon
2018-01-09 14:47 ` [PATCH v3 6/8] net/vdev_netvsc: skip routed netvsc probing Matan Azrad
2018-01-09 18:51 ` Stephen Hemminger
2018-01-10 15:07 ` Matan Azrad
2018-01-10 16:43 ` Stephen Hemminger
2018-01-11 9:00 ` Matan Azrad
2018-01-17 16:59 ` Thomas Monjalon
2018-01-09 14:47 ` [PATCH v3 7/8] net/vdev_netvsc: add "force" parameter Matan Azrad
2018-01-09 14:47 ` [PATCH v3 8/8] net/vdev_netvsc: add automatic probing Matan Azrad
2018-01-18 8:43 ` [PATCH v4 0/8] Introduce virtual driver for Hyper-V/Azure platforms Matan Azrad
2018-01-18 8:43 ` [PATCH v4 1/8] net/failsafe: fix invalid free Matan Azrad
2018-01-18 8:43 ` [PATCH v4 2/8] net/failsafe: add "fd" parameter Matan Azrad
2018-01-18 8:51 ` Gaëtan Rivet
2018-01-18 8:43 ` [PATCH v4 3/8] net/failsafe: add probed etherdev capture Matan Azrad
2018-01-18 9:10 ` Gaëtan Rivet
2018-01-18 9:33 ` Matan Azrad
2018-01-18 8:43 ` [PATCH v4 4/8] net/vdev_netvsc: introduce Hyper-V platform driver Matan Azrad
2018-01-18 8:43 ` [PATCH v4 5/8] net/vdev_netvsc: implement core functionality Matan Azrad
2018-01-18 18:25 ` Stephen Hemminger
2018-01-18 18:28 ` Matan Azrad
2018-01-18 8:43 ` [PATCH v4 6/8] net/vdev_netvsc: skip routed netvsc probing Matan Azrad
2018-01-18 18:26 ` Stephen Hemminger
2018-01-18 18:47 ` Thomas Monjalon
2018-01-18 8:43 ` [PATCH v4 7/8] net/vdev_netvsc: add "force" parameter Matan Azrad
2018-01-18 18:27 ` Stephen Hemminger
2018-01-18 18:30 ` Matan Azrad
2018-01-18 8:43 ` [PATCH v4 8/8] net/vdev_netvsc: add automatic probing Matan Azrad
2018-01-18 10:01 ` [PATCH v5 0/8] Introduce virtual driver for Hyper-V/Azure platforms Matan Azrad
2018-01-18 10:01 ` [PATCH v5 1/8] net/failsafe: fix invalid free Matan Azrad
2018-01-18 10:01 ` [PATCH v5 2/8] net/failsafe: add "fd" parameter Matan Azrad
2018-01-18 10:01 ` [PATCH v5 3/8] net/failsafe: add probed etherdev capture Matan Azrad
2018-01-18 10:08 ` Gaëtan Rivet
2018-01-18 10:01 ` [PATCH v5 4/8] net/vdev_netvsc: introduce Hyper-V platform driver Matan Azrad
2018-01-18 10:01 ` [PATCH v5 5/8] net/vdev_netvsc: implement core functionality Matan Azrad
2018-01-18 10:01 ` [PATCH v5 6/8] net/vdev_netvsc: skip routed netvsc probing Matan Azrad
2018-01-18 10:01 ` [PATCH v5 7/8] net/vdev_netvsc: add "force" parameter Matan Azrad
2018-01-18 10:01 ` [PATCH v5 8/8] net/vdev_netvsc: add automatic probing Matan Azrad
2018-01-18 13:51 ` [PATCH v6 0/8] Introduce virtual driver for Hyper-V/Azure platforms Matan Azrad
2018-01-18 13:51 ` [PATCH v6 1/8] net/failsafe: fix invalid free Matan Azrad
2018-01-18 13:51 ` [PATCH v6 2/8] net/failsafe: add "fd" parameter Matan Azrad
2018-01-18 13:51 ` [PATCH v6 3/8] net/failsafe: add probed etherdev capture Matan Azrad
2018-01-18 22:34 ` Thomas Monjalon
2018-01-18 13:51 ` [PATCH v6 4/8] net/vdev_netvsc: introduce Hyper-V platform driver Matan Azrad
2018-01-18 13:51 ` [PATCH v6 5/8] net/vdev_netvsc: implement core functionality Matan Azrad
2018-01-18 13:51 ` [PATCH v6 6/8] net/vdev_netvsc: skip routed netvsc probing Matan Azrad
2018-01-18 13:51 ` [PATCH v6 7/8] net/vdev_netvsc: add "force" parameter Matan Azrad
2018-01-18 13:51 ` [PATCH v6 8/8] net/vdev_netvsc: add automatic probing Matan Azrad
2018-01-20 1:15 ` [PATCH v6 0/8] Introduce virtual driver for Hyper-V/Azure platforms Ferruh Yigit
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171218103412.342adcbc@xeon-e3 \
--to=stephen@networkplumber.org \
--cc=adrien.mazarguil@6wind.com \
--cc=dev@dpdk.org \
--cc=ferruh.yigit@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.