IB/ipath: Changes for fields moving from devdata to portdata
authorDave Olson <dave.olson@qlogic.com>
Thu, 6 Dec 2007 08:28:02 +0000 (00:28 -0800)
committerRoland Dreier <rolandd@cisco.com>
Fri, 25 Jan 2008 22:15:36 +0000 (14:15 -0800)
This patch moves some arrays that were defined per-device to be
variables defined in the per context data structure, thus avoiding extra
kzalloc() calls.

Signed-off-by: Dave Olson <dave.olson@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/hw/ipath/ipath_file_ops.c
drivers/infiniband/hw/ipath/ipath_init_chip.c
drivers/infiniband/hw/ipath/ipath_intr.c
drivers/infiniband/hw/ipath/ipath_kernel.h
drivers/infiniband/hw/ipath/ipath_stats.c

index 65da7a9..2a75faf 100644 (file)
@@ -1785,6 +1785,7 @@ static int find_shared_port(struct file *fp,
                        }
                        port_fp(fp) = pd;
                        subport_fp(fp) = pd->port_cnt++;
+                       pd->port_subpid[subport_fp(fp)] = current->pid;
                        tidcursor_fp(fp) = 0;
                        pd->active_slaves |= 1 << subport_fp(fp);
                        ipath_cdbg(PROC,
@@ -1915,8 +1916,7 @@ static int ipath_do_user_init(struct file *fp,
         */
        head32 = ipath_read_ureg32(dd, ur_rcvegrindextail, pd->port_port);
        ipath_write_ureg(dd, ur_rcvegrindexhead, head32, pd->port_port);
-       dd->ipath_lastegrheads[pd->port_port] = -1;
-       dd->ipath_lastrcvhdrqtails[pd->port_port] = -1;
+       pd->port_lastrcvhdrqtail = -1;
        ipath_cdbg(VERBOSE, "Wrote port%d egrhead %x from tail regs\n",
                pd->port_port, head32);
        pd->port_tidcursor = 0; /* start at beginning after open */
@@ -2019,6 +2019,7 @@ static int ipath_close(struct inode *in, struct file *fp)
                 * the slave(s) don't wait for receive data forever.
                 */
                pd->active_slaves &= ~(1 << fd->subport);
+               pd->port_subpid[fd->subport] = 0;
                mutex_unlock(&ipath_mutex);
                goto bail;
        }
index cf64d38..98b5146 100644 (file)
@@ -272,22 +272,7 @@ static int init_chip_first(struct ipath_devdata *dd,
                goto done;
        }
 
-       dd->ipath_lastegrheads = kzalloc(sizeof(*dd->ipath_lastegrheads)
-                                        * dd->ipath_cfgports,
-                                        GFP_KERNEL);
-       dd->ipath_lastrcvhdrqtails =
-               kzalloc(sizeof(*dd->ipath_lastrcvhdrqtails)
-                       * dd->ipath_cfgports, GFP_KERNEL);
-
-       if (!dd->ipath_lastegrheads || !dd->ipath_lastrcvhdrqtails) {
-               ipath_dev_err(dd, "Unable to allocate head arrays, "
-                             "failing\n");
-               ret = -ENOMEM;
-               goto done;
-       }
-
        pd = create_portdata0(dd);
-
        if (!pd) {
                ipath_dev_err(dd, "Unable to allocate portdata for port "
                              "0, failing\n");
index d9f8342..e2ce531 100644 (file)
@@ -693,7 +693,7 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs)
                                 * except kernel
                                 */
                                tl = *(u64 *) pd->port_rcvhdrtail_kvaddr;
-                               if (tl == dd->ipath_lastrcvhdrqtails[i])
+                               if (tl == pd->port_lastrcvhdrqtail)
                                        continue;
                                hd = ipath_read_ureg32(dd, ur_rcvhdrhead,
                                                       i);
@@ -703,7 +703,7 @@ static int handle_errors(struct ipath_devdata *dd, ipath_err_t errs)
                            (!hd && tl == dd->ipath_hdrqlast)) {
                                if (i == 0)
                                        chkerrpkts = 1;
-                               dd->ipath_lastrcvhdrqtails[i] = tl;
+                               pd->port_lastrcvhdrqtail = tl;
                                pd->port_hdrqfull++;
                                /* flush hdrqfull so that poll() sees it */
                                wmb();
index 57e21bb..7bb0d08 100644 (file)
@@ -141,6 +141,11 @@ struct ipath_portdata {
        u32 port_pionowait;
        /* total number of rcvhdrqfull errors */
        u32 port_hdrqfull;
+       /*
+        * Used to suppress multiple instances of same
+        * port staying stuck at same point.
+        */
+       u32 port_lastrcvhdrqtail;
        /* saved total number of rcvhdrqfull errors for poll edge trigger */
        u32 port_hdrqfull_poll;
        /* total number of polled urgent packets */
@@ -149,6 +154,7 @@ struct ipath_portdata {
        u32 port_urgent_poll;
        /* pid of process using this port */
        pid_t port_pid;
+       pid_t port_subpid[INFINIPATH_MAX_SUBPORT];
        /* same size as task_struct .comm[] */
        char port_comm[16];
        /* pkeys set by this use of this port */
@@ -320,16 +326,6 @@ struct ipath_devdata {
        u32 ipath_p0_hdrqfull;
 
        /*
-        * (*cfgports) used to suppress multiple instances of same
-        * port staying stuck at same point
-        */
-       u32 *ipath_lastrcvhdrqtails;
-       /*
-        * (*cfgports) used to suppress multiple instances of same
-        * port staying stuck at same point
-        */
-       u32 *ipath_lastegrheads;
-       /*
         * index of last piobuffer we used.  Speeds up searching, by
         * starting at this point.  Doesn't matter if multiple cpu's use and
         * update, last updater is only write that matters.  Whenever it
index fd89765..d2725cd 100644 (file)
@@ -238,7 +238,7 @@ static void ipath_chk_errormask(struct ipath_devdata *dd)
 void ipath_get_faststats(unsigned long opaque)
 {
        struct ipath_devdata *dd = (struct ipath_devdata *) opaque;
-       u32 val;
+       int i;
        static unsigned cnt;
        unsigned long flags;
        u64 traffic_wds;
@@ -322,12 +322,11 @@ void ipath_get_faststats(unsigned long opaque)
 
        /* limit qfull messages to ~one per minute per port */
        if ((++cnt & 0x10)) {
-               for (val = dd->ipath_cfgports - 1; ((int)val) >= 0;
-                    val--) {
-                       if (dd->ipath_lastegrheads[val] != -1)
-                               dd->ipath_lastegrheads[val] = -1;
-                       if (dd->ipath_lastrcvhdrqtails[val] != -1)
-                               dd->ipath_lastrcvhdrqtails[val] = -1;
+               for (i = (int) dd->ipath_cfgports; --i >= 0; ) {
+                       struct ipath_portdata *pd = dd->ipath_pd[i];
+
+                       if (pd && pd->port_lastrcvhdrqtail != -1)
+                               pd->port_lastrcvhdrqtail = -1;
                }
        }