public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: James Chapman <jchapman@katalix.com>
To: David Miller <davem@davemloft.net>
Cc: shemminger@linux-foundation.org, ossthema@de.ibm.com,
	akepner@sgi.com, netdev@vger.kernel.org, raisch@de.ibm.com,
	themann@de.ibm.com, linux-kernel@vger.kernel.org,
	linuxppc-dev@ozlabs.org, meder@de.ibm.com, tklein@de.ibm.com,
	stefan.roscher@de.ibm.com
Subject: Re: RFC: issues concerning the next NAPI interface
Date: Tue, 28 Aug 2007 10:22:57 +0100	[thread overview]
Message-ID: <46D3E971.4010909@katalix.com> (raw)
In-Reply-To: <20070827.145600.102570576.davem@davemloft.net>

David Miller wrote:
> From: James Chapman <jchapman@katalix.com>
> Date: Mon, 27 Aug 2007 22:41:43 +0100
> 
>> I don't recall saying anything in previous posts about this. Are you 
>> confusing my posts with Jan-Bernd's?
> 
> Yes, my bad.
> 
>> Jan-Bernd has been talking about using hrtimers to _reschedule_
>> NAPI. My posts are suggesting an alternative mechanism that keeps
>> NAPI active (with interrupts disabled) for a jiffy or two after it
>> would otherwise have gone idle in order to avoid too many interrupts
>> when the packet rate is such that NAPI thrashes between poll-on and
>> poll-off.
> 
> So in this scheme what runs ->poll() to process incoming packets?
> The hrtimer?

No, the regular NAPI networking core calls ->poll() as usual; no timers 
are involved. This scheme simply delays the napi_complete() from the 
driver so the device stays in the poll list longer. It means that its 
->poll() will be called when there is no work to do for 1-2 jiffies, 
hence the optimization at the top of ->poll() to efficiently handle that 
case. The device's ->poll() is called by the NAPI core until it has 
continuously done no work for 1-2 jiffies, at which point it finally 
does the netif_rx_complete() and re-enables its interrupts.

If people feel that holding the device in the poll list for 1-2 jiffies 
is too long (because there are too many wasted polls), a counter could 
be used to to delay the netif_rx_complete() by N polls instead. N would 
be a value depending on CPU speed. I use the jiffy sampling method 
because it results in some natural randomization of the actual delay 
depending on when the jiffy value was sampled in relation to the jiffy tick.

Here is the tg3 patch again that illustrates the idea. The patch changes 
only the ->poll() routine; note how the netif_rx_complete() call is delayed.

diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 710dccc..59e151b 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -3473,6 +3473,24 @@ static int tg3_poll(struct napi_struct *napi,
      struct tg3_hw_status *sblk = tp->hw_status;
      int work_done = 0;

+    /* fastpath having no work while we're holding ourself in
+     * polled mode
+     */
+    if ((tp->exit_poll_time) && (!tg3_has_work(tp))) {
+        if (time_after(jiffies, tp->exit_poll_time)) {
+            tp->exit_poll_time = 0;
+            /* tell net stack and NIC we're done */
+            netif_rx_complete(netdev, napi);
+            tg3_restart_ints(tp);
+        }
+        return 0;
+    }
+
+    /* if we get here, there might be work to do so disable the
+     * poll hold fastpath above
+     */
+    tp->exit_poll_time = 0;
+
      /* handle link change and other phy events */
      if (!(tp->tg3_flags &
            (TG3_FLAG_USE_LINKCHG_REG |
@@ -3511,11 +3529,11 @@ static int tg3_poll(struct napi_struct *napi,
      } else
          sblk->status &= ~SD_STATUS_UPDATED;

-    /* if no more work, tell net stack and NIC we're done */
-    if (!tg3_has_work(tp)) {
-        netif_rx_complete(netdev, napi);
-        tg3_restart_ints(tp);
-    }
+    /* if no more work, set the time in jiffies when we should
+     * exit polled mode
+     */
+    if (!tg3_has_work(tp))
+        tp->exit_poll_time = jiffies + 2;

      return work_done;
  }
diff --git a/drivers/net/tg3.h b/drivers/net/tg3.h
index a6a23bb..a0d24d3 100644
--- a/drivers/net/tg3.h
+++ b/drivers/net/tg3.h
@@ -2163,6 +2163,7 @@ struct tg3 {
      u32                last_tag;

      u32                msg_enable;
+    unsigned long            exit_poll_time;

      /* begin "tx thread" cacheline section */
      void                (*write32_tx_mbox) (struct tg3 *, u32,


-- 
James Chapman
Katalix Systems Ltd
http://www.katalix.com
Catalysts for your Embedded Linux software development


  reply	other threads:[~2007-08-28  9:23 UTC|newest]

Thread overview: 48+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-08-24 13:59 RFC: issues concerning the next NAPI interface Jan-Bernd Themann
2007-08-24 15:37 ` akepner
2007-08-24 15:47   ` Jan-Bernd Themann
2007-08-24 15:52     ` Stephen Hemminger
2007-08-24 16:50       ` David Stevens
2007-08-24 21:44         ` David Miller
2007-08-24 21:51           ` Linas Vepstas
2007-08-24 16:51       ` Linas Vepstas
2007-08-24 17:07         ` Rick Jones
2007-08-24 17:45         ` Shirley Ma
2007-08-24 17:16       ` James Chapman
2007-08-24 18:11         ` Jan-Bernd Themann
2007-08-24 21:47         ` David Miller
2007-08-24 22:06           ` akepner
2007-08-26 19:36           ` James Chapman
2007-08-27  1:58             ` David Miller
2007-08-27  9:47               ` Jan-Bernd Themann
2007-08-27 20:37                 ` David Miller
2007-08-28 11:19                   ` Jan-Bernd Themann
2007-08-28 20:21                     ` David Miller
2007-08-29  7:10                       ` Jan-Bernd Themann
2007-08-29  8:15                         ` James Chapman
2007-08-29  8:43                           ` Jan-Bernd Themann
2007-08-29  8:29                         ` David Miller
2007-08-29  8:31                           ` Jan-Bernd Themann
2007-08-27 15:51               ` James Chapman
2007-08-27 16:02                 ` Jan-Bernd Themann
2007-08-27 17:05                   ` James Chapman
2007-08-27 21:02                 ` David Miller
2007-08-27 21:41                   ` James Chapman
2007-08-27 21:56                     ` David Miller
2007-08-28  9:22                       ` James Chapman [this message]
2007-08-28 11:48                         ` Jan-Bernd Themann
2007-08-28 12:16                           ` Evgeniy Polyakov
2007-08-28 14:55                           ` James Chapman
2007-08-28 11:21                   ` Jan-Bernd Themann
2007-08-28 20:25                     ` David Miller
2007-08-28 20:27                     ` David Miller
2007-08-24 16:45 ` Linas Vepstas
2007-08-24 21:43   ` David Miller
2007-08-24 21:32 ` David Miller
2007-08-24 21:37 ` David Miller
     [not found] <8VHRR-45R-17@gated-at.bofh.it>
     [not found] ` <8VKwj-8ke-27@gated-at.bofh.it>
2007-08-24 19:04   ` Bodo Eggert
2007-08-24 20:42     ` Linas Vepstas
2007-08-24 21:11       ` Jan-Bernd Themann
2007-08-24 21:35         ` Linas Vepstas
     [not found]   ` <E1IOeSm-0000bm-Jo__24045.532072387$1187982363$gmane$org@be1.lrz>
2007-08-24 20:24     ` Stephen Hemminger
  -- strict thread matches above, loose matches on Subject: below --
2007-08-25  2:10 Mitchell Erblich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46D3E971.4010909@katalix.com \
    --to=jchapman@katalix.com \
    --cc=akepner@sgi.com \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linuxppc-dev@ozlabs.org \
    --cc=meder@de.ibm.com \
    --cc=netdev@vger.kernel.org \
    --cc=ossthema@de.ibm.com \
    --cc=raisch@de.ibm.com \
    --cc=shemminger@linux-foundation.org \
    --cc=stefan.roscher@de.ibm.com \
    --cc=themann@de.ibm.com \
    --cc=tklein@de.ibm.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox