[PATCH v1 02/18] ibmveth: Prepare adapter data structures for MQ RX
From: Mingming Cao <hidden>
Date: 2026-06-30 14:54:02
Also in:
netdev
Subsystem:
ibm power virtual ethernet device driver, linux for powerpc (32-bit and 64-bit), networking drivers, the rest · Maintainers:
Nick Child, Madhavan Srinivasan, Michael Ellerman, Andrew Lunn, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
MQ RX needs per-queue state for NAPI, queue handles/IRQs, RX rings, buffer-list DMA mappings, and buffer pools. The current driver stores most of this as single instances tied to queue 0. Convert those fields to queue-indexed layouts sized by IBMVETH_MAX_RX_QUEUES: rx_queue[] napi[] queue_handle[] / queue_irq[] buffer_list_addr[] / buffer_list_dma[] rx_buff_pool[queue][pool] and add num_rx_queues to track how many RX queues are active. This patch keeps behavior unchanged by mechanically switching existing references to index 0 — e.g. rx_queue[0], rx_buff_pool[0][pool], and napi[0]. open/poll/close still drive a single RX queue only. The goal is to make later helper and datapath patches queue-aware without mixing structural churn and behavior changes in one commit. Signed-off-by: Mingming Cao <redacted> Reviewed-by: Dave Marquardt <redacted> --- drivers/net/ethernet/ibm/ibmveth.c | 195 +++++++++++++++-------------- drivers/net/ethernet/ibm/ibmveth.h | 16 ++- 2 files changed, 112 insertions(+), 99 deletions(-)
diff --git a/drivers/net/ethernet/ibm/ibmveth.c b/drivers/net/ethernet/ibm/ibmveth.c
index af287eeafc0c..4f9dbee7477d 100644
--- a/drivers/net/ethernet/ibm/ibmveth.c
+++ b/drivers/net/ethernet/ibm/ibmveth.c@@ -101,7 +101,7 @@ static struct ibmveth_stat ibmveth_stats[] = { /* simple methods of getting data from the current rxq entry */ static inline u32 ibmveth_rxq_flags(struct ibmveth_adapter *adapter) { - return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].flags_off); + return be32_to_cpu(adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].flags_off); } static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter)
@@ -112,7 +112,7 @@ static inline int ibmveth_rxq_toggle(struct ibmveth_adapter *adapter) static inline int ibmveth_rxq_pending_buffer(struct ibmveth_adapter *adapter) { - return ibmveth_rxq_toggle(adapter) == adapter->rx_queue.toggle; + return ibmveth_rxq_toggle(adapter) == adapter->rx_queue[0].toggle; } static inline int ibmveth_rxq_buffer_valid(struct ibmveth_adapter *adapter)
@@ -132,7 +132,7 @@ static inline int ibmveth_rxq_large_packet(struct ibmveth_adapter *adapter) static inline int ibmveth_rxq_frame_length(struct ibmveth_adapter *adapter) { - return be32_to_cpu(adapter->rx_queue.queue_addr[adapter->rx_queue.index].length); + return be32_to_cpu(adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].length); } static inline int ibmveth_rxq_csum_good(struct ibmveth_adapter *adapter)
@@ -386,7 +386,7 @@ static void ibmveth_replenish_buffer_pool(struct ibmveth_adapter *adapter, */ static void ibmveth_update_rx_no_buffer(struct ibmveth_adapter *adapter) { - __be64 *p = adapter->buffer_list_addr + 4096 - 8; + __be64 *p = adapter->buffer_list_addr[0] + 4096 - 8; adapter->rx_no_buffer = be64_to_cpup(p); }
@@ -399,7 +399,7 @@ static void ibmveth_replenish_task(struct ibmveth_adapter *adapter) adapter->replenish_task_cycles++; for (i = (IBMVETH_NUM_BUFF_POOLS - 1); i >= 0; i--) { - struct ibmveth_buff_pool *pool = &adapter->rx_buff_pool[i]; + struct ibmveth_buff_pool *pool = &adapter->rx_buff_pool[0][i]; if (pool->active && (atomic_read(&pool->available) < pool->threshold))
@@ -463,12 +463,12 @@ static int ibmveth_remove_buffer_from_pool(struct ibmveth_adapter *adapter, struct sk_buff *skb; if (WARN_ON(pool >= IBMVETH_NUM_BUFF_POOLS) || - WARN_ON(index >= adapter->rx_buff_pool[pool].size)) { + WARN_ON(index >= adapter->rx_buff_pool[0][pool].size)) { schedule_work(&adapter->work); return -EINVAL; } - skb = adapter->rx_buff_pool[pool].skbuff[index]; + skb = adapter->rx_buff_pool[0][pool].skbuff[index]; if (WARN_ON(!skb)) { schedule_work(&adapter->work); return -EFAULT;
@@ -482,24 +482,24 @@ static int ibmveth_remove_buffer_from_pool(struct ibmveth_adapter *adapter, /* remove the skb pointer to mark free. actual freeing is done * by upper level networking after gro_receive */ - adapter->rx_buff_pool[pool].skbuff[index] = NULL; + adapter->rx_buff_pool[0][pool].skbuff[index] = NULL; dma_unmap_single(&adapter->vdev->dev, - adapter->rx_buff_pool[pool].dma_addr[index], - adapter->rx_buff_pool[pool].buff_size, + adapter->rx_buff_pool[0][pool].dma_addr[index], + adapter->rx_buff_pool[0][pool].buff_size, DMA_FROM_DEVICE); } - free_index = adapter->rx_buff_pool[pool].producer_index; - adapter->rx_buff_pool[pool].producer_index++; - if (adapter->rx_buff_pool[pool].producer_index >= - adapter->rx_buff_pool[pool].size) - adapter->rx_buff_pool[pool].producer_index = 0; - adapter->rx_buff_pool[pool].free_map[free_index] = index; + free_index = adapter->rx_buff_pool[0][pool].producer_index; + adapter->rx_buff_pool[0][pool].producer_index++; + if (adapter->rx_buff_pool[0][pool].producer_index >= + adapter->rx_buff_pool[0][pool].size) + adapter->rx_buff_pool[0][pool].producer_index = 0; + adapter->rx_buff_pool[0][pool].free_map[free_index] = index; mb(); - atomic_dec(&(adapter->rx_buff_pool[pool].available)); + atomic_dec(&adapter->rx_buff_pool[0][pool].available); return 0; }
@@ -507,17 +507,17 @@ static int ibmveth_remove_buffer_from_pool(struct ibmveth_adapter *adapter, /* get the current buffer on the rx queue */ static inline struct sk_buff *ibmveth_rxq_get_buffer(struct ibmveth_adapter *adapter) { - u64 correlator = adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator; + u64 correlator = adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].correlator; unsigned int pool = correlator >> 32; unsigned int index = correlator & 0xffffffffUL; if (WARN_ON(pool >= IBMVETH_NUM_BUFF_POOLS) || - WARN_ON(index >= adapter->rx_buff_pool[pool].size)) { + WARN_ON(index >= adapter->rx_buff_pool[0][pool].size)) { schedule_work(&adapter->work); return NULL; } - return adapter->rx_buff_pool[pool].skbuff[index]; + return adapter->rx_buff_pool[0][pool].skbuff[index]; } /**
@@ -538,14 +538,14 @@ static int ibmveth_rxq_harvest_buffer(struct ibmveth_adapter *adapter, u64 cor; int rc; - cor = adapter->rx_queue.queue_addr[adapter->rx_queue.index].correlator; + cor = adapter->rx_queue[0].queue_addr[adapter->rx_queue[0].index].correlator; rc = ibmveth_remove_buffer_from_pool(adapter, cor, reuse); if (unlikely(rc)) return rc; - if (++adapter->rx_queue.index == adapter->rx_queue.num_slots) { - adapter->rx_queue.index = 0; - adapter->rx_queue.toggle = !adapter->rx_queue.toggle; + if (++adapter->rx_queue[0].index == adapter->rx_queue[0].num_slots) { + adapter->rx_queue[0].index = 0; + adapter->rx_queue[0].toggle = !adapter->rx_queue[0].toggle; } return 0;
@@ -596,7 +596,7 @@ static int ibmveth_register_logical_lan(struct ibmveth_adapter *adapter, */ retry: rc = h_register_logical_lan(adapter->vdev->unit_address, - adapter->buffer_list_dma, rxq_desc.desc, + adapter->buffer_list_dma[0], rxq_desc.desc, adapter->filter_list_dma, mac_address); if (rc != H_SUCCESS && try_again) {
@@ -624,14 +624,14 @@ static int ibmveth_open(struct net_device *netdev) netdev_dbg(netdev, "open starting\n"); - napi_enable(&adapter->napi); + napi_enable(&adapter->napi[0]); for(i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) - rxq_entries += adapter->rx_buff_pool[i].size; + rxq_entries += adapter->rx_buff_pool[0][i].size; rc = -ENOMEM; - adapter->buffer_list_addr = (void*) get_zeroed_page(GFP_KERNEL); - if (!adapter->buffer_list_addr) { + adapter->buffer_list_addr[0] = (void *)get_zeroed_page(GFP_KERNEL); + if (!adapter->buffer_list_addr[0]) { netdev_err(netdev, "unable to allocate list pages\n"); goto out; }
@@ -644,17 +644,18 @@ static int ibmveth_open(struct net_device *netdev) dev = &adapter->vdev->dev; - adapter->rx_queue.queue_len = sizeof(struct ibmveth_rx_q_entry) * + adapter->rx_queue[0].queue_len = sizeof(struct ibmveth_rx_q_entry) * rxq_entries; - adapter->rx_queue.queue_addr = - dma_alloc_coherent(dev, adapter->rx_queue.queue_len, - &adapter->rx_queue.queue_dma, GFP_KERNEL); - if (!adapter->rx_queue.queue_addr) + adapter->rx_queue[0].queue_addr = + dma_alloc_coherent(dev, adapter->rx_queue[0].queue_len, + &adapter->rx_queue[0].queue_dma, GFP_KERNEL); + if (!adapter->rx_queue[0].queue_addr) goto out_free_filter_list; - adapter->buffer_list_dma = dma_map_single(dev, - adapter->buffer_list_addr, 4096, DMA_BIDIRECTIONAL); - if (dma_mapping_error(dev, adapter->buffer_list_dma)) { + adapter->buffer_list_dma[0] = dma_map_single(dev, + adapter->buffer_list_addr[0], + 4096, DMA_BIDIRECTIONAL); + if (dma_mapping_error(dev, adapter->buffer_list_dma[0])) { netdev_err(netdev, "unable to map buffer list pages\n"); goto out_free_queue_mem; }
@@ -671,19 +672,19 @@ static int ibmveth_open(struct net_device *netdev) goto out_free_tx_ltb; } - adapter->rx_queue.index = 0; - adapter->rx_queue.num_slots = rxq_entries; - adapter->rx_queue.toggle = 1; + adapter->rx_queue[0].index = 0; + adapter->rx_queue[0].num_slots = rxq_entries; + adapter->rx_queue[0].toggle = 1; mac_address = ether_addr_to_u64(netdev->dev_addr); rxq_desc.fields.flags_len = IBMVETH_BUF_VALID | - adapter->rx_queue.queue_len; - rxq_desc.fields.address = adapter->rx_queue.queue_dma; + adapter->rx_queue[0].queue_len; + rxq_desc.fields.address = adapter->rx_queue[0].queue_dma; - netdev_dbg(netdev, "buffer list @ 0x%p\n", adapter->buffer_list_addr); + netdev_dbg(netdev, "buffer list @ 0x%p\n", adapter->buffer_list_addr[0]); netdev_dbg(netdev, "filter list @ 0x%p\n", adapter->filter_list_addr); - netdev_dbg(netdev, "receive q @ 0x%p\n", adapter->rx_queue.queue_addr); + netdev_dbg(netdev, "receive q @ 0x%p\n", adapter->rx_queue[0].queue_addr); h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE);
@@ -694,7 +695,7 @@ static int ibmveth_open(struct net_device *netdev) lpar_rc); netdev_err(netdev, "buffer TCE:0x%llx filter TCE:0x%llx rxq " "desc:0x%llx MAC:0x%llx\n", - adapter->buffer_list_dma, + adapter->buffer_list_dma[0], adapter->filter_list_dma, rxq_desc.desc, mac_address);
@@ -703,11 +704,11 @@ static int ibmveth_open(struct net_device *netdev) } for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { - if (!adapter->rx_buff_pool[i].active) + if (!adapter->rx_buff_pool[0][i].active) continue; - if (ibmveth_alloc_buffer_pool(&adapter->rx_buff_pool[i])) { + if (ibmveth_alloc_buffer_pool(&adapter->rx_buff_pool[0][i])) { netdev_err(netdev, "unable to alloc pool\n"); - adapter->rx_buff_pool[i].active = 0; + adapter->rx_buff_pool[0][i].active = 0; rc = -ENOMEM; goto out_free_buffer_pools; }
@@ -739,9 +740,9 @@ static int ibmveth_open(struct net_device *netdev) out_free_buffer_pools: while (--i >= 0) { - if (adapter->rx_buff_pool[i].active) + if (adapter->rx_buff_pool[0][i].active) ibmveth_free_buffer_pool(adapter, - &adapter->rx_buff_pool[i]); + &adapter->rx_buff_pool[0][i]); } out_unmap_filter_list: dma_unmap_single(dev, adapter->filter_list_dma, 4096,
@@ -753,18 +754,18 @@ static int ibmveth_open(struct net_device *netdev) } out_unmap_buffer_list: - dma_unmap_single(dev, adapter->buffer_list_dma, 4096, + dma_unmap_single(dev, adapter->buffer_list_dma[0], 4096, DMA_BIDIRECTIONAL); out_free_queue_mem: - dma_free_coherent(dev, adapter->rx_queue.queue_len, - adapter->rx_queue.queue_addr, - adapter->rx_queue.queue_dma); + dma_free_coherent(dev, adapter->rx_queue[0].queue_len, + adapter->rx_queue[0].queue_addr, + adapter->rx_queue[0].queue_dma); out_free_filter_list: free_page((unsigned long)adapter->filter_list_addr); out_free_buffer_list: - free_page((unsigned long)adapter->buffer_list_addr); + free_page((unsigned long)adapter->buffer_list_addr[0]); out: - napi_disable(&adapter->napi); + napi_disable(&adapter->napi[0]); return rc; }
@@ -777,7 +778,7 @@ static int ibmveth_close(struct net_device *netdev) netdev_dbg(netdev, "close starting\n"); - napi_disable(&adapter->napi); + napi_disable(&adapter->napi[0]); netif_tx_stop_all_queues(netdev);
@@ -796,22 +797,22 @@ static int ibmveth_close(struct net_device *netdev) ibmveth_update_rx_no_buffer(adapter); - dma_unmap_single(dev, adapter->buffer_list_dma, 4096, + dma_unmap_single(dev, adapter->buffer_list_dma[0], 4096, DMA_BIDIRECTIONAL); - free_page((unsigned long)adapter->buffer_list_addr); + free_page((unsigned long)adapter->buffer_list_addr[0]); dma_unmap_single(dev, adapter->filter_list_dma, 4096, DMA_BIDIRECTIONAL); free_page((unsigned long)adapter->filter_list_addr); - dma_free_coherent(dev, adapter->rx_queue.queue_len, - adapter->rx_queue.queue_addr, - adapter->rx_queue.queue_dma); + dma_free_coherent(dev, adapter->rx_queue[0].queue_len, + adapter->rx_queue[0].queue_addr, + adapter->rx_queue[0].queue_dma); for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) - if (adapter->rx_buff_pool[i].active) + if (adapter->rx_buff_pool[0][i].active) ibmveth_free_buffer_pool(adapter, - &adapter->rx_buff_pool[i]); + &adapter->rx_buff_pool[0][i]); for (i = 0; i < netdev->real_num_tx_queues; i++) ibmveth_free_tx_ltb(adapter, i);
@@ -1449,7 +1450,7 @@ static void ibmveth_rx_csum_helper(struct sk_buff *skb, static int ibmveth_poll(struct napi_struct *napi, int budget) { struct ibmveth_adapter *adapter = - container_of(napi, struct ibmveth_adapter, napi); + container_of(napi, struct ibmveth_adapter, napi[0]); struct net_device *netdev = adapter->netdev; int frames_processed = 0; unsigned long lpar_rc;
@@ -1574,11 +1575,11 @@ static irqreturn_t ibmveth_interrupt(int irq, void *dev_instance) struct ibmveth_adapter *adapter = netdev_priv(netdev); unsigned long lpar_rc; - if (napi_schedule_prep(&adapter->napi)) { + if (napi_schedule_prep(&adapter->napi[0])) { lpar_rc = h_vio_signal(adapter->vdev->unit_address, VIO_IRQ_DISABLE); WARN_ON(lpar_rc != H_SUCCESS); - __napi_schedule(&adapter->napi); + __napi_schedule(&adapter->napi[0]); } return IRQ_HANDLED; }
@@ -1646,7 +1647,7 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu) int need_restart = 0; for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) - if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size) + if (new_mtu_oh <= adapter->rx_buff_pool[0][i].buff_size) break; if (i == IBMVETH_NUM_BUFF_POOLS)
@@ -1661,9 +1662,9 @@ static int ibmveth_change_mtu(struct net_device *dev, int new_mtu) /* Look for an active buffer pool that can hold the new MTU */ for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { - adapter->rx_buff_pool[i].active = 1; + adapter->rx_buff_pool[0][i].active = 1; - if (new_mtu_oh <= adapter->rx_buff_pool[i].buff_size) { + if (new_mtu_oh <= adapter->rx_buff_pool[0][i].buff_size) { WRITE_ONCE(dev->mtu, new_mtu); vio_cmo_set_dev_desired(viodev, ibmveth_get_desired_dma
@@ -1721,12 +1722,12 @@ static unsigned long ibmveth_get_desired_dma(struct vio_dev *vdev) for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { /* add the size of the active receive buffers */ - if (adapter->rx_buff_pool[i].active) + if (adapter->rx_buff_pool[0][i].active) ret += - adapter->rx_buff_pool[i].size * - IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[i]. + adapter->rx_buff_pool[0][i].size * + IOMMU_PAGE_ALIGN(adapter->rx_buff_pool[0][i]. buff_size, tbl); - rxqentries += adapter->rx_buff_pool[i].size; + rxqentries += adapter->rx_buff_pool[0][i].size; } /* add the size of the receive queue entries */ ret += IOMMU_PAGE_ALIGN(
@@ -1845,7 +1846,7 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) adapter->mcastFilterSize = be32_to_cpu(*mcastFilterSize_p); ibmveth_init_link_settings(netdev); - netif_napi_add_weight(netdev, &adapter->napi, ibmveth_poll, 16); + netif_napi_add_weight(netdev, &adapter->napi[0], ibmveth_poll, 16); netdev->irq = dev->irq; netdev->netdev_ops = &ibmveth_netdev_ops;
@@ -1877,6 +1878,10 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) netdev->features |= NETIF_F_FRAGLIST; } + /* Initialize queue count - always 1 for now */ + adapter->multi_queue = 0; + adapter->num_rx_queues = 1; + if (ret == H_SUCCESS && (ret_attr & IBMVETH_ILLAN_RX_MULTI_BUFF_SUPPORT)) { adapter->rx_buffers_per_hcall = IBMVETH_MAX_RX_PER_HCALL;
@@ -1899,10 +1904,10 @@ static int ibmveth_probe(struct vio_dev *dev, const struct vio_device_id *id) memcpy(pool_count, pool_count_cmo, sizeof(pool_count)); for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { - struct kobject *kobj = &adapter->rx_buff_pool[i].kobj; + struct kobject *kobj = &adapter->rx_buff_pool[0][i].kobj; int error; - ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i, + ibmveth_init_buffer_pool(&adapter->rx_buff_pool[0][i], i, pool_count[i], pool_size[i], pool_active[i]); error = kobject_init_and_add(kobj, &ktype_veth_pool,
@@ -1950,7 +1955,7 @@ static void ibmveth_remove(struct vio_dev *dev) cancel_work_sync(&adapter->work); for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) - kobject_put(&adapter->rx_buff_pool[i].kobj); + kobject_put(&adapter->rx_buff_pool[0][i].kobj); unregister_netdev(netdev);
@@ -2036,11 +2041,11 @@ static ssize_t veth_pool_store(struct kobject *kobj, struct attribute *attr, /* Make sure there is a buffer pool with buffers that can hold a packet of the size of the MTU */ for (i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) { - if (pool == &adapter->rx_buff_pool[i]) + if (pool == &adapter->rx_buff_pool[0][i]) continue; - if (!adapter->rx_buff_pool[i].active) + if (!adapter->rx_buff_pool[0][i].active) continue; - if (mtu <= adapter->rx_buff_pool[i].buff_size) + if (mtu <= adapter->rx_buff_pool[0][i].buff_size) break; }
@@ -2214,11 +2219,11 @@ static void ibmveth_remove_buffer_from_pool_test(struct kunit *test) /* Set sane values for buffer pools */ for (int i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) - ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i, + ibmveth_init_buffer_pool(&adapter->rx_buff_pool[0][i], i, pool_count[i], pool_size[i], pool_active[i]); - pool = &adapter->rx_buff_pool[0]; + pool = &adapter->rx_buff_pool[0][0]; pool->skbuff = kunit_kcalloc(test, pool->size, sizeof(void *), GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pool->skbuff);
@@ -2226,7 +2231,7 @@ static void ibmveth_remove_buffer_from_pool_test(struct kunit *test) KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, correlator, false)); KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, correlator, true)); - correlator = ((u64)0 << 32) | adapter->rx_buff_pool[0].size; + correlator = ((u64)0 << 32) | adapter->rx_buff_pool[0][0].size; KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, correlator, false)); KUNIT_EXPECT_EQ(test, -EINVAL, ibmveth_remove_buffer_from_pool(adapter, correlator, true));
@@ -2259,30 +2264,32 @@ static void ibmveth_rxq_get_buffer_test(struct kunit *test) INIT_WORK(&adapter->work, ibmveth_reset_kunit); - adapter->rx_queue.queue_len = 1; - adapter->rx_queue.index = 0; - adapter->rx_queue.queue_addr = kunit_kzalloc(test, sizeof(struct ibmveth_rx_q_entry), - GFP_KERNEL); - KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adapter->rx_queue.queue_addr); + adapter->rx_queue[0].queue_len = 1; + adapter->rx_queue[0].index = 0; + adapter->rx_queue[0].queue_addr = + kunit_kzalloc(test, sizeof(struct ibmveth_rx_q_entry), + GFP_KERNEL); + KUNIT_ASSERT_NOT_ERR_OR_NULL(test, adapter->rx_queue[0].queue_addr); /* Set sane values for buffer pools */ for (int i = 0; i < IBMVETH_NUM_BUFF_POOLS; i++) - ibmveth_init_buffer_pool(&adapter->rx_buff_pool[i], i, + ibmveth_init_buffer_pool(&adapter->rx_buff_pool[0][i], i, pool_count[i], pool_size[i], pool_active[i]); - pool = &adapter->rx_buff_pool[0]; + pool = &adapter->rx_buff_pool[0][0]; pool->skbuff = kunit_kcalloc(test, pool->size, sizeof(void *), GFP_KERNEL); KUNIT_ASSERT_NOT_ERR_OR_NULL(test, pool->skbuff); - adapter->rx_queue.queue_addr[0].correlator = (u64)IBMVETH_NUM_BUFF_POOLS << 32 | 0; + adapter->rx_queue[0].queue_addr[0].correlator = (u64)IBMVETH_NUM_BUFF_POOLS << 32 | 0; KUNIT_EXPECT_PTR_EQ(test, NULL, ibmveth_rxq_get_buffer(adapter)); - adapter->rx_queue.queue_addr[0].correlator = (u64)0 << 32 | adapter->rx_buff_pool[0].size; + adapter->rx_queue[0].queue_addr[0].correlator = + (u64)0 << 32 | adapter->rx_buff_pool[0][0].size; KUNIT_EXPECT_PTR_EQ(test, NULL, ibmveth_rxq_get_buffer(adapter)); pool->skbuff[0] = skb; - adapter->rx_queue.queue_addr[0].correlator = (u64)0 << 32 | 0; + adapter->rx_queue[0].queue_addr[0].correlator = (u64)0 << 32 | 0; KUNIT_EXPECT_PTR_EQ(test, skb, ibmveth_rxq_get_buffer(adapter)); flush_work(&adapter->work);
diff --git a/drivers/net/ethernet/ibm/ibmveth.h b/drivers/net/ethernet/ibm/ibmveth.h
index 45cfb0d054e3..b17894695c2e 100644
--- a/drivers/net/ethernet/ibm/ibmveth.h
+++ b/drivers/net/ethernet/ibm/ibmveth.h@@ -279,6 +279,8 @@ static inline long h_illan_attributes(unsigned long unit_address, #define IBMVETH_MAX_TX_BUF_SIZE (1024 * 64) #define IBMVETH_MAX_QUEUES 16U #define IBMVETH_DEFAULT_QUEUES 8U +#define IBMVETH_MAX_RX_QUEUES 1U +#define IBMVETH_DEFAULT_RX_QUEUES 1U #define IBMVETH_MAX_RX_PER_HCALL 8U static int pool_size[] = { 512, 1024 * 2, 1024 * 16, 1024 * 32, 1024 * 64 };
@@ -315,18 +317,22 @@ struct ibmveth_rx_q { struct ibmveth_adapter { struct vio_dev *vdev; struct net_device *netdev; - struct napi_struct napi; + struct napi_struct napi[IBMVETH_MAX_RX_QUEUES]; struct work_struct work; unsigned int mcastFilterSize; - void *buffer_list_addr; + void *buffer_list_addr[IBMVETH_MAX_RX_QUEUES]; void *filter_list_addr; void *tx_ltb_ptr[IBMVETH_MAX_QUEUES]; unsigned int tx_ltb_size; dma_addr_t tx_ltb_dma[IBMVETH_MAX_QUEUES]; - dma_addr_t buffer_list_dma; + dma_addr_t buffer_list_dma[IBMVETH_MAX_RX_QUEUES]; dma_addr_t filter_list_dma; - struct ibmveth_buff_pool rx_buff_pool[IBMVETH_NUM_BUFF_POOLS]; - struct ibmveth_rx_q rx_queue; + struct ibmveth_buff_pool rx_buff_pool[IBMVETH_MAX_RX_QUEUES][IBMVETH_NUM_BUFF_POOLS]; + struct ibmveth_rx_q rx_queue[IBMVETH_MAX_RX_QUEUES]; + u64 queue_handle[IBMVETH_MAX_RX_QUEUES]; + unsigned int queue_irq[IBMVETH_MAX_RX_QUEUES]; + int multi_queue; + unsigned int num_rx_queues; int rx_csum; int large_send; bool is_active_trunk;
--
2.39.3 (Apple Git-146)