X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=lib%2Fnetdev.c;h=4ec1d7d0d8ca428c7ca0328fd32d2d34efad4092;hb=8a9562d21a40c765a8ae6775a070cb279cb2147a;hp=91c9ea5559a40e44e55d1bd2bf4e8b290c9d3fa3;hpb=e4cfed38b159aba1ef44ed4a7b1f3e982b7358d4;p=sliver-openvswitch.git diff --git a/lib/netdev.c b/lib/netdev.c index 91c9ea555..4ec1d7d0d 100644 --- a/lib/netdev.c +++ b/lib/netdev.c @@ -31,6 +31,7 @@ #include "fatal-signal.h" #include "hash.h" #include "list.h" +#include "netdev-dpdk.h" #include "netdev-provider.h" #include "netdev-vport.h" #include "ofpbuf.h" @@ -90,6 +91,12 @@ static struct vlog_rate_limit rl = VLOG_RATE_LIMIT_INIT(5, 20); static void restore_all_flags(void *aux OVS_UNUSED); void update_device_args(struct netdev *, const struct shash *args); +int +netdev_n_rxq(const struct netdev *netdev) +{ + return netdev->n_rxq; +} + bool netdev_is_pmd(const struct netdev *netdev) { @@ -118,6 +125,7 @@ netdev_initialize(void) netdev_register_provider(&netdev_tap_class); netdev_register_provider(&netdev_bsd_class); #endif + netdev_dpdk_register(); ovsthread_once_done(&once); } @@ -333,6 +341,13 @@ netdev_open(const char *name, const char *type, struct netdev **netdevp) netdev->netdev_class = rc->class; netdev->name = xstrdup(name); netdev->node = shash_add(&netdev_shash, name, netdev); + + /* By default enable one rx queue per netdev. */ + if (netdev->netdev_class->rxq_alloc) { + netdev->n_rxq = 1; + } else { + netdev->n_rxq = 0; + } list_init(&netdev->saved_flags_list); error = rc->class->construct(netdev); @@ -506,24 +521,25 @@ netdev_parse_name(const char *netdev_name_, char **name, char **type) } } -/* Attempts to open a netdev_rx handle for obtaining packets received on - * 'netdev'. On success, returns 0 and stores a nonnull 'netdev_rx *' into +/* Attempts to open a netdev_rxq handle for obtaining packets received on + * 'netdev'. On success, returns 0 and stores a nonnull 'netdev_rxq *' into * '*rxp'. On failure, returns a positive errno value and stores NULL into * '*rxp'. * * Some kinds of network devices might not support receiving packets. This * function returns EOPNOTSUPP in that case.*/ int -netdev_rx_open(struct netdev *netdev, struct netdev_rx **rxp) +netdev_rxq_open(struct netdev *netdev, struct netdev_rxq **rxp, int id) OVS_EXCLUDED(netdev_mutex) { int error; - if (netdev->netdev_class->rx_alloc) { - struct netdev_rx *rx = netdev->netdev_class->rx_alloc(); + if (netdev->netdev_class->rxq_alloc && id < netdev->n_rxq) { + struct netdev_rxq *rx = netdev->netdev_class->rxq_alloc(); if (rx) { rx->netdev = netdev; - error = netdev->netdev_class->rx_construct(rx); + rx->queue_id = id; + error = netdev->netdev_class->rxq_construct(rx); if (!error) { ovs_mutex_lock(&netdev_mutex); netdev->ref_cnt++; @@ -532,7 +548,7 @@ netdev_rx_open(struct netdev *netdev, struct netdev_rx **rxp) *rxp = rx; return 0; } - netdev->netdev_class->rx_dealloc(rx); + netdev->netdev_class->rxq_dealloc(rx); } else { error = ENOMEM; } @@ -546,13 +562,13 @@ netdev_rx_open(struct netdev *netdev, struct netdev_rx **rxp) /* Closes 'rx'. */ void -netdev_rx_close(struct netdev_rx *rx) +netdev_rxq_close(struct netdev_rxq *rx) OVS_EXCLUDED(netdev_mutex) { if (rx) { struct netdev *netdev = rx->netdev; - netdev->netdev_class->rx_destruct(rx); - netdev->netdev_class->rx_dealloc(rx); + netdev->netdev_class->rxq_destruct(rx); + netdev->netdev_class->rxq_dealloc(rx); netdev_close(netdev); } } @@ -572,11 +588,11 @@ netdev_rx_close(struct netdev_rx *rx) * This function may be set to null if it would always return EOPNOTSUPP * anyhow. */ int -netdev_rx_recv(struct netdev_rx *rx, struct ofpbuf **buffers, int *cnt) +netdev_rxq_recv(struct netdev_rxq *rx, struct ofpbuf **buffers, int *cnt) { int retval; - retval = rx->netdev->netdev_class->rx_recv(rx, buffers, cnt); + retval = rx->netdev->netdev_class->rxq_recv(rx, buffers, cnt); if (!retval) { COVERAGE_INC(netdev_received); } @@ -586,17 +602,17 @@ netdev_rx_recv(struct netdev_rx *rx, struct ofpbuf **buffers, int *cnt) /* Arranges for poll_block() to wake up when a packet is ready to be received * on 'rx'. */ void -netdev_rx_wait(struct netdev_rx *rx) +netdev_rxq_wait(struct netdev_rxq *rx) { - rx->netdev->netdev_class->rx_wait(rx); + rx->netdev->netdev_class->rxq_wait(rx); } /* Discards any packets ready to be received on 'rx'. */ int -netdev_rx_drain(struct netdev_rx *rx) +netdev_rxq_drain(struct netdev_rxq *rx) { - return (rx->netdev->netdev_class->rx_drain - ? rx->netdev->netdev_class->rx_drain(rx) + return (rx->netdev->netdev_class->rxq_drain + ? rx->netdev->netdev_class->rxq_drain(rx) : 0); } @@ -1594,16 +1610,16 @@ netdev_get_type_from_name(const char *name) } struct netdev * -netdev_rx_get_netdev(const struct netdev_rx *rx) +netdev_rxq_get_netdev(const struct netdev_rxq *rx) { ovs_assert(rx->netdev->ref_cnt > 0); return rx->netdev; } const char * -netdev_rx_get_name(const struct netdev_rx *rx) +netdev_rxq_get_name(const struct netdev_rxq *rx) { - return netdev_get_name(netdev_rx_get_netdev(rx)); + return netdev_get_name(netdev_rxq_get_netdev(rx)); } static void