|
@@ -432,52 +432,24 @@ i40evf_map_vector_to_txq(struct i40evf_adapter *adapter, int v_idx, int t_idx)
|
|
|
**/
|
|
|
static int i40evf_map_rings_to_vectors(struct i40evf_adapter *adapter)
|
|
|
{
|
|
|
+ int rings_remaining = adapter->num_active_queues;
|
|
|
+ int ridx = 0, vidx = 0;
|
|
|
int q_vectors;
|
|
|
- int v_start = 0;
|
|
|
- int rxr_idx = 0, txr_idx = 0;
|
|
|
- int rxr_remaining = adapter->num_active_queues;
|
|
|
- int txr_remaining = adapter->num_active_queues;
|
|
|
- int i, j;
|
|
|
- int rqpv, tqpv;
|
|
|
int err = 0;
|
|
|
|
|
|
q_vectors = adapter->num_msix_vectors - NONQ_VECS;
|
|
|
|
|
|
- /* The ideal configuration...
|
|
|
- * We have enough vectors to map one per queue.
|
|
|
- */
|
|
|
- if (q_vectors >= (rxr_remaining * 2)) {
|
|
|
- for (; rxr_idx < rxr_remaining; v_start++, rxr_idx++)
|
|
|
- i40evf_map_vector_to_rxq(adapter, v_start, rxr_idx);
|
|
|
+ for (; ridx < rings_remaining; ridx++) {
|
|
|
+ i40evf_map_vector_to_rxq(adapter, vidx, ridx);
|
|
|
+ i40evf_map_vector_to_txq(adapter, vidx, ridx);
|
|
|
|
|
|
- for (; txr_idx < txr_remaining; v_start++, txr_idx++)
|
|
|
- i40evf_map_vector_to_txq(adapter, v_start, txr_idx);
|
|
|
- goto out;
|
|
|
- }
|
|
|
-
|
|
|
- /* If we don't have enough vectors for a 1-to-1
|
|
|
- * mapping, we'll have to group them so there are
|
|
|
- * multiple queues per vector.
|
|
|
- * Re-adjusting *qpv takes care of the remainder.
|
|
|
- */
|
|
|
- for (i = v_start; i < q_vectors; i++) {
|
|
|
- rqpv = DIV_ROUND_UP(rxr_remaining, q_vectors - i);
|
|
|
- for (j = 0; j < rqpv; j++) {
|
|
|
- i40evf_map_vector_to_rxq(adapter, i, rxr_idx);
|
|
|
- rxr_idx++;
|
|
|
- rxr_remaining--;
|
|
|
- }
|
|
|
- }
|
|
|
- for (i = v_start; i < q_vectors; i++) {
|
|
|
- tqpv = DIV_ROUND_UP(txr_remaining, q_vectors - i);
|
|
|
- for (j = 0; j < tqpv; j++) {
|
|
|
- i40evf_map_vector_to_txq(adapter, i, txr_idx);
|
|
|
- txr_idx++;
|
|
|
- txr_remaining--;
|
|
|
- }
|
|
|
+ /* In the case where we have more queues than vectors, continue
|
|
|
+ * round-robin on vectors until all queues are mapped.
|
|
|
+ */
|
|
|
+ if (++vidx >= q_vectors)
|
|
|
+ vidx = 0;
|
|
|
}
|
|
|
|
|
|
-out:
|
|
|
adapter->aq_required |= I40EVF_FLAG_AQ_MAP_VECTORS;
|
|
|
|
|
|
return err;
|