|
Michal Suchanek |
42f132 |
From 9a87c3fca2372af3177cb454c7aa381c7080307f Mon Sep 17 00:00:00 2001
|
|
Michal Suchanek |
42f132 |
From: "Dwip N. Banerjee" <dnbanerg@us.ibm.com>
|
|
Michal Suchanek |
42f132 |
Date: Wed, 18 Nov 2020 19:12:22 -0600
|
|
Michal Suchanek |
42f132 |
Subject: [PATCH] ibmvnic: Ensure that device queue memory is cache-line
|
|
Michal Suchanek |
42f132 |
aligned
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
References: bsc#1184114 ltc#192237 bsc#1179243 ltc#189290
|
|
Michal Suchanek |
42f132 |
Patch-mainline: v5.11-rc1
|
|
Michal Suchanek |
42f132 |
Git-commit: 9a87c3fca2372af3177cb454c7aa381c7080307f
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
PCI bus slowdowns were observed on IBM VNIC devices as a result
|
|
Michal Suchanek |
42f132 |
of partial cache line writes and non-cache aligned full cache line writes.
|
|
Michal Suchanek |
42f132 |
Ensure that packet data buffers are cache-line aligned to avoid these
|
|
Michal Suchanek |
42f132 |
slowdowns.
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
Signed-off-by: Dwip N. Banerjee <dnbanerg@us.ibm.com>
|
|
Michal Suchanek |
42f132 |
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
|
|
Michal Suchanek |
42f132 |
Acked-by: Michal Suchanek <msuchanek@suse.de>
|
|
Michal Suchanek |
42f132 |
---
|
|
Michal Suchanek |
42f132 |
drivers/net/ethernet/ibm/ibmvnic.c | 9 ++++++---
|
|
Michal Suchanek |
42f132 |
drivers/net/ethernet/ibm/ibmvnic.h | 10 +++++-----
|
|
Michal Suchanek |
42f132 |
2 files changed, 11 insertions(+), 8 deletions(-)
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
diff --git a/drivers/net/ethernet/ibm/ibmvnic.c b/drivers/net/ethernet/ibm/ibmvnic.c
|
|
Michal Suchanek |
42f132 |
index e9b0cb6dfd9d..85df91c9861b 100644
|
|
Michal Suchanek |
42f132 |
--- a/drivers/net/ethernet/ibm/ibmvnic.c
|
|
Michal Suchanek |
42f132 |
+++ b/drivers/net/ethernet/ibm/ibmvnic.c
|
|
Michal Suchanek |
42f132 |
@@ -498,7 +498,7 @@ static int reset_rx_pools(struct ibmvnic_adapter *adapter)
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
if (rx_pool->buff_size != buff_size) {
|
|
Michal Suchanek |
42f132 |
free_long_term_buff(adapter, &rx_pool->long_term_buff);
|
|
Michal Suchanek |
42f132 |
- rx_pool->buff_size = buff_size;
|
|
Michal Suchanek |
42f132 |
+ rx_pool->buff_size = ALIGN(buff_size, L1_CACHE_BYTES);
|
|
Michal Suchanek |
42f132 |
rc = alloc_long_term_buff(adapter,
|
|
Michal Suchanek |
42f132 |
&rx_pool->long_term_buff,
|
|
Michal Suchanek |
42f132 |
rx_pool->size *
|
|
Michal Suchanek |
42f132 |
@@ -592,7 +592,7 @@ static int init_rx_pools(struct net_device *netdev)
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
rx_pool->size = adapter->req_rx_add_entries_per_subcrq;
|
|
Michal Suchanek |
42f132 |
rx_pool->index = i;
|
|
Michal Suchanek |
42f132 |
- rx_pool->buff_size = buff_size;
|
|
Michal Suchanek |
42f132 |
+ rx_pool->buff_size = ALIGN(buff_size, L1_CACHE_BYTES);
|
|
Michal Suchanek |
42f132 |
rx_pool->active = 1;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
rx_pool->free_map = kcalloc(rx_pool->size, sizeof(int),
|
|
Michal Suchanek |
42f132 |
@@ -745,6 +745,7 @@ static int init_tx_pools(struct net_device *netdev)
|
|
Michal Suchanek |
42f132 |
{
|
|
Michal Suchanek |
42f132 |
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
|
|
Michal Suchanek |
42f132 |
int tx_subcrqs;
|
|
Michal Suchanek |
42f132 |
+ u64 buff_size;
|
|
Michal Suchanek |
42f132 |
int i, rc;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
tx_subcrqs = adapter->num_active_tx_scrqs;
|
|
Michal Suchanek |
42f132 |
@@ -761,9 +762,11 @@ static int init_tx_pools(struct net_device *netdev)
|
|
Michal Suchanek |
42f132 |
adapter->num_active_tx_pools = tx_subcrqs;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
for (i = 0; i < tx_subcrqs; i++) {
|
|
Michal Suchanek |
42f132 |
+ buff_size = adapter->req_mtu + VLAN_HLEN;
|
|
Michal Suchanek |
42f132 |
+ buff_size = ALIGN(buff_size, L1_CACHE_BYTES);
|
|
Michal Suchanek |
42f132 |
rc = init_one_tx_pool(netdev, &adapter->tx_pool[i],
|
|
Michal Suchanek |
42f132 |
adapter->req_tx_entries_per_subcrq,
|
|
Michal Suchanek |
42f132 |
- adapter->req_mtu + VLAN_HLEN);
|
|
Michal Suchanek |
42f132 |
+ buff_size);
|
|
Michal Suchanek |
42f132 |
if (rc) {
|
|
Michal Suchanek |
42f132 |
release_tx_pools(adapter);
|
|
Michal Suchanek |
42f132 |
return rc;
|
|
Michal Suchanek |
42f132 |
diff --git a/drivers/net/ethernet/ibm/ibmvnic.h b/drivers/net/ethernet/ibm/ibmvnic.h
|
|
Michal Suchanek |
42f132 |
index 16d892c3db0f..9911d926dd7f 100644
|
|
Michal Suchanek |
42f132 |
--- a/drivers/net/ethernet/ibm/ibmvnic.h
|
|
Michal Suchanek |
42f132 |
+++ b/drivers/net/ethernet/ibm/ibmvnic.h
|
|
Michal Suchanek |
42f132 |
@@ -883,7 +883,7 @@ struct ibmvnic_sub_crq_queue {
|
|
Michal Suchanek |
42f132 |
atomic_t used;
|
|
Michal Suchanek |
42f132 |
char name[32];
|
|
Michal Suchanek |
42f132 |
u64 handle;
|
|
Michal Suchanek |
42f132 |
-};
|
|
Michal Suchanek |
42f132 |
+} ____cacheline_aligned;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
struct ibmvnic_long_term_buff {
|
|
Michal Suchanek |
42f132 |
unsigned char *buff;
|
|
Michal Suchanek |
42f132 |
@@ -907,7 +907,7 @@ struct ibmvnic_tx_pool {
|
|
Michal Suchanek |
42f132 |
struct ibmvnic_long_term_buff long_term_buff;
|
|
Michal Suchanek |
42f132 |
int num_buffers;
|
|
Michal Suchanek |
42f132 |
int buf_size;
|
|
Michal Suchanek |
42f132 |
-};
|
|
Michal Suchanek |
42f132 |
+} ____cacheline_aligned;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
struct ibmvnic_rx_buff {
|
|
Michal Suchanek |
42f132 |
struct sk_buff *skb;
|
|
Michal Suchanek |
42f132 |
@@ -928,7 +928,7 @@ struct ibmvnic_rx_pool {
|
|
Michal Suchanek |
42f132 |
int next_alloc;
|
|
Michal Suchanek |
42f132 |
int active;
|
|
Michal Suchanek |
42f132 |
struct ibmvnic_long_term_buff long_term_buff;
|
|
Michal Suchanek |
42f132 |
-};
|
|
Michal Suchanek |
42f132 |
+} ____cacheline_aligned;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
struct ibmvnic_vpd {
|
|
Michal Suchanek |
42f132 |
unsigned char *buff;
|
|
Michal Suchanek |
42f132 |
@@ -1015,8 +1015,8 @@ struct ibmvnic_adapter {
|
|
Michal Suchanek |
42f132 |
atomic_t running_cap_crqs;
|
|
Michal Suchanek |
42f132 |
bool wait_capability;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
- struct ibmvnic_sub_crq_queue **tx_scrq;
|
|
Michal Suchanek |
42f132 |
- struct ibmvnic_sub_crq_queue **rx_scrq;
|
|
Michal Suchanek |
42f132 |
+ struct ibmvnic_sub_crq_queue **tx_scrq ____cacheline_aligned;
|
|
Michal Suchanek |
42f132 |
+ struct ibmvnic_sub_crq_queue **rx_scrq ____cacheline_aligned;
|
|
Michal Suchanek |
42f132 |
|
|
Michal Suchanek |
42f132 |
/* rx structs */
|
|
Michal Suchanek |
42f132 |
struct napi_struct *napi;
|
|
Michal Suchanek |
42f132 |
--
|
|
Michal Suchanek |
42f132 |
2.26.2
|
|
Michal Suchanek |
42f132 |
|