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: Mike Marciniszyn <mike.marciniszyn@qlogic.com>
Reviewed-by: Ram Vepa <ram.vepa@qlogic.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
			
			
This commit is contained in:
		
							parent
							
								
									976d167615
								
							
						
					
					
						commit
						53ab1c6498
					
				| @ -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 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user