Skip to content

Commit b0ec548

Browse files
Bhaskar Upadhayadavem330
authored andcommitted
qede: preserve per queue stats across up/down of interface
Here we do the initialization of coalescing values on load. per queue coalesce values are also restored across up/down of ethernet interface. Signed-off-by: Bhaskar Upadhaya <bupadhaya@marvell.com> Signed-off-by: Igor Russkikh <irusskikh@marvell.com> Signed-off-by: Ariel Elior <aelior@marvell.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent a0d2d97 commit b0ec548

File tree

3 files changed

+48
-7
lines changed

3 files changed

+48
-7
lines changed

drivers/net/ethernet/qlogic/qede/qede.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,12 @@ struct qede_dump_info {
168168
u32 args[QEDE_DUMP_MAX_ARGS];
169169
};
170170

171+
struct qede_coalesce {
172+
bool isvalid;
173+
u16 rxc;
174+
u16 txc;
175+
};
176+
171177
struct qede_dev {
172178
struct qed_dev *cdev;
173179
struct net_device *ndev;
@@ -194,6 +200,7 @@ struct qede_dev {
194200
((edev)->dev_info.common.dev_type == QED_DEV_TYPE_AH)
195201

196202
struct qede_fastpath *fp_array;
203+
struct qede_coalesce *coal_entry;
197204
u8 req_num_tx;
198205
u8 fp_num_tx;
199206
u8 req_num_rx;
@@ -581,6 +588,9 @@ int qede_add_tc_flower_fltr(struct qede_dev *edev, __be16 proto,
581588
struct flow_cls_offload *f);
582589

583590
void qede_forced_speed_maps_init(void);
591+
int qede_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal);
592+
int qede_set_per_coalesce(struct net_device *dev, u32 queue,
593+
struct ethtool_coalesce *coal);
584594

585595
#define RX_RING_SIZE_POW 13
586596
#define RX_RING_SIZE ((u16)BIT(RX_RING_SIZE_POW))

drivers/net/ethernet/qlogic/qede/qede_ethtool.c

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -819,8 +819,7 @@ static int qede_get_coalesce(struct net_device *dev,
819819
return rc;
820820
}
821821

822-
static int qede_set_coalesce(struct net_device *dev,
823-
struct ethtool_coalesce *coal)
822+
int qede_set_coalesce(struct net_device *dev, struct ethtool_coalesce *coal)
824823
{
825824
struct qede_dev *edev = netdev_priv(dev);
826825
struct qede_fastpath *fp;
@@ -855,6 +854,8 @@ static int qede_set_coalesce(struct net_device *dev,
855854
"Set RX coalesce error, rc = %d\n", rc);
856855
return rc;
857856
}
857+
edev->coal_entry[i].rxc = rxc;
858+
edev->coal_entry[i].isvalid = true;
858859
}
859860

860861
if (edev->fp_array[i].type & QEDE_FASTPATH_TX) {
@@ -874,6 +875,8 @@ static int qede_set_coalesce(struct net_device *dev,
874875
"Set TX coalesce error, rc = %d\n", rc);
875876
return rc;
876877
}
878+
edev->coal_entry[i].txc = txc;
879+
edev->coal_entry[i].isvalid = true;
877880
}
878881
}
879882

@@ -2105,9 +2108,8 @@ static int qede_get_dump_data(struct net_device *dev,
21052108
return rc;
21062109
}
21072110

2108-
static int qede_set_per_coalesce(struct net_device *dev,
2109-
u32 queue,
2110-
struct ethtool_coalesce *coal)
2111+
int qede_set_per_coalesce(struct net_device *dev, u32 queue,
2112+
struct ethtool_coalesce *coal)
21112113
{
21122114
struct qede_dev *edev = netdev_priv(dev);
21132115
struct qede_fastpath *fp;
@@ -2150,6 +2152,8 @@ static int qede_set_per_coalesce(struct net_device *dev,
21502152
"Set RX coalesce error, rc = %d\n", rc);
21512153
goto out;
21522154
}
2155+
edev->coal_entry[queue].rxc = rxc;
2156+
edev->coal_entry[queue].isvalid = true;
21532157
}
21542158

21552159
if (edev->fp_array[queue].type & QEDE_FASTPATH_TX) {
@@ -2161,6 +2165,8 @@ static int qede_set_per_coalesce(struct net_device *dev,
21612165
"Set TX coalesce error, rc = %d\n", rc);
21622166
goto out;
21632167
}
2168+
edev->coal_entry[queue].txc = txc;
2169+
edev->coal_entry[queue].isvalid = true;
21642170
}
21652171
out:
21662172
__qede_unlock(edev);

drivers/net/ethernet/qlogic/qede/qede_main.c

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,7 @@ static int qede_alloc_fp_array(struct qede_dev *edev)
904904
{
905905
u8 fp_combined, fp_rx = edev->fp_num_rx;
906906
struct qede_fastpath *fp;
907+
void *mem;
907908
int i;
908909

909910
edev->fp_array = kcalloc(QEDE_QUEUE_CNT(edev),
@@ -913,6 +914,15 @@ static int qede_alloc_fp_array(struct qede_dev *edev)
913914
goto err;
914915
}
915916

917+
mem = krealloc(edev->coal_entry, QEDE_QUEUE_CNT(edev) *
918+
sizeof(*edev->coal_entry), GFP_KERNEL);
919+
if (!mem) {
920+
DP_ERR(edev, "coalesce entry allocation failed\n");
921+
kfree(edev->coal_entry);
922+
goto err;
923+
}
924+
edev->coal_entry = mem;
925+
916926
fp_combined = QEDE_QUEUE_CNT(edev) - fp_rx - edev->fp_num_tx;
917927

918928
/* Allocate the FP elements for Rx queues followed by combined and then
@@ -1320,8 +1330,10 @@ static void __qede_remove(struct pci_dev *pdev, enum qede_remove_mode mode)
13201330
* [e.g., QED register callbacks] won't break anything when
13211331
* accessing the netdevice.
13221332
*/
1323-
if (mode != QEDE_REMOVE_RECOVERY)
1333+
if (mode != QEDE_REMOVE_RECOVERY) {
1334+
kfree(edev->coal_entry);
13241335
free_netdev(ndev);
1336+
}
13251337

13261338
dev_info(&pdev->dev, "Ending qede_remove successfully\n");
13271339
}
@@ -2328,8 +2340,9 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
23282340
bool is_locked)
23292341
{
23302342
struct qed_link_params link_params;
2343+
struct ethtool_coalesce coal = {};
23312344
u8 num_tc;
2332-
int rc;
2345+
int rc, i;
23332346

23342347
DP_INFO(edev, "Starting qede load\n");
23352348

@@ -2390,6 +2403,18 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
23902403

23912404
edev->state = QEDE_STATE_OPEN;
23922405

2406+
coal.rx_coalesce_usecs = QED_DEFAULT_RX_USECS;
2407+
coal.tx_coalesce_usecs = QED_DEFAULT_TX_USECS;
2408+
2409+
for_each_queue(i) {
2410+
if (edev->coal_entry[i].isvalid) {
2411+
coal.rx_coalesce_usecs = edev->coal_entry[i].rxc;
2412+
coal.tx_coalesce_usecs = edev->coal_entry[i].txc;
2413+
}
2414+
__qede_unlock(edev);
2415+
qede_set_per_coalesce(edev->ndev, i, &coal);
2416+
__qede_lock(edev);
2417+
}
23932418
DP_INFO(edev, "Ending successfully qede load\n");
23942419

23952420
goto out;

0 commit comments

Comments
 (0)