OSDN Git Service

IB/hfi1: Inline common calculation
authorMichael J. Ruhl <michael.j.ruhl@intel.com>
Tue, 26 Sep 2017 14:00:56 +0000 (07:00 -0700)
committerDoug Ledford <dledford@redhat.com>
Wed, 27 Sep 2017 15:34:13 +0000 (11:34 -0400)
Calculating the offset to a context is done several times throughout
the code.  Create a common inlined function for doing this
calculation.

Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Michael J. Ruhl <michael.j.ruhl@intel.com>
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/hfi1/file_ops.c
drivers/infiniband/hw/hfi1/hfi.h
drivers/infiniband/hw/hfi1/user_exp_rcv.c

index 2bc8926..668c9bc 100644 (file)
@@ -595,9 +595,8 @@ static int hfi1_file_mmap(struct file *fp, struct vm_area_struct *vma)
                 * Use the page where this context's flags are. User level
                 * knows where it's own bitmap is within the page.
                 */
-               memaddr = (unsigned long)(dd->events +
-                                 ((uctxt->ctxt - dd->first_dyn_alloc_ctxt) *
-                                  HFI1_MAX_SHARED_CTXTS)) & PAGE_MASK;
+               memaddr = (unsigned long)
+                       (dd->events + uctxt_offset(uctxt)) & PAGE_MASK;
                memlen = PAGE_SIZE;
                /*
                 * v3.7 removes VM_RESERVED but the effect is kept by
@@ -779,8 +778,7 @@ static int hfi1_file_close(struct inode *inode, struct file *fp)
         * Clear any left over, unhandled events so the next process that
         * gets this context doesn't get confused.
         */
-       ev = dd->events + ((uctxt->ctxt - dd->first_dyn_alloc_ctxt) *
-                          HFI1_MAX_SHARED_CTXTS) + fdata->subctxt;
+       ev = dd->events + uctxt_offset(uctxt) + fdata->subctxt;
        *ev = 0;
 
        spin_lock_irqsave(&dd->uctxt_lock, flags);
@@ -1389,9 +1387,8 @@ static int get_base_info(struct hfi1_filedata *fd, void __user *ubase,
         */
        binfo.user_regbase = HFI1_MMAP_TOKEN(UREGS, uctxt->ctxt,
                                            fd->subctxt, 0);
-       offset = offset_in_page((((uctxt->ctxt - dd->first_dyn_alloc_ctxt) *
-                   HFI1_MAX_SHARED_CTXTS) + fd->subctxt) *
-                 sizeof(*dd->events));
+       offset = offset_in_page((uctxt_offset(uctxt) + fd->subctxt) *
+                               sizeof(*dd->events));
        binfo.events_bufbase = HFI1_MMAP_TOKEN(EVENTS, uctxt->ctxt,
                                              fd->subctxt,
                                              offset);
@@ -1482,14 +1479,13 @@ int hfi1_set_uevent_bits(struct hfi1_pportdata *ppd, const int evtbit)
             ctxt++) {
                uctxt = hfi1_rcd_get_by_index(dd, ctxt);
                if (uctxt) {
-                       unsigned long *evs = dd->events +
-                               (uctxt->ctxt - dd->first_dyn_alloc_ctxt) *
-                               HFI1_MAX_SHARED_CTXTS;
+                       unsigned long *evs;
                        int i;
                        /*
                         * subctxt_cnt is 0 if not shared, so do base
                         * separately, first, then remaining subctxt, if any
                         */
+                       evs = dd->events + uctxt_offset(uctxt);
                        set_bit(evtbit, evs);
                        for (i = 1; i < uctxt->subctxt_cnt; i++)
                                set_bit(evtbit, evs + i);
@@ -1555,8 +1551,7 @@ static int user_event_ack(struct hfi1_ctxtdata *uctxt, u16 subctxt,
        if (!dd->events)
                return 0;
 
-       evs = dd->events + ((uctxt->ctxt - dd->first_dyn_alloc_ctxt) *
-                           HFI1_MAX_SHARED_CTXTS) + subctxt;
+       evs = dd->events + uctxt_offset(uctxt) + subctxt;
 
        for (i = 0; i <= _HFI1_MAX_EVENT_BIT; i++) {
                if (!test_bit(i, &events))
index 611eeba..fc1ee8d 100644 (file)
@@ -1374,6 +1374,12 @@ struct hfi1_devdata *hfi1_lookup(int unit);
 extern u32 hfi1_cpulist_count;
 extern unsigned long *hfi1_cpulist;
 
+static inline unsigned long uctxt_offset(struct hfi1_ctxtdata *uctxt)
+{
+       return (uctxt->ctxt - uctxt->dd->first_dyn_alloc_ctxt) *
+               HFI1_MAX_SHARED_CTXTS;
+}
+
 int hfi1_init(struct hfi1_devdata *dd, int reinit);
 int hfi1_count_active_units(void);
 
index 6f6c14d..ff9ad69 100644 (file)
@@ -542,8 +542,7 @@ int hfi1_user_exp_rcv_invalid(struct hfi1_filedata *fd,
 {
        struct hfi1_ctxtdata *uctxt = fd->uctxt;
        unsigned long *ev = uctxt->dd->events +
-               (((uctxt->ctxt - uctxt->dd->first_dyn_alloc_ctxt) *
-                 HFI1_MAX_SHARED_CTXTS) + fd->subctxt);
+               (uctxt_offset(uctxt) + fd->subctxt);
        u32 *array;
        int ret = 0;
 
@@ -942,8 +941,7 @@ static int tid_rb_invalidate(void *arg, struct mmu_rb_node *mnode)
                         * process in question.
                         */
                        ev = uctxt->dd->events +
-                         (((uctxt->ctxt - uctxt->dd->first_dyn_alloc_ctxt) *
-                           HFI1_MAX_SHARED_CTXTS) + fdata->subctxt);
+                               (uctxt_offset(uctxt) + fdata->subctxt);
                        set_bit(_HFI1_EVENT_TID_MMU_NOTIFY_BIT, ev);
                }
                fdata->invalid_tid_idx++;