Skip to content

Commit 7e0edac

Browse files
author
CKI KWF Bot
committed
Merge: Updates for ibmvnic driver to fix inaccurate SAR reporting
MR: https://gitlab.com/redhat/centos-stream/src/kernel/centos-stream-9/-/merge_requests/7156 Description: Updates for ibmvnic driver to fix inaccurate SAR reporting JIRA: https://issues.redhat.com/browse/RHEL-104119 Build Info: https://brewweb.engineering.redhat.com/brew/taskinfo?taskID=68389703 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: CKI GitLab Kmaint Pipeline Bot <26919896-cki-kmaint-pipeline-bot@users.noreply.gitlab.com>
2 parents 0cb2fc0 + 5678f0a commit 7e0edac

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
@@ -2103,9 +2103,7 @@ static void ibmvnic_tx_scrq_clean_buffer(struct ibmvnic_adapter *adapter,
21032103
tx_pool->num_buffers - 1 :
21042104
tx_pool->consumer_index - 1;
21052105
tx_buff = &tx_pool->tx_buff[index];
2106-
adapter->netdev->stats.tx_packets--;
2107-
adapter->netdev->stats.tx_bytes -= tx_buff->skb->len;
2108-
adapter->tx_stats_buffers[queue_num].packets--;
2106+
adapter->tx_stats_buffers[queue_num].batched_packets--;
21092107
adapter->tx_stats_buffers[queue_num].bytes -=
21102108
tx_buff->skb->len;
21112109
dev_kfree_skb_any(tx_buff->skb);
@@ -2196,7 +2194,8 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
21962194
unsigned int tx_map_failed = 0;
21972195
union sub_crq indir_arr[16];
21982196
unsigned int tx_dropped = 0;
2199-
unsigned int tx_packets = 0;
2197+
unsigned int tx_dpackets = 0;
2198+
unsigned int tx_bpackets = 0;
22002199
unsigned int tx_bytes = 0;
22012200
dma_addr_t data_dma_addr;
22022201
struct netdev_queue *txq;
@@ -2370,6 +2369,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
23702369
if (lpar_rc != H_SUCCESS)
23712370
goto tx_err;
23722371

2372+
tx_dpackets++;
23732373
goto early_exit;
23742374
}
23752375

@@ -2397,6 +2397,7 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
23972397
if (lpar_rc != H_SUCCESS)
23982398
goto tx_err;
23992399
}
2400+
tx_bpackets++;
24002401

24012402
early_exit:
24022403
if (atomic_add_return(num_entries, &tx_scrq->used)
@@ -2405,7 +2406,6 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
24052406
netif_stop_subqueue(netdev, queue_num);
24062407
}
24072408

2408-
tx_packets++;
24092409
tx_bytes += skblen;
24102410
txq_trans_cond_update(txq);
24112411
ret = NETDEV_TX_OK;
@@ -2433,12 +2433,10 @@ static netdev_tx_t ibmvnic_xmit(struct sk_buff *skb, struct net_device *netdev)
24332433
}
24342434
out:
24352435
rcu_read_unlock();
2436-
netdev->stats.tx_dropped += tx_dropped;
2437-
netdev->stats.tx_bytes += tx_bytes;
2438-
netdev->stats.tx_packets += tx_packets;
24392436
adapter->tx_send_failed += tx_send_failed;
24402437
adapter->tx_map_failed += tx_map_failed;
2441-
adapter->tx_stats_buffers[queue_num].packets += tx_packets;
2438+
adapter->tx_stats_buffers[queue_num].batched_packets += tx_bpackets;
2439+
adapter->tx_stats_buffers[queue_num].direct_packets += tx_dpackets;
24422440
adapter->tx_stats_buffers[queue_num].bytes += tx_bytes;
24432441
adapter->tx_stats_buffers[queue_num].dropped_packets += tx_dropped;
24442442

@@ -3237,6 +3235,25 @@ static int ibmvnic_reset(struct ibmvnic_adapter *adapter,
32373235
return -ret;
32383236
}
32393237

3238+
static void ibmvnic_get_stats64(struct net_device *netdev,
3239+
struct rtnl_link_stats64 *stats)
3240+
{
3241+
struct ibmvnic_adapter *adapter = netdev_priv(netdev);
3242+
int i;
3243+
3244+
for (i = 0; i < adapter->req_rx_queues; i++) {
3245+
stats->rx_packets += adapter->rx_stats_buffers[i].packets;
3246+
stats->rx_bytes += adapter->rx_stats_buffers[i].bytes;
3247+
}
3248+
3249+
for (i = 0; i < adapter->req_tx_queues; i++) {
3250+
stats->tx_packets += adapter->tx_stats_buffers[i].batched_packets;
3251+
stats->tx_packets += adapter->tx_stats_buffers[i].direct_packets;
3252+
stats->tx_bytes += adapter->tx_stats_buffers[i].bytes;
3253+
stats->tx_dropped += adapter->tx_stats_buffers[i].dropped_packets;
3254+
}
3255+
}
3256+
32403257
static void ibmvnic_tx_timeout(struct net_device *dev, unsigned int txqueue)
32413258
{
32423259
struct ibmvnic_adapter *adapter = netdev_priv(dev);
@@ -3352,8 +3369,6 @@ static int ibmvnic_poll(struct napi_struct *napi, int budget)
33523369

33533370
length = skb->len;
33543371
napi_gro_receive(napi, skb); /* send it up */
3355-
netdev->stats.rx_packets++;
3356-
netdev->stats.rx_bytes += length;
33573372
adapter->rx_stats_buffers[scrq_num].packets++;
33583373
adapter->rx_stats_buffers[scrq_num].bytes += length;
33593374
frames_processed++;
@@ -3463,6 +3478,7 @@ static const struct net_device_ops ibmvnic_netdev_ops = {
34633478
.ndo_set_rx_mode = ibmvnic_set_multi,
34643479
.ndo_set_mac_address = ibmvnic_set_mac,
34653480
.ndo_validate_addr = eth_validate_addr,
3481+
.ndo_get_stats64 = ibmvnic_get_stats64,
34663482
.ndo_tx_timeout = ibmvnic_tx_timeout,
34673483
.ndo_change_mtu = ibmvnic_change_mtu,
34683484
.ndo_features_check = ibmvnic_features_check,
@@ -3627,7 +3643,10 @@ static void ibmvnic_get_strings(struct net_device *dev, u32 stringset, u8 *data)
36273643
memcpy(data, ibmvnic_stats[i].name, ETH_GSTRING_LEN);
36283644

36293645
for (i = 0; i < adapter->req_tx_queues; i++) {
3630-
snprintf(data, ETH_GSTRING_LEN, "tx%d_packets", i);
3646+
snprintf(data, ETH_GSTRING_LEN, "tx%d_batched_packets", i);
3647+
data += ETH_GSTRING_LEN;
3648+
3649+
snprintf(data, ETH_GSTRING_LEN, "tx%d_direct_packets", i);
36313650
data += ETH_GSTRING_LEN;
36323651

36333652
snprintf(data, ETH_GSTRING_LEN, "tx%d_bytes", i);
@@ -3705,7 +3724,9 @@ static void ibmvnic_get_ethtool_stats(struct net_device *dev,
37053724
(adapter, ibmvnic_stats[i].offset));
37063725

37073726
for (j = 0; j < adapter->req_tx_queues; j++) {
3708-
data[i] = adapter->tx_stats_buffers[j].packets;
3727+
data[i] = adapter->tx_stats_buffers[j].batched_packets;
3728+
i++;
3729+
data[i] = adapter->tx_stats_buffers[j].direct_packets;
37093730
i++;
37103731
data[i] = adapter->tx_stats_buffers[j].bytes;
37113732
i++;

drivers/net/ethernet/ibm/ibmvnic.h

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

178-
#define NUM_TX_STATS 3
179178
struct ibmvnic_tx_queue_stats {
180-
u64 packets;
179+
u64 batched_packets;
180+
u64 direct_packets;
181181
u64 bytes;
182182
u64 dropped_packets;
183183
};
184184

185-
#define NUM_RX_STATS 3
185+
#define NUM_TX_STATS \
186+
(sizeof(struct ibmvnic_tx_queue_stats) / sizeof(u64))
187+
186188
struct ibmvnic_rx_queue_stats {
187189
u64 packets;
188190
u64 bytes;
189191
u64 interrupts;
190192
};
191193

194+
#define NUM_RX_STATS \
195+
(sizeof(struct ibmvnic_rx_queue_stats) / sizeof(u64))
196+
192197
struct ibmvnic_acl_buffer {
193198
__be32 len;
194199
__be32 version;

0 commit comments

Comments
 (0)