Commit a4674f34 authored by Shannon Nelson's avatar Shannon Nelson Committed by David S. Miller

ionic: check for NULL structs on teardown

Make sure the queue structs exist before trying to tear
them down to make for safer error recovery.

Fixes: 0f3154e6 ("ionic: Add Tx and Rx handling")
Signed-off-by: default avatarShannon Nelson <snelson@pensando.io>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent b9c17d39
...@@ -320,19 +320,21 @@ static void ionic_qcqs_free(struct ionic_lif *lif) ...@@ -320,19 +320,21 @@ static void ionic_qcqs_free(struct ionic_lif *lif)
lif->adminqcq = NULL; lif->adminqcq = NULL;
} }
for (i = 0; i < lif->nxqs; i++) if (lif->rxqcqs) {
if (lif->rxqcqs[i].stats) for (i = 0; i < lif->nxqs; i++)
devm_kfree(dev, lif->rxqcqs[i].stats); if (lif->rxqcqs[i].stats)
devm_kfree(dev, lif->rxqcqs[i].stats);
devm_kfree(dev, lif->rxqcqs); devm_kfree(dev, lif->rxqcqs);
lif->rxqcqs = NULL; lif->rxqcqs = NULL;
}
for (i = 0; i < lif->nxqs; i++)
if (lif->txqcqs[i].stats)
devm_kfree(dev, lif->txqcqs[i].stats);
devm_kfree(dev, lif->txqcqs); if (lif->txqcqs) {
lif->txqcqs = NULL; for (i = 0; i < lif->nxqs; i++)
if (lif->txqcqs[i].stats)
devm_kfree(dev, lif->txqcqs[i].stats);
devm_kfree(dev, lif->txqcqs);
lif->txqcqs = NULL;
}
} }
static void ionic_link_qcq_interrupts(struct ionic_qcq *src_qcq, static void ionic_link_qcq_interrupts(struct ionic_qcq *src_qcq,
......
...@@ -243,11 +243,16 @@ static void ionic_adminq_cb(struct ionic_queue *q, ...@@ -243,11 +243,16 @@ static void ionic_adminq_cb(struct ionic_queue *q,
static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx) static int ionic_adminq_post(struct ionic_lif *lif, struct ionic_admin_ctx *ctx)
{ {
struct ionic_queue *adminq = &lif->adminqcq->q; struct ionic_queue *adminq;
int err = 0; int err = 0;
WARN_ON(in_interrupt()); WARN_ON(in_interrupt());
if (!lif->adminqcq)
return -EIO;
adminq = &lif->adminqcq->q;
spin_lock(&lif->adminq_lock); spin_lock(&lif->adminq_lock);
if (!ionic_q_has_space(adminq, 1)) { if (!ionic_q_has_space(adminq, 1)) {
err = -ENOSPC; err = -ENOSPC;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment