Commit 9e1c0e43 authored by Mike Marciniszyn's avatar Mike Marciniszyn Committed by Roland Dreier

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: default avatarMike Marciniszyn <mike.marciniszyn@qlogic.com>
Signed-off-by: default avatarRoland Dreier <roland@purestorage.com>
parent cc6ea138
...@@ -171,7 +171,9 @@ struct qib_ctxtdata { ...@@ -171,7 +171,9 @@ struct qib_ctxtdata {
/* how many alloc_pages() chunks in rcvegrbuf_pages */ /* how many alloc_pages() chunks in rcvegrbuf_pages */
u32 rcvegrbuf_chunks; u32 rcvegrbuf_chunks;
/* how many egrbufs per chunk */ /* how many egrbufs per chunk */
u32 rcvegrbufs_perchunk; u16 rcvegrbufs_perchunk;
/* ilog2 of above */
u16 rcvegrbufs_perchunk_shift;
/* order for rcvegrbuf_pages */ /* order for rcvegrbuf_pages */
size_t rcvegrbuf_size; size_t rcvegrbuf_size;
/* rcvhdrq size (for freeing) */ /* rcvhdrq size (for freeing) */
...@@ -940,7 +942,9 @@ struct qib_devdata { ...@@ -940,7 +942,9 @@ struct qib_devdata {
/* chip address space used by 4k pio buffers */ /* chip address space used by 4k pio buffers */
u32 align4k; u32 align4k;
/* size of each rcvegrbuffer */ /* 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 */ /* localbus width (1, 2,4,8,16,32) from config space */
u32 lbus_width; u32 lbus_width;
/* localbus speed in MHz */ /* localbus speed in MHz */
......
...@@ -279,10 +279,10 @@ int qib_set_linkstate(struct qib_pportdata *ppd, u8 newstate) ...@@ -279,10 +279,10 @@ int qib_set_linkstate(struct qib_pportdata *ppd, u8 newstate)
*/ */
static inline void *qib_get_egrbuf(const struct qib_ctxtdata *rcd, u32 etail) static inline void *qib_get_egrbuf(const struct qib_ctxtdata *rcd, u32 etail)
{ {
const u32 chunk = etail / rcd->rcvegrbufs_perchunk; const u32 chunk = etail >> rcd->rcvegrbufs_perchunk_shift;
const u32 idx = etail % rcd->rcvegrbufs_perchunk; 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) ...@@ -3273,6 +3273,8 @@ static int init_6120_variables(struct qib_devdata *dd)
/* we always allocate at least 2048 bytes for eager buffers */ /* we always allocate at least 2048 bytes for eager buffers */
ret = ib_mtu_enum_to_int(qib_ibmtu); ret = ib_mtu_enum_to_int(qib_ibmtu);
dd->rcvegrbufsize = ret != -1 ? max(ret, 2048) : QIB_DEFAULT_MTU; 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); qib_6120_tidtemplate(dd);
......
...@@ -4085,6 +4085,8 @@ static int qib_init_7220_variables(struct qib_devdata *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 */ /* we always allocate at least 2048 bytes for eager buffers */
ret = ib_mtu_enum_to_int(qib_ibmtu); ret = ib_mtu_enum_to_int(qib_ibmtu);
dd->rcvegrbufsize = ret != -1 ? max(ret, 2048) : QIB_DEFAULT_MTU; 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); qib_7220_tidtemplate(dd);
......
...@@ -6205,6 +6205,8 @@ static int qib_init_7322_variables(struct qib_devdata *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 */ /* we always allocate at least 2048 bytes for eager buffers */
dd->rcvegrbufsize = max(mtu, 2048); dd->rcvegrbufsize = max(mtu, 2048);
BUG_ON(!is_power_of_2(dd->rcvegrbufsize));
dd->rcvegrbufsize_shift = ilog2(dd->rcvegrbufsize);
qib_7322_tidtemplate(dd); qib_7322_tidtemplate(dd);
......
...@@ -183,6 +183,9 @@ struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt) ...@@ -183,6 +183,9 @@ struct qib_ctxtdata *qib_create_ctxtdata(struct qib_pportdata *ppd, u32 ctxt)
rcd->rcvegrbuf_chunks = (rcd->rcvegrcnt + rcd->rcvegrbuf_chunks = (rcd->rcvegrcnt +
rcd->rcvegrbufs_perchunk - 1) / rcd->rcvegrbufs_perchunk - 1) /
rcd->rcvegrbufs_perchunk; rcd->rcvegrbufs_perchunk;
BUG_ON(!is_power_of_2(rcd->rcvegrbufs_perchunk));
rcd->rcvegrbufs_perchunk_shift =
ilog2(rcd->rcvegrbufs_perchunk);
} }
return rcd; return rcd;
} }
......
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