Skip to content

Commit 2d38c58

Browse files
committed
Merge branch 'ionic-updates'
Shannon Nelson says: ==================== ionic updates These updates are a bit of code cleaning and a minor bit of performance tweaking. v3: convert ionic_lif_quiesce() to void v2: added void cast on call to ionic_lif_quiesce() lowered batching threshold added patch to flatten calls to ionic_lif_rx_mode added patch to change from_ndo to can_sleep ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 9e6cad5 + 7c8d008 commit 2d38c58

File tree

5 files changed

+81
-58
lines changed

5 files changed

+81
-58
lines changed

drivers/net/ethernet/pensando/ionic/ionic_dev.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ static void ionic_watchdog_cb(struct timer_list *t)
2525
hb = ionic_heartbeat_check(ionic);
2626

2727
if (hb >= 0)
28-
ionic_link_status_check_request(ionic->lif, false);
28+
ionic_link_status_check_request(ionic->lif, CAN_NOT_SLEEP);
2929
}
3030

3131
void ionic_init_devinfo(struct ionic *ionic)

drivers/net/ethernet/pensando/ionic/ionic_dev.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@
1212

1313
#define IONIC_MAX_TX_DESC 8192
1414
#define IONIC_MAX_RX_DESC 16384
15-
#define IONIC_MIN_TXRX_DESC 16
15+
#define IONIC_MIN_TXRX_DESC 64
1616
#define IONIC_DEF_TXRX_DESC 4096
17+
#define IONIC_RX_FILL_THRESHOLD 16
18+
#define IONIC_RX_FILL_DIV 8
1719
#define IONIC_LIFS_MAX 1024
1820
#define IONIC_WATCHDOG_SECS 5
1921
#define IONIC_ITR_COAL_USEC_DEFAULT 64

drivers/net/ethernet/pensando/ionic/ionic_lif.c

Lines changed: 61 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ static void ionic_link_status_check(struct ionic_lif *lif)
123123
link_up = link_status == IONIC_PORT_OPER_STATUS_UP;
124124

125125
if (link_up) {
126+
if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) {
127+
mutex_lock(&lif->queue_lock);
128+
ionic_start_queues(lif);
129+
mutex_unlock(&lif->queue_lock);
130+
}
131+
126132
if (!netif_carrier_ok(netdev)) {
127133
u32 link_speed;
128134

@@ -132,12 +138,6 @@ static void ionic_link_status_check(struct ionic_lif *lif)
132138
link_speed / 1000);
133139
netif_carrier_on(netdev);
134140
}
135-
136-
if (lif->netdev->flags & IFF_UP && netif_running(lif->netdev)) {
137-
mutex_lock(&lif->queue_lock);
138-
ionic_start_queues(lif);
139-
mutex_unlock(&lif->queue_lock);
140-
}
141141
} else {
142142
if (netif_carrier_ok(netdev)) {
143143
netdev_info(netdev, "Link down\n");
@@ -1074,22 +1074,22 @@ static int ionic_lif_addr(struct ionic_lif *lif, const u8 *addr, bool add,
10741074

10751075
static int ionic_addr_add(struct net_device *netdev, const u8 *addr)
10761076
{
1077-
return ionic_lif_addr(netdev_priv(netdev), addr, true, true);
1077+
return ionic_lif_addr(netdev_priv(netdev), addr, ADD_ADDR, CAN_SLEEP);
10781078
}
10791079

10801080
static int ionic_ndo_addr_add(struct net_device *netdev, const u8 *addr)
10811081
{
1082-
return ionic_lif_addr(netdev_priv(netdev), addr, true, false);
1082+
return ionic_lif_addr(netdev_priv(netdev), addr, ADD_ADDR, CAN_NOT_SLEEP);
10831083
}
10841084

10851085
static int ionic_addr_del(struct net_device *netdev, const u8 *addr)
10861086
{
1087-
return ionic_lif_addr(netdev_priv(netdev), addr, false, true);
1087+
return ionic_lif_addr(netdev_priv(netdev), addr, DEL_ADDR, CAN_SLEEP);
10881088
}
10891089

10901090
static int ionic_ndo_addr_del(struct net_device *netdev, const u8 *addr)
10911091
{
1092-
return ionic_lif_addr(netdev_priv(netdev), addr, false, false);
1092+
return ionic_lif_addr(netdev_priv(netdev), addr, DEL_ADDR, CAN_NOT_SLEEP);
10931093
}
10941094

10951095
static void ionic_lif_rx_mode(struct ionic_lif *lif, unsigned int rx_mode)
@@ -1129,38 +1129,10 @@ static void ionic_lif_rx_mode(struct ionic_lif *lif, unsigned int rx_mode)
11291129
lif->rx_mode = rx_mode;
11301130
}
11311131

1132-
static void _ionic_lif_rx_mode(struct ionic_lif *lif, unsigned int rx_mode,
1133-
bool from_ndo)
1134-
{
1135-
struct ionic_deferred_work *work;
1136-
1137-
if (from_ndo) {
1138-
work = kzalloc(sizeof(*work), GFP_ATOMIC);
1139-
if (!work) {
1140-
netdev_err(lif->netdev, "%s OOM\n", __func__);
1141-
return;
1142-
}
1143-
work->type = IONIC_DW_TYPE_RX_MODE;
1144-
work->rx_mode = rx_mode;
1145-
netdev_dbg(lif->netdev, "deferred: rx_mode\n");
1146-
ionic_lif_deferred_enqueue(&lif->deferred, work);
1147-
} else {
1148-
ionic_lif_rx_mode(lif, rx_mode);
1149-
}
1150-
}
1151-
1152-
static void ionic_dev_uc_sync(struct net_device *netdev, bool from_ndo)
1153-
{
1154-
if (from_ndo)
1155-
__dev_uc_sync(netdev, ionic_ndo_addr_add, ionic_ndo_addr_del);
1156-
else
1157-
__dev_uc_sync(netdev, ionic_addr_add, ionic_addr_del);
1158-
1159-
}
1160-
1161-
static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
1132+
static void ionic_set_rx_mode(struct net_device *netdev, bool can_sleep)
11621133
{
11631134
struct ionic_lif *lif = netdev_priv(netdev);
1135+
struct ionic_deferred_work *work;
11641136
unsigned int nfilters;
11651137
unsigned int rx_mode;
11661138

@@ -1177,7 +1149,10 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
11771149
* we remove our overflow flag and check the netdev flags
11781150
* to see if we can disable NIC PROMISC
11791151
*/
1180-
ionic_dev_uc_sync(netdev, from_ndo);
1152+
if (can_sleep)
1153+
__dev_uc_sync(netdev, ionic_addr_add, ionic_addr_del);
1154+
else
1155+
__dev_uc_sync(netdev, ionic_ndo_addr_add, ionic_ndo_addr_del);
11811156
nfilters = le32_to_cpu(lif->identity->eth.max_ucast_filters);
11821157
if (netdev_uc_count(netdev) + 1 > nfilters) {
11831158
rx_mode |= IONIC_RX_MODE_F_PROMISC;
@@ -1189,7 +1164,10 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
11891164
}
11901165

11911166
/* same for multicast */
1192-
ionic_dev_uc_sync(netdev, from_ndo);
1167+
if (can_sleep)
1168+
__dev_mc_sync(netdev, ionic_addr_add, ionic_addr_del);
1169+
else
1170+
__dev_mc_sync(netdev, ionic_ndo_addr_add, ionic_ndo_addr_del);
11931171
nfilters = le32_to_cpu(lif->identity->eth.max_mcast_filters);
11941172
if (netdev_mc_count(netdev) > nfilters) {
11951173
rx_mode |= IONIC_RX_MODE_F_ALLMULTI;
@@ -1200,13 +1178,26 @@ static void ionic_set_rx_mode(struct net_device *netdev, bool from_ndo)
12001178
rx_mode &= ~IONIC_RX_MODE_F_ALLMULTI;
12011179
}
12021180

1203-
if (lif->rx_mode != rx_mode)
1204-
_ionic_lif_rx_mode(lif, rx_mode, from_ndo);
1181+
if (lif->rx_mode != rx_mode) {
1182+
if (!can_sleep) {
1183+
work = kzalloc(sizeof(*work), GFP_ATOMIC);
1184+
if (!work) {
1185+
netdev_err(lif->netdev, "%s OOM\n", __func__);
1186+
return;
1187+
}
1188+
work->type = IONIC_DW_TYPE_RX_MODE;
1189+
work->rx_mode = rx_mode;
1190+
netdev_dbg(lif->netdev, "deferred: rx_mode\n");
1191+
ionic_lif_deferred_enqueue(&lif->deferred, work);
1192+
} else {
1193+
ionic_lif_rx_mode(lif, rx_mode);
1194+
}
1195+
}
12051196
}
12061197

12071198
static void ionic_ndo_set_rx_mode(struct net_device *netdev)
12081199
{
1209-
ionic_set_rx_mode(netdev, true);
1200+
ionic_set_rx_mode(netdev, CAN_NOT_SLEEP);
12101201
}
12111202

12121203
static __le64 ionic_netdev_features_to_nic(netdev_features_t features)
@@ -1625,6 +1616,24 @@ static void ionic_lif_rss_deinit(struct ionic_lif *lif)
16251616
ionic_lif_rss_config(lif, 0x0, NULL, NULL);
16261617
}
16271618

1619+
static void ionic_lif_quiesce(struct ionic_lif *lif)
1620+
{
1621+
struct ionic_admin_ctx ctx = {
1622+
.work = COMPLETION_INITIALIZER_ONSTACK(ctx.work),
1623+
.cmd.lif_setattr = {
1624+
.opcode = IONIC_CMD_LIF_SETATTR,
1625+
.index = cpu_to_le16(lif->index),
1626+
.attr = IONIC_LIF_ATTR_STATE,
1627+
.state = IONIC_LIF_QUIESCE,
1628+
},
1629+
};
1630+
int err;
1631+
1632+
err = ionic_adminq_post_wait(lif, &ctx);
1633+
if (err)
1634+
netdev_err(lif->netdev, "lif quiesce failed %d\n", err);
1635+
}
1636+
16281637
static void ionic_txrx_disable(struct ionic_lif *lif)
16291638
{
16301639
unsigned int i;
@@ -1639,6 +1648,8 @@ static void ionic_txrx_disable(struct ionic_lif *lif)
16391648
for (i = 0; i < lif->nxqs; i++)
16401649
err = ionic_qcq_disable(lif->rxqcqs[i], (err != -ETIMEDOUT));
16411650
}
1651+
1652+
ionic_lif_quiesce(lif);
16421653
}
16431654

16441655
static void ionic_txrx_deinit(struct ionic_lif *lif)
@@ -1773,7 +1784,7 @@ static int ionic_txrx_init(struct ionic_lif *lif)
17731784
if (lif->netdev->features & NETIF_F_RXHASH)
17741785
ionic_lif_rss_init(lif);
17751786

1776-
ionic_set_rx_mode(lif->netdev, false);
1787+
ionic_set_rx_mode(lif->netdev, CAN_SLEEP);
17771788

17781789
return 0;
17791790

@@ -2781,7 +2792,7 @@ static int ionic_station_set(struct ionic_lif *lif)
27812792
*/
27822793
if (!ether_addr_equal(ctx.comp.lif_getattr.mac,
27832794
netdev->dev_addr))
2784-
ionic_lif_addr(lif, netdev->dev_addr, true, true);
2795+
ionic_lif_addr(lif, netdev->dev_addr, ADD_ADDR, CAN_SLEEP);
27852796
} else {
27862797
/* Update the netdev mac with the device's mac */
27872798
memcpy(addr.sa_data, ctx.comp.lif_getattr.mac, netdev->addr_len);
@@ -2798,7 +2809,7 @@ static int ionic_station_set(struct ionic_lif *lif)
27982809

27992810
netdev_dbg(lif->netdev, "adding station MAC addr %pM\n",
28002811
netdev->dev_addr);
2801-
ionic_lif_addr(lif, netdev->dev_addr, true, true);
2812+
ionic_lif_addr(lif, netdev->dev_addr, ADD_ADDR, CAN_SLEEP);
28022813

28032814
return 0;
28042815
}
@@ -2959,6 +2970,8 @@ int ionic_lif_register(struct ionic_lif *lif)
29592970
dev_err(lif->ionic->dev, "Cannot register net device, aborting\n");
29602971
return err;
29612972
}
2973+
2974+
ionic_link_status_check_request(lif, true);
29622975
lif->registered = true;
29632976
ionic_lif_set_netdev_info(lif);
29642977

drivers/net/ethernet/pensando/ionic/ionic_lif.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,12 @@
1313

1414
#define IONIC_MAX_NUM_NAPI_CNTR (NAPI_POLL_WEIGHT + 1)
1515
#define IONIC_MAX_NUM_SG_CNTR (IONIC_TX_MAX_SG_ELEMS + 1)
16+
17+
#define ADD_ADDR true
18+
#define DEL_ADDR false
19+
#define CAN_SLEEP true
20+
#define CAN_NOT_SLEEP false
21+
1622
#define IONIC_RX_COPYBREAK_DEFAULT 256
1723
#define IONIC_TX_BUDGET_DEFAULT 256
1824

drivers/net/ethernet/pensando/ionic/ionic_txrx.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -392,11 +392,6 @@ void ionic_rx_fill(struct ionic_queue *q)
392392
q->dbval | q->head_idx);
393393
}
394394

395-
static void ionic_rx_fill_cb(void *arg)
396-
{
397-
ionic_rx_fill(arg);
398-
}
399-
400395
void ionic_rx_empty(struct ionic_queue *q)
401396
{
402397
struct ionic_desc_info *desc_info;
@@ -480,6 +475,7 @@ int ionic_rx_napi(struct napi_struct *napi, int budget)
480475
struct ionic_cq *cq = napi_to_cq(napi);
481476
struct ionic_dev *idev;
482477
struct ionic_lif *lif;
478+
u16 rx_fill_threshold;
483479
u32 work_done = 0;
484480
u32 flags = 0;
485481

@@ -489,7 +485,9 @@ int ionic_rx_napi(struct napi_struct *napi, int budget)
489485
work_done = ionic_cq_service(cq, budget,
490486
ionic_rx_service, NULL, NULL);
491487

492-
if (work_done)
488+
rx_fill_threshold = min_t(u16, IONIC_RX_FILL_THRESHOLD,
489+
cq->num_descs / IONIC_RX_FILL_DIV);
490+
if (work_done && ionic_q_space_avail(cq->bound_q) >= rx_fill_threshold)
493491
ionic_rx_fill(cq->bound_q);
494492

495493
if (work_done < budget && napi_complete_done(napi, work_done)) {
@@ -518,6 +516,7 @@ int ionic_txrx_napi(struct napi_struct *napi, int budget)
518516
struct ionic_dev *idev;
519517
struct ionic_lif *lif;
520518
struct ionic_cq *txcq;
519+
u16 rx_fill_threshold;
521520
u32 rx_work_done = 0;
522521
u32 tx_work_done = 0;
523522
u32 flags = 0;
@@ -531,8 +530,11 @@ int ionic_txrx_napi(struct napi_struct *napi, int budget)
531530

532531
rx_work_done = ionic_cq_service(rxcq, budget,
533532
ionic_rx_service, NULL, NULL);
534-
if (rx_work_done)
535-
ionic_rx_fill_cb(rxcq->bound_q);
533+
534+
rx_fill_threshold = min_t(u16, IONIC_RX_FILL_THRESHOLD,
535+
rxcq->num_descs / IONIC_RX_FILL_DIV);
536+
if (rx_work_done && ionic_q_space_avail(rxcq->bound_q) >= rx_fill_threshold)
537+
ionic_rx_fill(rxcq->bound_q);
536538

537539
if (rx_work_done < budget && napi_complete_done(napi, rx_work_done)) {
538540
ionic_dim_update(qcq);

0 commit comments

Comments
 (0)