Skip to content

Commit f1d2e89

Browse files
emuslndavem330
authored andcommitted
ionic: use index not pointer for queue tracking
Use index counters rather than pointers for tracking head and tail in the queues to save a little memory and to perhaps slightly faster queue processing. Signed-off-by: Shannon Nelson <snelson@pensando.io> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ea5a8b0 commit f1d2e89

File tree

7 files changed

+129
-88
lines changed

7 files changed

+129
-88
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ static int q_tail_show(struct seq_file *seq, void *v)
7676
{
7777
struct ionic_queue *q = seq->private;
7878

79-
seq_printf(seq, "%d\n", q->tail->index);
79+
seq_printf(seq, "%d\n", q->tail_idx);
8080

8181
return 0;
8282
}
@@ -86,7 +86,7 @@ static int q_head_show(struct seq_file *seq, void *v)
8686
{
8787
struct ionic_queue *q = seq->private;
8888

89-
seq_printf(seq, "%d\n", q->head->index);
89+
seq_printf(seq, "%d\n", q->head_idx);
9090

9191
return 0;
9292
}
@@ -96,7 +96,7 @@ static int cq_tail_show(struct seq_file *seq, void *v)
9696
{
9797
struct ionic_cq *cq = seq->private;
9898

99-
seq_printf(seq, "%d\n", cq->tail->index);
99+
seq_printf(seq, "%d\n", cq->tail_idx);
100100

101101
return 0;
102102
}

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

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,7 @@ int ionic_cq_init(struct ionic_lif *lif, struct ionic_cq *cq,
482482
cq->bound_intr = intr;
483483
cq->num_descs = num_descs;
484484
cq->desc_size = desc_size;
485-
cq->tail = cq->info;
485+
cq->tail_idx = 0;
486486
cq->done_color = 1;
487487

488488
cur = cq->info;
@@ -522,15 +522,18 @@ unsigned int ionic_cq_service(struct ionic_cq *cq, unsigned int work_to_do,
522522
ionic_cq_cb cb, ionic_cq_done_cb done_cb,
523523
void *done_arg)
524524
{
525+
struct ionic_cq_info *cq_info;
525526
unsigned int work_done = 0;
526527

527528
if (work_to_do == 0)
528529
return 0;
529530

530-
while (cb(cq, cq->tail)) {
531-
if (cq->tail->last)
531+
cq_info = &cq->info[cq->tail_idx];
532+
while (cb(cq, cq_info)) {
533+
if (cq->tail_idx == cq->num_descs - 1)
532534
cq->done_color = !cq->done_color;
533-
cq->tail = cq->tail->next;
535+
cq->tail_idx = (cq->tail_idx + 1) & (cq->num_descs - 1);
536+
cq_info = &cq->info[cq->tail_idx];
534537
DEBUG_STATS_CQE_CNT(cq);
535538

536539
if (++work_done >= work_to_do)
@@ -565,8 +568,8 @@ int ionic_q_init(struct ionic_lif *lif, struct ionic_dev *idev,
565568
q->num_descs = num_descs;
566569
q->desc_size = desc_size;
567570
q->sg_desc_size = sg_desc_size;
568-
q->tail = q->info;
569-
q->head = q->tail;
571+
q->tail_idx = 0;
572+
q->head_idx = 0;
570573
q->pid = pid;
571574

572575
snprintf(q->name, sizeof(q->name), "L%d-%s%u", lif->index, name, index);
@@ -614,28 +617,31 @@ void ionic_q_post(struct ionic_queue *q, bool ring_doorbell, ionic_desc_cb cb,
614617
void *cb_arg)
615618
{
616619
struct device *dev = q->lif->ionic->dev;
620+
struct ionic_desc_info *desc_info;
617621
struct ionic_lif *lif = q->lif;
618622

619-
q->head->cb = cb;
620-
q->head->cb_arg = cb_arg;
621-
q->head = q->head->next;
623+
desc_info = &q->info[q->head_idx];
624+
desc_info->cb = cb;
625+
desc_info->cb_arg = cb_arg;
626+
627+
q->head_idx = (q->head_idx + 1) & (q->num_descs - 1);
622628

623629
dev_dbg(dev, "lif=%d qname=%s qid=%d qtype=%d p_index=%d ringdb=%d\n",
624630
q->lif->index, q->name, q->hw_type, q->hw_index,
625-
q->head->index, ring_doorbell);
631+
q->head_idx, ring_doorbell);
626632

627633
if (ring_doorbell)
628634
ionic_dbell_ring(lif->kern_dbpage, q->hw_type,
629-
q->dbval | q->head->index);
635+
q->dbval | q->head_idx);
630636
}
631637

632638
static bool ionic_q_is_posted(struct ionic_queue *q, unsigned int pos)
633639
{
634640
unsigned int mask, tail, head;
635641

636642
mask = q->num_descs - 1;
637-
tail = q->tail->index;
638-
head = q->head->index;
643+
tail = q->tail_idx;
644+
head = q->head_idx;
639645

640646
return ((pos - tail) & mask) < ((head - tail) & mask);
641647
}
@@ -648,18 +654,18 @@ void ionic_q_service(struct ionic_queue *q, struct ionic_cq_info *cq_info,
648654
void *cb_arg;
649655

650656
/* check for empty queue */
651-
if (q->tail->index == q->head->index)
657+
if (q->tail_idx == q->head_idx)
652658
return;
653659

654660
/* stop index must be for a descriptor that is not yet completed */
655661
if (unlikely(!ionic_q_is_posted(q, stop_index)))
656662
dev_err(q->lif->ionic->dev,
657663
"ionic stop is not posted %s stop %u tail %u head %u\n",
658-
q->name, stop_index, q->tail->index, q->head->index);
664+
q->name, stop_index, q->tail_idx, q->head_idx);
659665

660666
do {
661-
desc_info = q->tail;
662-
q->tail = desc_info->next;
667+
desc_info = &q->info[q->tail_idx];
668+
q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1);
663669

664670
cb = desc_info->cb;
665671
cb_arg = desc_info->cb_arg;

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

Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,13 @@ struct ionic_dev {
149149
};
150150

151151
struct ionic_cq_info {
152-
void *cq_desc;
152+
union {
153+
void *cq_desc;
154+
struct ionic_txq_comp *txcq;
155+
struct ionic_rxq_comp *rxcq;
156+
struct ionic_admin_comp *admincq;
157+
struct ionic_notifyq_event *notifyq;
158+
};
153159
struct ionic_cq_info *next;
154160
unsigned int index;
155161
bool last;
@@ -169,8 +175,17 @@ struct ionic_page_info {
169175
};
170176

171177
struct ionic_desc_info {
172-
void *desc;
173-
void *sg_desc;
178+
union {
179+
void *desc;
180+
struct ionic_txq_desc *txq_desc;
181+
struct ionic_rxq_desc *rxq_desc;
182+
struct ionic_admin_cmd *adminq_desc;
183+
};
184+
union {
185+
void *sg_desc;
186+
struct ionic_txq_sg_desc *txq_sg_desc;
187+
struct ionic_rxq_sg_desc *rxq_sgl_desc;
188+
};
174189
struct ionic_desc_info *next;
175190
unsigned int index;
176191
unsigned int left;
@@ -183,22 +198,32 @@ struct ionic_desc_info {
183198
#define IONIC_QUEUE_NAME_MAX_SZ 32
184199

185200
struct ionic_queue {
201+
struct device *dev;
186202
u64 dbell_count;
187203
u64 drop;
188204
u64 stop;
189205
u64 wake;
190206
struct ionic_lif *lif;
191207
struct ionic_desc_info *info;
192-
struct ionic_desc_info *tail;
193-
struct ionic_desc_info *head;
194208
struct ionic_dev *idev;
209+
u16 head_idx;
210+
u16 tail_idx;
195211
unsigned int index;
196212
unsigned int type;
197213
unsigned int hw_index;
198214
unsigned int hw_type;
199215
u64 dbval;
200-
void *base;
201-
void *sg_base;
216+
union {
217+
void *base;
218+
struct ionic_txq_desc *txq;
219+
struct ionic_rxq_desc *rxq;
220+
struct ionic_admin_cmd *adminq;
221+
};
222+
union {
223+
void *sg_base;
224+
struct ionic_txq_sg_desc *txq_sgl;
225+
struct ionic_rxq_sg_desc *rxq_sgl;
226+
};
202227
dma_addr_t base_pa;
203228
dma_addr_t sg_base_pa;
204229
unsigned int num_descs;
@@ -225,9 +250,9 @@ struct ionic_cq {
225250
dma_addr_t base_pa;
226251
struct ionic_lif *lif;
227252
struct ionic_cq_info *info;
228-
struct ionic_cq_info *tail;
229253
struct ionic_queue *bound_q;
230254
struct ionic_intr_info *bound_intr;
255+
u16 tail_idx;
231256
bool done_color;
232257
unsigned int num_descs;
233258
u64 compl_count;
@@ -246,12 +271,12 @@ static inline void ionic_intr_init(struct ionic_dev *idev,
246271

247272
static inline unsigned int ionic_q_space_avail(struct ionic_queue *q)
248273
{
249-
unsigned int avail = q->tail->index;
274+
unsigned int avail = q->tail_idx;
250275

251-
if (q->head->index >= avail)
252-
avail += q->head->left - 1;
276+
if (q->head_idx >= avail)
277+
avail += q->num_descs - q->head_idx - 1;
253278
else
254-
avail -= q->head->index + 1;
279+
avail -= q->head_idx + 1;
255280

256281
return avail;
257282
}

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -632,9 +632,9 @@ static int ionic_lif_txq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
632632
dev_dbg(dev, "txq_init.ver %d\n", ctx.cmd.q_init.ver);
633633
dev_dbg(dev, "txq_init.intr_index %d\n", ctx.cmd.q_init.intr_index);
634634

635-
q->tail = q->info;
636-
q->head = q->tail;
637-
cq->tail = cq->info;
635+
q->tail_idx = 0;
636+
q->head_idx = 0;
637+
cq->tail_idx = 0;
638638

639639
err = ionic_adminq_post_wait(lif, &ctx);
640640
if (err)
@@ -689,9 +689,9 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
689689
dev_dbg(dev, "rxq_init.ver %d\n", ctx.cmd.q_init.ver);
690690
dev_dbg(dev, "rxq_init.intr_index %d\n", ctx.cmd.q_init.intr_index);
691691

692-
q->tail = q->info;
693-
q->head = q->tail;
694-
cq->tail = cq->info;
692+
q->tail_idx = 0;
693+
q->head_idx = 0;
694+
cq->tail_idx = 0;
695695

696696
err = ionic_adminq_post_wait(lif, &ctx);
697697
if (err)

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -244,14 +244,15 @@ int ionic_lif_rss_config(struct ionic_lif *lif, u16 types,
244244

245245
int ionic_reset_queues(struct ionic_lif *lif, ionic_reset_cb cb, void *arg);
246246

247-
static inline void debug_stats_txq_post(struct ionic_queue *q,
248-
struct ionic_txq_desc *desc, bool dbell)
247+
static inline void debug_stats_txq_post(struct ionic_queue *q, bool dbell)
249248
{
250-
u8 num_sg_elems = ((le64_to_cpu(desc->cmd) >> IONIC_TXQ_DESC_NSGE_SHIFT)
251-
& IONIC_TXQ_DESC_NSGE_MASK);
249+
struct ionic_txq_desc *desc = &q->txq[q->head_idx];
250+
u8 num_sg_elems;
252251

253252
q->dbell_count += dbell;
254253

254+
num_sg_elems = ((le64_to_cpu(desc->cmd) >> IONIC_TXQ_DESC_NSGE_SHIFT)
255+
& IONIC_TXQ_DESC_NSGE_MASK);
255256
if (num_sg_elems > (IONIC_MAX_NUM_SG_CNTR - 1))
256257
num_sg_elems = IONIC_MAX_NUM_SG_CNTR - 1;
257258

@@ -272,8 +273,7 @@ static inline void debug_stats_napi_poll(struct ionic_qcq *qcq,
272273
#define DEBUG_STATS_CQE_CNT(cq) ((cq)->compl_count++)
273274
#define DEBUG_STATS_RX_BUFF_CNT(q) ((q)->lif->rxqstats[q->index].buffers_posted++)
274275
#define DEBUG_STATS_INTR_REARM(intr) ((intr)->rearm_count++)
275-
#define DEBUG_STATS_TXQ_POST(q, txdesc, dbell) \
276-
debug_stats_txq_post(q, txdesc, dbell)
276+
#define DEBUG_STATS_TXQ_POST(q, dbell) debug_stats_txq_post(q, dbell)
277277
#define DEBUG_STATS_NAPI_POLL(qcq, work_done) \
278278
debug_stats_napi_poll(qcq, work_done)
279279

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

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,17 @@ static const char *ionic_opcode_to_str(enum ionic_cmd_opcode opcode)
181181

182182
static void ionic_adminq_flush(struct ionic_lif *lif)
183183
{
184-
struct ionic_queue *adminq = &lif->adminqcq->q;
184+
struct ionic_queue *q = &lif->adminqcq->q;
185+
struct ionic_desc_info *desc_info;
185186

186187
spin_lock(&lif->adminq_lock);
187188

188-
while (adminq->tail != adminq->head) {
189-
memset(adminq->tail->desc, 0, sizeof(union ionic_adminq_cmd));
190-
adminq->tail->cb = NULL;
191-
adminq->tail->cb_arg = NULL;
192-
adminq->tail = adminq->tail->next;
189+
while (q->tail_idx != q->head_idx) {
190+
desc_info = &q->info[q->tail_idx];
191+
memset(desc_info->desc, 0, sizeof(union ionic_adminq_cmd));
192+
desc_info->cb = NULL;
193+
desc_info->cb_arg = NULL;
194+
q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1);
193195
}
194196
spin_unlock(&lif->adminq_lock);
195197
}
@@ -245,18 +247,19 @@ static void ionic_adminq_cb(struct ionic_queue *q,
245247

246248
static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
247249
{
248-
struct ionic_queue *adminq;
250+
struct ionic_desc_info *desc_info;
251+
struct ionic_queue *q;
249252
int err = 0;
250253

251254
WARN_ON(in_interrupt());
252255

253256
if (!lif->adminqcq)
254257
return -EIO;
255258

256-
adminq = &lif->adminqcq->q;
259+
q = &lif->adminqcq->q;
257260

258261
spin_lock(&lif->adminq_lock);
259-
if (!ionic_q_has_space(adminq, 1)) {
262+
if (!ionic_q_has_space(q, 1)) {
260263
err = -ENOSPC;
261264
goto err_out;
262265
}
@@ -265,13 +268,14 @@ static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
265268
if (err)
266269
goto err_out;
267270

268-
memcpy(adminq->head->desc, &ctx->cmd, sizeof(ctx->cmd));
271+
desc_info = &q->info[q->head_idx];
272+
memcpy(desc_info->desc, &ctx->cmd, sizeof(ctx->cmd));
269273

270274
dev_dbg(&lif->netdev->dev, "post admin queue command:\n");
271275
dynamic_hex_dump("cmd ", DUMP_PREFIX_OFFSET, 16, 1,
272276
&ctx->cmd, sizeof(ctx->cmd), true);
273277

274-
ionic_q_post(adminq, true, ionic_adminq_cb, ctx);
278+
ionic_q_post(q, true, ionic_adminq_cb, ctx);
275279

276280
err_out:
277281
spin_unlock(&lif->adminq_lock);

0 commit comments

Comments
 (0)