Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 53ab1c64 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Roland Dreier
Browse files

IB/qib: Correct nfreectxts for multiple HCAs



The code that was recently introduced to report the number
of free contexts is flawed for multiple HCAs:

       /* Return the number of free user ports (contexts) available. */
       return scnprintf(buf, PAGE_SIZE, "%u\n", dd->cfgctxts -
                dd->first_user_ctxt - (u32)qib_stats.sps_ctxts);

The qib_stats is global to the module, not per HCA, so the code is broken
for multiple HCAs.

This patch adds a qib_devdata field, freectxts, that reflects the free
contexts for this HCA.

Signed-off-by: default avatarMike Marciniszyn <mike.marciniszyn@qlogic.com>
Reviewed-by: default avatarRam Vepa <ram.vepa@qlogic.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent 976d1676
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -807,6 +807,10 @@ struct qib_devdata {
	 * supports, less gives more pio bufs/ctxt, etc.
	 */
	u32 cfgctxts;
	/*
	 * number of ctxts available for PSM open
	 */
	u32 freectxts;

	/*
	 * hint that we should update pioavailshadow before
+2 −0
Original line number Diff line number Diff line
@@ -1284,6 +1284,7 @@ static int setup_ctxt(struct qib_pportdata *ppd, int ctxt,
	strlcpy(rcd->comm, current->comm, sizeof(rcd->comm));
	ctxt_fp(fp) = rcd;
	qib_stats.sps_ctxts++;
	dd->freectxts++;
	ret = 0;
	goto bail;

@@ -1792,6 +1793,7 @@ static int qib_close(struct inode *in, struct file *fp)
		if (dd->pageshadow)
			unlock_expected_tids(rcd);
		qib_stats.sps_ctxts--;
		dd->freectxts--;
	}

	mutex_unlock(&qib_mutex);
+1 −0
Original line number Diff line number Diff line
@@ -398,6 +398,7 @@ static void enable_chip(struct qib_devdata *dd)
		if (rcd)
			dd->f_rcvctrl(rcd->ppd, rcvmask, i);
	}
	dd->freectxts = dd->cfgctxts - dd->first_user_ctxt;
}

static void verify_interrupt(unsigned long opaque)
+1 −2
Original line number Diff line number Diff line
@@ -515,8 +515,7 @@ static ssize_t show_nfreectxts(struct device *device,
	struct qib_devdata *dd = dd_from_dev(dev);

	/* Return the number of free user ports (contexts) available. */
	return scnprintf(buf, PAGE_SIZE, "%u\n", dd->cfgctxts -
		dd->first_user_ctxt - (u32)qib_stats.sps_ctxts);
	return scnprintf(buf, PAGE_SIZE, "%u\n", dd->freectxts);
}

static ssize_t show_serial(struct device *device,