enic: Don't receive packets when the napi budget == 0
authorEric W. Biederman <ebiederm@xmission.com>
Sat, 15 Mar 2014 01:02:08 +0000 (18:02 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 15 Mar 2014 02:52:47 +0000 (22:52 -0400)
Processing any incoming packets with a with a napi budget of 0
is incorrect driver behavior.

This matters as netpoll will shortly call drivers with a budget of 0
to avoid receive packet processing happening in hard irq context.

Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/cisco/enic/enic_main.c

index dcd58f2..4c35fc8 100644 (file)
@@ -1086,14 +1086,15 @@ static int enic_poll(struct napi_struct *napi, int budget)
        unsigned int intr = enic_legacy_io_intr();
        unsigned int rq_work_to_do = budget;
        unsigned int wq_work_to_do = -1; /* no limit */
-       unsigned int  work_done, rq_work_done, wq_work_done;
+       unsigned int  work_done, rq_work_done = 0, wq_work_done;
        int err;
 
        /* Service RQ (first) and WQ
         */
 
-       rq_work_done = vnic_cq_service(&enic->cq[cq_rq],
-               rq_work_to_do, enic_rq_service, NULL);
+       if (budget > 0)
+               rq_work_done = vnic_cq_service(&enic->cq[cq_rq],
+                       rq_work_to_do, enic_rq_service, NULL);
 
        wq_work_done = vnic_cq_service(&enic->cq[cq_wq],
                wq_work_to_do, enic_wq_service, NULL);
@@ -1141,14 +1142,15 @@ static int enic_poll_msix(struct napi_struct *napi, int budget)
        unsigned int cq = enic_cq_rq(enic, rq);
        unsigned int intr = enic_msix_rq_intr(enic, rq);
        unsigned int work_to_do = budget;
-       unsigned int work_done;
+       unsigned int work_done = 0;
        int err;
 
        /* Service RQ
         */
 
-       work_done = vnic_cq_service(&enic->cq[cq],
-               work_to_do, enic_rq_service, NULL);
+       if (budget > 0)
+               work_done = vnic_cq_service(&enic->cq[cq],
+                       work_to_do, enic_rq_service, NULL);
 
        /* Return intr event credits for this polling
         * cycle.  An intr event is the completion of a