From: Matt Mackall <mpm@selenic.com>
To: Jeff Garzik <jgarzik@pobox.com>
Cc: Andrew Morton <akpm@osdl.org>,
Robert Walsh <rjwalsh@durables.org>,
wangdi <wangdi@clusterfs.com>,
linux-kernel <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH 1/3] netpoll-core
Date: Mon, 22 Sep 2003 23:16:17 -0500 [thread overview]
Message-ID: <20030923041617.GD32488@waste.org> (raw)
In-Reply-To: <3F6F9A9A.9030003@pobox.com>
On Mon, Sep 22, 2003 at 08:58:02PM -0400, Jeff Garzik wrote:
> Matt Mackall wrote:
>
> >+void netpoll_poll(struct netpoll *np)
> >+{
> >+ int budget = 1;
> >+
> >+ if(!np || !np->dev || !(np->dev->flags & IFF_UP))
> >+ return;
>
> should test netif_running() not IFF_UP, IMO
Sure. I modeled it on the ip autoconf code which wasn't exactly
pretty, but now I think I have a firmer grasp on the net stack.
>
> >+ disable_irq(np->dev->irq);
> >+
> >+ /* Process pending work on NIC */
> >+ np->irqfunc(np->dev->irq, np->dev, 0);
> >+
> >+ /* If scheduling is stopped, tickle NAPI bits */
> >+ if(trapped && np->dev->poll &&
> >+ test_bit(__LINK_STATE_RX_SCHED, &np->dev->state))
> >+ np->dev->poll(np->dev, &budget);
> >+
> >+ enable_irq(np->dev->irq);
> >+}
>
> Calling the irq function from two different places, netpoll code and
> arch code, worries me.
Why? The interrupt handlers don't have a special calling convention to
speak of.
> >+static void refill_skbs(void)
> >+{
> >+ struct sk_buff *skb;
> >+ unsigned long flags;
> >+
> >+ spin_lock_irqsave(&skb_list_lock, flags);
> >+ while (nr_skbs < MAX_SKBS) {
> >+ skb = alloc_skb(MAX_SKB_SIZE, GFP_ATOMIC);
> >+ if (!skb)
> >+ break;
> >+
> >+ skb->next = skbs;
> >+ skbs = skb;
> >+ nr_skbs++;
> >+ }
> >+ spin_unlock_irqrestore(&skb_list_lock, flags);
> >+}
>
> if it's a simple list, why not lock, find out number of allocations,
> unlock, allocate a bunch of skbs, then finally lock again and tie back
> into list.
That could work too. The above is more or less the same as what's in
the RH 2.4 netdump patches and works well enough.
> >+static void zap_completion_queue(void)
[...]
>
> this should be somewhere in a more general place... otherwise, somebody
> will inevitably change softnet and forget to change this code.
Fair enough. Suggestions?
> >+void netpoll_send_skb(struct netpoll *np, struct sk_buff *skb)
> >+{
> >+ int status;
> >+
> >+repeat:
> >+ if(!np || !np->dev || !(np->dev->flags & IFF_UP)) {
>
> netif_running()
>
>
> >+ spin_lock(&np->dev->xmit_lock);
> >+ np->dev->xmit_lock_owner = smp_processor_id();
> >+
> >+ if (netif_queue_stopped(np->dev)) {
> >+ np->dev->xmit_lock_owner = -1;
> >+ spin_unlock(&np->dev->xmit_lock);
> >+
> >+ netpoll_poll(np);
> >+ zap_completion_queue();
> >+ goto repeat;
> >+ }
> >+
> >+ status = np->dev->hard_start_xmit(skb, np->dev);
> >+ np->dev->xmit_lock_owner = -1;
> >+ spin_unlock(&np->dev->xmit_lock);
>
> this worries be too, but I don't have any outright objections. Mainly
> similar to the above comments -- this is intimate with the net stack
> locking, and at the very least shouldn't be hidden in a little-used
> corner of the code :)
Actually I think it's going to be effectively hidden to anyone who
doesn't use the netpoll interface as no one else is going to have a
use for this sort of functionality. There might be a more generic
place for zapping completions but not for this.
> >+#ifdef CONFIG_NETPOLL
> >+ if (skb->dev->rx_hook && skb->dev->rx_hook(skb)) {
> >+ kfree_skb(skb);
> >+ return NET_RX_DROP;
> >+ }
> >+#endif
>
> This allows wholesale replacement of the IPv4 net stack, something we've
> traditionally avoided.
Heh. Here I was thinking I was doing the right thing by making it
generic. I can just add a netpoll flag somewhere in netdevice instead.
--
Matt Mackall : http://www.selenic.com : of or relating to the moon
next prev parent reply other threads:[~2003-09-23 4:16 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2003-09-22 18:45 [PATCH 1/3] netpoll-core Matt Mackall
2003-09-23 0:58 ` Jeff Garzik
2003-09-23 4:16 ` Matt Mackall [this message]
2003-09-23 1:19 ` Paul Mundt
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=20030923041617.GD32488@waste.org \
--to=mpm@selenic.com \
--cc=akpm@osdl.org \
--cc=jgarzik@pobox.com \
--cc=linux-kernel@vger.kernel.org \
--cc=rjwalsh@durables.org \
--cc=wangdi@clusterfs.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