BNX2X: spatch IRQ handlers
authorBarret Rhoden <brho@cs.berkeley.edu>
Wed, 11 Feb 2015 02:23:48 +0000 (21:23 -0500)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 Mar 2015 16:59:09 +0000 (11:59 -0500)
This doesn't deal with all types of IRQ handlers.  Some return values
indicating that a thread should finish the IRQ.  For these, I don't
transform the output.  I want there to be a compiler error so that
someone manually makes sure the handler is completed.

kern/drivers/net/bnx2x/bnx2x_cmn.c
kern/drivers/net/bnx2x/bnx2x_cmn.h
kern/drivers/net/bnx2x/bnx2x_main.c
scripts/spatch/linux/funcs.cocci

index 1d1c65f..b8eb28f 100644 (file)
@@ -1111,7 +1111,7 @@ next_cqe:
        return rx_pkt;
 }
 
-static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie)
+static void bnx2x_msix_fp_int(struct hw_trapframe *hw_tf, void *fp_cookie)
 {
        struct bnx2x_fastpath *fp = fp_cookie;
        struct bnx2x *bp = fp->bp;
@@ -1125,7 +1125,7 @@ static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie)
 
 #ifdef BNX2X_STOP_ON_ERROR
        if (unlikely(bp->panic))
-               return IRQ_HANDLED;
+               return;
 #endif
 
        /* Handle Rx and Tx according to MSI-X vector */
@@ -1135,7 +1135,7 @@ static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie)
        prefetch(&fp->sb_running_index[SM_RX_ID]);
        napi_schedule_irqoff(&bnx2x_fp(bp, fp->index, napi));
 
-       return IRQ_HANDLED;
+       return;
 }
 
 /* HW Lock for shared dual port PHYs */
index 4fd359c..21c6626 100644 (file)
@@ -232,7 +232,7 @@ uint16_t bnx2x_get_mf_speed(struct bnx2x *bp);
  * @irq:               irq number
  * @dev_instance:      private instance
  */
-irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance);
+void bnx2x_msix_sp_int(struct hw_trapframe *hw_tf, void *dev_instance);
 
 /**
  * bnx2x_interrupt - non MSI-X interrupt handler
@@ -240,7 +240,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance);
  * @irq:               irq number
  * @dev_instance:      private instance
  */
-irqreturn_t bnx2x_interrupt(int irq, void *dev_instance);
+void bnx2x_interrupt(struct hw_trapframe *hw_tf, void *dev_instance);
 
 /**
  * bnx2x_cnic_notify - send command to cnic driver
index b82b545..5e872d4 100644 (file)
@@ -1865,7 +1865,7 @@ void bnx2x_sp_event(struct bnx2x_fastpath *fp, union eth_rx_cqe *rr_cqe)
        return;
 }
 
-irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)
+void bnx2x_interrupt(struct hw_trapframe *hw_tf, void *dev_instance)
 {
        struct bnx2x *bp = netdev_priv(dev_instance);
        uint16_t status = bnx2x_ack_int(bp);
@@ -1876,13 +1876,13 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)
        /* Return here if interrupt is shared and it's not for us */
        if (unlikely(status == 0)) {
                DP(NETIF_MSG_INTR, "not our interrupt!\n");
-               return IRQ_NONE;
+               return;
        }
        DP(NETIF_MSG_INTR, "got an interrupt  status 0x%x\n", status);
 
 #ifdef BNX2X_STOP_ON_ERROR
        if (unlikely(bp->panic))
-               return IRQ_HANDLED;
+               return;
 #endif
 
        for_each_eth_queue(bp, i) {
@@ -1924,14 +1924,14 @@ irqreturn_t bnx2x_interrupt(int irq, void *dev_instance)
 
                status &= ~0x1;
                if (!status)
-                       return IRQ_HANDLED;
+                       return;
        }
 
        if (unlikely(status))
                DP(NETIF_MSG_INTR, "got an unknown interrupt! (status 0x%x)\n",
                   status);
 
-       return IRQ_HANDLED;
+       return;
 }
 
 /* Link */
@@ -5652,7 +5652,7 @@ static void bnx2x_sp_task(struct work_struct *work)
        }
 }
 
-irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance)
+void bnx2x_msix_sp_int(struct hw_trapframe *hw_tf, void *dev_instance)
 {
        struct ether *dev = dev_instance;
        struct bnx2x *bp = netdev_priv(dev);
@@ -5662,7 +5662,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance)
 
 #ifdef BNX2X_STOP_ON_ERROR
        if (unlikely(bp->panic))
-               return IRQ_HANDLED;
+               return;
 #endif
 
        if (CNIC_LOADED(bp)) {
@@ -5680,7 +5680,7 @@ irqreturn_t bnx2x_msix_sp_int(int irq, void *dev_instance)
         */
        bnx2x_schedule_sp_task(bp);
 
-       return IRQ_HANDLED;
+       return;
 }
 
 /* end of slow path */
index 7659179..21dcaf4 100644 (file)
@@ -198,3 +198,52 @@ expression ARG;
 @@
 -request_irq(IRQ, HANDLER, FLAGS, NAME, ARG)
 +register_irq(IRQ, HANDLER, ARG, pci_to_tbdf(PCIDEV))
+
+// There are 3 return types for the irq handlers, IRQ_NONE, IRQ_HANDLED, and
+// IRQ_WAKE_THREAD.  We can change the first two to just return.  The latter
+// will need manual attention, since they want a thread to handle the rest.
+@@
+identifier HANDLER;
+typedef irqreturn_t;
+@@
+irqreturn_t HANDLER(...) {
+<...
+-return IRQ_NONE;
++return;
+...>
+}
+
+// Need to comment out irqreturn_t, I guess because it's in a previous rule
+@@
+identifier HANDLER;
+//typedef irqreturn_t;
+@@
+irqreturn_t HANDLER(...) {
+<...
+-return IRQ_HANDLED;
++return;
+...>
+}
+
+// There should be a way to catch both decl and def at once...
+// Changes the definition
+@@
+identifier HANDLER;
+//typedef irqreturn_t;
+identifier IRQ;
+identifier ARG;
+@@
+-irqreturn_t HANDLER(int IRQ, void *ARG
++void HANDLER(struct hw_trapframe *hw_tf, void *ARG
+ ) { ... }
+
+// Changes the declaration
+@@
+identifier HANDLER;
+//typedef irqreturn_t;
+identifier IRQ;
+identifier ARG;
+@@
+-irqreturn_t HANDLER(int IRQ, void *ARG
++void HANDLER(struct hw_trapframe *hw_tf, void *ARG
+ );