diff options
-rw-r--r-- | src/plugins/avf/avf.h | 3 | ||||
-rw-r--r-- | src/plugins/avf/device.c | 50 | ||||
-rw-r--r-- | src/plugins/avf/format.c | 12 |
3 files changed, 52 insertions, 13 deletions
diff --git a/src/plugins/avf/avf.h b/src/plugins/avf/avf.h index 43741dcad83..32d9cc61015 100644 --- a/src/plugins/avf/avf.h +++ b/src/plugins/avf/avf.h @@ -22,6 +22,9 @@ #include <vlib/log.h> +#define AVF_QUEUE_SZ_MAX 4096 +#define AVF_QUEUE_SZ_MIN 64 + #define AVF_AQ_ENQ_SUSPEND_TIME 50e-6 #define AVF_AQ_ENQ_MAX_WAIT_TIME 250e-3 diff --git a/src/plugins/avf/device.c b/src/plugins/avf/device.c index 0481e61b294..d7115044c05 100644 --- a/src/plugins/avf/device.c +++ b/src/plugins/avf/device.c @@ -1418,28 +1418,56 @@ avf_delete_if (vlib_main_t * vm, avf_device_t * ad, int with_barrier) clib_mem_free (ad); } -void -avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) +static u8 +avf_validate_queue_size (avf_create_if_args_t * args) { - vnet_main_t *vnm = vnet_get_main (); - avf_main_t *am = &avf_main; - avf_device_t *ad, **adp; - vlib_pci_dev_handle_t h; clib_error_t *error = 0; - int i; - /* check input args */ args->rxq_size = (args->rxq_size == 0) ? AVF_RXQ_SZ : args->rxq_size; args->txq_size = (args->txq_size == 0) ? AVF_TXQ_SZ : args->txq_size; - if ((args->rxq_size & (args->rxq_size - 1)) - || (args->txq_size & (args->txq_size - 1))) + if ((args->rxq_size > AVF_QUEUE_SZ_MAX) + || (args->txq_size > AVF_QUEUE_SZ_MAX)) + { + args->rv = VNET_API_ERROR_INVALID_VALUE; + args->error = + clib_error_return (error, "queue size must not be greater than %u", + AVF_QUEUE_SZ_MAX); + return 1; + } + if ((args->rxq_size < AVF_QUEUE_SZ_MIN) + || (args->txq_size < AVF_QUEUE_SZ_MIN)) + { + args->rv = VNET_API_ERROR_INVALID_VALUE; + args->error = + clib_error_return (error, "queue size must not be smaller than %u", + AVF_QUEUE_SZ_MIN); + return 1; + } + if ((args->rxq_size & (args->rxq_size - 1)) || + (args->txq_size & (args->txq_size - 1))) { args->rv = VNET_API_ERROR_INVALID_VALUE; args->error = clib_error_return (error, "queue size must be a power of two"); - return; + return 1; } + return 0; +} + +void +avf_create_if (vlib_main_t * vm, avf_create_if_args_t * args) +{ + vnet_main_t *vnm = vnet_get_main (); + avf_main_t *am = &avf_main; + avf_device_t *ad, **adp; + vlib_pci_dev_handle_t h; + clib_error_t *error = 0; + int i; + + /* check input args */ + if (avf_validate_queue_size (args) != 0) + return; pool_get (am->devices, adp); adp[0] = ad = clib_mem_alloc_aligned (sizeof (avf_device_t), diff --git a/src/plugins/avf/format.c b/src/plugins/avf/format.c index e5da0e2bbf6..2c4eaf79041 100644 --- a/src/plugins/avf/format.c +++ b/src/plugins/avf/format.c @@ -90,8 +90,16 @@ format_avf_device (u8 * s, va_list * args) avf_device_t *ad = avf_get_device (i); u32 indent = format_get_indent (s); u8 *a = 0; - - s = format (s, "flags: %U", format_avf_device_flags, ad); + avf_rxq_t *rxq = vec_elt_at_index (ad->rxqs, 0); + avf_txq_t *txq = vec_elt_at_index (ad->txqs, 0); + + s = format (s, "rx: queues %u, desc %u (min %u max %u)", ad->n_rx_queues, + rxq->size, AVF_QUEUE_SZ_MIN, AVF_QUEUE_SZ_MAX); + s = format (s, "\n%Utx: queues %u, desc %u (min %u max %u)", + format_white_space, indent, ad->n_tx_queues, txq->size, + AVF_QUEUE_SZ_MIN, AVF_QUEUE_SZ_MAX); + s = format (s, "\n%Uflags: %U", format_white_space, indent, + format_avf_device_flags, ad); s = format (s, "\n%Uoffload features: %U", format_white_space, indent, format_avf_vf_cap_flags, ad->feature_bitmap); |