For some devices, queues are organized as pairs (rx/tx). In this case,
it is desirable that a worker receives packet and send packets for the
same pair. This patch enables this by assigning txq to workers first
and ending with main.
Change-Id: I3de4afbf74a265d5275c6a5d9a905b51dd661b22
Type: feature
Signed-off-by: Mohammed Hawari <[email protected]>
clib_memcpy (port->intf.name, args->intf_name, sizeof (port->intf.name));
port->intf.default_is_intr_mode = default_is_intr_mode;
+ port->intf.consistent_qp =
+ (args->flags.n & VNET_DEV_PORT_F_CONSISTENT_QP) != 0;
rv = vnet_dev_process_call_port_op (vm, port, vnet_dev_port_if_create);
args->sw_if_index = (rv == VNET_DEV_OK) ? port->intf.sw_if_index : ~0;
enumflag dev_port_flags : u32
{
VL_API_DEV_PORT_FLAG_INTERRUPT_MODE = 0x1,
+ VL_API_DEV_PORT_FLAG_CONSISTENT_QP = 0x2,
};
autoendian define dev_attach
u8 feature_arc : 1;
u8 redirect_to_node : 1;
u8 default_is_intr_mode : 1;
+ u8 consistent_qp : 1;
u32 tx_node_index;
u32 hw_if_index;
u32 sw_if_index;
#undef _
};
u64 flag_values[] = {
-#define _(b, n, d) 1ull << (b)
+#define _(b, n, d) 1ull << (b),
foreach_vnet_dev_port_flag
#undef _
};
#undef _
};
u64 flag_values[] = {
-#define _(b, n, d) 1ull << (b)
+#define _(b, n, d) 1ull << (b),
foreach_vnet_dev_port_flag
#undef _
};
vnet_dev_instance_t *di;
vnet_dev_rv_t rv;
u16 ti = 0;
+ u8 is_consistent_qp = port->intf.consistent_qp;
if (port->intf.name[0] == 0)
{
foreach_vnet_dev_port_tx_queue (q, port)
{
- q->assigned_threads = clib_bitmap_set (q->assigned_threads, ti, 1);
+ /* if consistent_qp is enabled, we start by assigning queues to workers
+ * and we end with main */
+ u16 real_ti = (ti + is_consistent_qp) % n_threads;
+ q->assigned_threads = clib_bitmap_set (q->assigned_threads, real_ti, 1);
log_debug (dev, "port %u tx queue %u assigned to thread %u",
- port->port_id, q->queue_id, ti);
+ port->port_id, q->queue_id, real_ti);
if (++ti >= n_threads)
break;
}
/* do not change bit assignments - API dependency */
#define foreach_vnet_dev_port_flag \
- _ (0, INTERRUPT_MODE, "enable interrupt mode")
+ _ (0, INTERRUPT_MODE, "enable interrupt mode") \
+ _ (1, CONSISTENT_QP, "consistent queue pairs")
typedef union
{