On Wed, 24 Jun 2015, David Miller wrote:

From: Govindarajulu Varadarajan <_gov...@gmx.com>
Date: Tue, 23 Jun 2015 21:47:50 +0530

-static inline bool enic_poll_unlock_napi(struct vnic_rq *rq)
+static inline void enic_poll_unlock_napi(struct vnic_rq *rq,
+                                        struct napi_struct *napi)
 {
-       bool rc = false;
-
-       spin_lock(&rq->bpoll_lock);
-       WARN_ON(rq->bpoll_state &
-               (ENIC_POLL_STATE_POLL | ENIC_POLL_STATE_NAPI_YIELD));
-       if (rq->bpoll_state & ENIC_POLL_STATE_POLL_YIELD)
-               rc = true;
-       rq->bpoll_state = ENIC_POLL_STATE_IDLE;
-       spin_unlock(&rq->bpoll_lock);
-
-       return rc;
+       WARN_ON(atomic_read(&rq->bpoll_state) != ENIC_POLL_STATE_NAPI);
+       napi_gro_flush(napi, false);
+       atomic_set(&rq->bpoll_state, ENIC_POLL_STATE_IDLE);
 }

I don't understand why you needed to add this napi_gro_flush() call here,
and regardless of the reason you must explain this, in detail, in your
commit message,


In napi poll, if gro is enabled, we call napi_gro_receive() to deliver the
packets. Before we call napi_complete(), i.e while re-polling, if low
latency busy poll is called, we use netif_receive_skb() to deliver the packets.
At this point if there are some skb's held in GRO, busy poll could deliver the
packets out of order. So we call napi_gro_flush() to flush skbs before we
move the napi poll to idle.

Let me know if this change is OK, I will send new patch with detailed
description.

Thanks
Govind
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to