Skip to content

Commit 76d11a3

Browse files
committed
Merge: Updates for ibmvnic driver to fix inaccurate SAR reporting
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-10/-/merge_requests/1233 Description: Updates for ibmvnic driver to fix inaccurate SAR reporting JIRA: https://issues.redhat.com/browse/RHEL-104319 Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=68390714 Tested: Verified Brew build test kernel RPMs Signed-off-by: Mamatha Inamdar <minamdar@redhat.com> Approved-by: Michal Schmidt <mschmidt@redhat.com> Approved-by: Corinna Vinschen <vinschen@redhat.com> Approved-by: Ivan Vecera <ivecera@redhat.com> Approved-by: CKI KWF Bot <cki-ci-bot+kwf-gitlab-com@redhat.com> Merged-by: Scott Weaver <scweaver@redhat.com>
2 parents f3eb8cc + 81fe5d6 commit 76d11a3

File tree

2 files changed

+42
-16
lines changed

2 files changed

+42
-16
lines changed

drivers/net/ethernet/ibm/ibmvnic.c

Lines changed: 34 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2308,9 +2308,7 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
23082308
tx_pool->num_buffers - 1 :
23092309
tx_pool->consumer_index - 1;
23102310
tx_buff = &tx_pool->tx_buff[index];
2311-
adapter->netdev->stats.tx_packets--;
2312-
adapter->netdev->stats.tx_bytes -= tx_buff->skb->len;
2313-
adapter->tx_stats_buffers[queue_num].packets--;
2311+
adapter->tx_stats_buffers[queue_num].batched_packets--;
23142312
adapter->tx_stats_buffers[queue_num].bytes -=
23152313
tx_buff->skb->len;
23162314
dev_kfree_skb_any(tx_buff->skb);
@@ -2402,7 +2400,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
24022400
unsigned int tx_map_failed = 0;
24032401
union sub_crq indir_arr[16];
24042402
unsigned int tx_dropped = 0;
2405-
unsigned int tx_packets = 0;
2403+
unsigned int tx_dpackets = 0;
2404+
unsigned int tx_bpackets = 0;
24062405
unsigned int tx_bytes = 0;
24072406
dma_addr_t data_dma_addr;
24082407
struct netdev_queue *txq;
@@ -2577,6 +2576,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
25772576
if (lpar_rc != H_SUCCESS)
25782577
goto tx_err;
25792578

2579+
tx_dpackets++;
25802580
goto early_exit;
25812581
}
25822582

@@ -2604,6 +2604,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
26042604
if (lpar_rc != H_SUCCESS)
26052605
goto tx_err;
26062606
}
2607+
tx_bpackets++;
26072608

26082609
early_exit:
26092610
if (atomic_add_return(num_entries, &tx_scrq->used)
@@ -2612,7 +2613,6 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
26122613
netif_stop_subqueue(netdev, queue_num);
26132614
}
26142615

2615-
tx_packets++;
26162616
tx_bytes += skblen;
26172617
txq_trans_cond_update(txq);
26182618
ret = NETDEV_TX_OK;
@@ -2640,12 +2640,10 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
26402640
}
26412641
out:
26422642
rcu_read_unlock();
2643-
netdev->stats.tx_dropped += tx_dropped;
2644-
netdev->stats.tx_bytes += tx_bytes;
2645-
netdev->stats.tx_packets += tx_packets;
26462643
adapter->tx_send_failed += tx_send_failed;
26472644
adapter->tx_map_failed += tx_map_failed;
2648-
adapter->tx_stats_buffers[queue_num].packets += tx_packets;
2645+
adapter->tx_stats_buffers[queue_num].batched_packets += tx_bpackets;
2646+
adapter->tx_stats_buffers[queue_num].direct_packets += tx_dpackets;
26492647
adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
26502648
adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;
26512649

@@ -3444,6 +3442,25 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
34443442
return -ret;
34453443
}
34463444

3445+
static void ibmvnic_get_stats64(struct net_device *netdev,
3446+
struct rtnl_link_stats64 *stats)
3447+
{
3448+
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
3449+
int i;
3450+
3451+
for (i = 0; i < adapter->req_rx_queues; i++) {
3452+
stats->rx_packets += adapter->rx_stats_buffers[i].packets;
3453+
stats->rx_bytes += adapter->rx_stats_buffers[i].bytes;
3454+
}
3455+
3456+
for (i = 0; i < adapter->req_tx_queues; i++) {
3457+
stats->tx_packets += adapter->tx_stats_buffers[i].batched_packets;
3458+
stats->tx_packets += adapter->tx_stats_buffers[i].direct_packets;
3459+
stats->tx_bytes += adapter->tx_stats_buffers[i].bytes;
3460+
stats->tx_dropped += adapter->tx_stats_buffers[i].dropped_packets;
3461+
}
3462+
}
3463+
34473464
static void ibmvnic_tx_timeout(struct net_device *dev, unsigned int txqueue)
34483465
{
34493466
struct ibmvnic_adapter *adapter = netdev_priv(dev);
@@ -3559,8 +3576,6 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget)
35593576

35603577
length = skb->len;
35613578
napi_gro_receive(napi, skb); /* send it up */
3562-
netdev->stats.rx_packets++;
3563-
netdev->stats.rx_bytes += length;
35643579
adapter->rx_stats_buffers[scrq_num].packets++;
35653580
adapter->rx_stats_buffers[scrq_num].bytes += length;
35663581
frames_processed++;
@@ -3670,6 +3685,7 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
36703685
.ndo_set_rx_mode = ibmvnic_set_multi,
36713686
.ndo_set_mac_address = ibmvnic_set_mac,
36723687
.ndo_validate_addr = eth_validate_addr,
3688+
.ndo_get_stats64 = ibmvnic_get_stats64,
36733689
.ndo_tx_timeout = ibmvnic_tx_timeout,
36743690
.ndo_change_mtu = ibmvnic_change_mtu,
36753691
.ndo_features_check = ibmvnic_features_check,
@@ -3810,7 +3826,10 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
38103826
memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
38113827

38123828
for (i = 0; i < adapter->req_tx_queues; i++) {
3813-
snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
3829+
snprintf(data, ETH_GSTRING_LEN, "tx%d_batched_packets", i);
3830+
data += ETH_GSTRING_LEN;
3831+
3832+
snprintf(data, ETH_GSTRING_LEN, "tx%d_direct_packets", i);
38143833
data += ETH_GSTRING_LEN;
38153834

38163835
snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
@@ -3875,7 +3894,9 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
38753894
(adapter, ibmvnic_stats[i].offset));
38763895

38773896
for (j = 0; j < adapter->req_tx_queues; j++) {
3878-
data[i] = adapter->tx_stats_buffers[j].packets;
3897+
data[i] = adapter->tx_stats_buffers[j].batched_packets;
3898+
i++;
3899+
data[i] = adapter->tx_stats_buffers[j].direct_packets;
38793900
i++;
38803901
data[i] = adapter->tx_stats_buffers[j].bytes;
38813902
i++;

drivers/net/ethernet/ibm/ibmvnic.h

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -211,20 +211,25 @@ struct ibmvnic_statistics {
211211
u8 reserved[72];
212212
} __packed __aligned(8);
213213

214-
#define NUM_TX_STATS 3
215214
struct ibmvnic_tx_queue_stats {
216-
u64 packets;
215+
u64 batched_packets;
216+
u64 direct_packets;
217217
u64 bytes;
218218
u64 dropped_packets;
219219
};
220220

221-
#define NUM_RX_STATS 3
221+
#define NUM_TX_STATS \
222+
(sizeof(struct ibmvnic_tx_queue_stats) / sizeof(u64))
223+
222224
struct ibmvnic_rx_queue_stats {
223225
u64 packets;
224226
u64 bytes;
225227
u64 interrupts;
226228
};
227229

230+
#define NUM_RX_STATS \
231+
(sizeof(struct ibmvnic_rx_queue_stats) / sizeof(u64))
232+
228233
struct ibmvnic_acl_buffer {
229234
__be32 len;
230235
__be32 version;

0 commit comments

Comments
 (0)