mirror of
https://github.com/torvalds/linux.git
synced 2024-12-16 16:12:52 +00:00
IB/qib: Eliminate divide/mod in converting idx to egr buf pointer
The context init now saves a shift from rcvegrbufs_perchunk rcvegrbufs_perchunk_shift using ilog2. A BUG_ON() protects the power of 2 assumption. Signed-off-by: Mike Marciniszyn <mike.marciniszyn@qlogic.com> Signed-off-by: Roland Dreier <roland@purestorage.com>
This commit is contained in:
parent
cc6ea1385b
commit
9e1c0e4325
@ -171,7 +171,9 @@ struct qib_ctxtdata {
|
||||
/* how many alloc_pages() chunks in rcvegrbuf_pages */
|
||||
u32 rcvegrbuf_chunks;
|
||||
/* how many egrbufs per chunk */
|
||||
u32 rcvegrbufs_perchunk;
|
||||
u16 rcvegrbufs_perchunk;
|
||||
/* ilog2 of above */
|
||||
u16 rcvegrbufs_perchunk_shift;
|
||||
/* order for rcvegrbuf_pages */
|
||||
size_t rcvegrbuf_size;
|
||||
/* rcvhdrq size (for freeing) */
|
||||
@ -940,7 +942,9 @@ struct qib_devdata {
|
||||
/* chip address space used by 4k pio buffers */
|
||||
u32 align4k;
|
||||
/* size of each rcvegrbuffer */
|
||||
u32 rcvegrbufsize;
|
||||
u16 rcvegrbufsize;
|
||||
/* log2 of above */
|
||||
u16 rcvegrbufsize_shift;
|
||||
/* localbus width (1, 2,4,8,16,32) from config space */
|
||||
u32 lbus_width;
|
||||
/* localbus speed in MHz */
|
||||
|
@ -279,10 +279,10 @@ bail:
|
||||
*/
|
||||
static inline void *qib_get_egrbuf(const struct qib_ctxtdata *rcd, u32 etail)
|
||||
{
|
||||
const u32 chunk = etail / rcd->rcvegrbufs_perchunk;
|
||||
const u32 idx = etail % rcd->rcvegrbufs_perchunk;
|
||||
const u32 chunk = etail >> rcd->rcvegrbufs_perchunk_shift;
|
||||
const u32 idx = etail & ((u32)rcd->rcvegrbufs_perchunk - 1);
|
||||
|
||||
return rcd->rcvegrbuf[chunk] + idx * rcd->dd->rcvegrbufsize;
|
||||
return rcd->rcvegrbuf[chunk] + (idx << rcd->dd->rcvegrbufsize_shift);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -3273,6 +3273,8 @@ static int init_6120_variables(struct qib_devdata *dd)
|
||||
/* we always allocate at least 2048 bytes for eager buffers */
|
||||
ret = ib_mtu_enum_to_int(qib_ibmtu);
|
||||
dd->rcvegrbufsize = ret != -1 ? max(ret, 2048) : QIB_DEFAULT_MTU;
|
||||
BUG_ON(!is_power_of_2(dd->rcvegrbufsize));
|
||||
dd->rcvegrbufsize_shift = ilog2(dd->rcvegrbufsize);
|
||||
|
||||
qib_6120_tidtemplate(dd);
|
||||
|
||||
|
@ -4085,6 +4085,8 @@ static int qib_init_7220_variables(struct qib_devdata *dd)
|
||||
/* we always allocate at least 2048 bytes for eager buffers */
|
||||
ret = ib_mtu_enum_to_int(qib_ibmtu);
|
||||
dd->rcvegrbufsize = ret != -1 ? max(ret, 2048) : QIB_DEFAULT_MTU;
|
||||
BUG_ON(!is_power_of_2(dd->rcvegrbufsize));
|
||||
dd->rcvegrbufsize_shift = ilog2(dd->rcvegrbufsize);
|
||||
|
||||
qib_7220_tidtemplate(dd);
|
||||
|
||||
|
@ -6205,6 +6205,8 @@ static int qib_init_7322_variables(struct qib_devdata *dd)
|
||||
|
||||
/* we always allocate at least 2048 bytes for eager buffers */
|
||||
dd->rcvegrbufsize = max(mtu, 2048);
|
||||
BUG_ON(!is_power_of_2(dd->rcvegrbufsize));
|
||||
dd->rcvegrbufsize_shift = ilog2(dd->rcvegrbufsize);
|
||||
|
||||
qib_7322_tidtemplate(dd);
|
||||
|
||||
|
@ -183,6 +183,9 @@ struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt)
|
||||
rcd->rcvegrbuf_chunks = (rcd->rcvegrcnt +
|
||||
rcd->rcvegrbufs_perchunk - 1) /
|
||||
rcd->rcvegrbufs_perchunk;
|
||||
BUG_ON(!is_power_of_2(rcd->rcvegrbufs_perchunk));
|
||||
rcd->rcvegrbufs_perchunk_shift =
|
||||
ilog2(rcd->rcvegrbufs_perchunk);
|
||||
}
|
||||
return rcd;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user