diff options
author | Shannon Nelson <shannon.nelson@amd.com> | 2024-03-06 15:29:49 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2024-03-08 11:54:34 +0000 |
commit | ae24a8f88b3fc8ef463e8dffd41ebba48c81cfd4 (patch) | |
tree | 052f9c57022af950f10d4d5283c72535385105cb /drivers/net/ethernet/pensando/ionic/ionic_main.c | |
parent | 05c9447395e52ba87a66e25031025ef0a5095317 (diff) |
ionic: remove callback pointer from desc_info
By reworking the queue service routines to have their own
servicing loops we can remove the cb pointer from desc_info
to save another 8 bytes per descriptor,
This simplifies some of the queue handling indirection and makes
the code a little easier to follow, and keeps service code in
one place rather than jumping between code files.
struct ionic_desc_info
Before: /* size: 472, cachelines: 8, members: 7 */
After: /* size: 464, cachelines: 8, members: 6 */
Suggested-by: Neel Patel <npatel2@amd.com>
Reviewed-by: Brett Creeley <brett.creeley@amd.com>
Signed-off-by: Shannon Nelson <shannon.nelson@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/pensando/ionic/ionic_main.c')
-rw-r--r-- | drivers/net/ethernet/pensando/ionic/ionic_main.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/drivers/net/ethernet/pensando/ionic/ionic_main.c b/drivers/net/ethernet/pensando/ionic/ionic_main.c index 46f2aa34330d..023c2c37056e 100644 --- a/drivers/net/ethernet/pensando/ionic/ionic_main.c +++ b/drivers/net/ethernet/pensando/ionic/ionic_main.c @@ -207,8 +207,7 @@ static void ionic_adminq_flush(struct ionic_lif *lif) desc = &q->adminq[q->tail_idx]; desc_info = &q->info[q->tail_idx]; memset(desc, 0, sizeof(union ionic_adminq_cmd)); - desc_info->cb = NULL; - desc_info->cb_arg = NULL; + desc_info->arg = NULL; q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1); } spin_unlock_irqrestore(&lif->adminq_lock, irqflags); @@ -248,11 +247,11 @@ static int ionic_adminq_check_err(struct ionic_lif *lif, return err; } -static void ionic_adminq_cb(struct ionic_queue *q, - struct ionic_desc_info *desc_info, - struct ionic_cq_info *cq_info, void *cb_arg) +static void ionic_adminq_clean(struct ionic_queue *q, + struct ionic_desc_info *desc_info, + struct ionic_cq_info *cq_info) { - struct ionic_admin_ctx *ctx = cb_arg; + struct ionic_admin_ctx *ctx = desc_info->arg; struct ionic_admin_comp *comp; if (!ctx) @@ -280,7 +279,7 @@ bool ionic_notifyq_service(struct ionic_cq *cq, u64 eid; q = cq->bound_q; - lif = q->info[0].cb_arg; + lif = q->info[0].arg; netdev = lif->netdev; eid = le64_to_cpu(comp->event.eid); @@ -321,15 +320,30 @@ bool ionic_notifyq_service(struct ionic_cq *cq, return true; } -bool ionic_adminq_service(struct ionic_cq *cq, - struct ionic_cq_info *cq_info) +bool ionic_adminq_service(struct ionic_cq *cq, struct ionic_cq_info *cq_info) { - struct ionic_admin_comp *comp = cq_info->cq_desc; + struct ionic_queue *q = cq->bound_q; + struct ionic_desc_info *desc_info; + struct ionic_admin_comp *comp; + u16 index; + + comp = cq_info->cq_desc; if (!color_match(comp->color, cq->done_color)) return false; - ionic_q_service(cq->bound_q, cq_info, le16_to_cpu(comp->comp_index)); + /* check for empty queue */ + if (q->tail_idx == q->head_idx) + return false; + + do { + desc_info = &q->info[q->tail_idx]; + index = q->tail_idx; + q->tail_idx = (q->tail_idx + 1) & (q->num_descs - 1); + if (likely(desc_info->arg)) + ionic_adminq_clean(q, desc_info, cq_info); + desc_info->arg = NULL; + } while (index != le16_to_cpu(comp->comp_index)); return true; } @@ -394,7 +408,7 @@ int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) dynamic_hex_dump("cmd ", DUMP_PREFIX_OFFSET, 16, 1, &ctx->cmd, sizeof(ctx->cmd), true); - ionic_q_post(q, true, ionic_adminq_cb, ctx); + ionic_q_post(q, true, ctx); err_out: spin_unlock_irqrestore(&lif->adminq_lock, irqflags); |