[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <1185340196.1803.482.camel@localhost.localdomain>
Date: Wed, 25 Jul 2007 15:09:55 +1000
From: Rusty Russell <rusty@...tcorp.com.au>
To: David Miller <davem@...emloft.net>
Cc: netdev@...r.kernel.org, shemminger@...ux-foundation.org,
jgarzik@...ox.com, hadi@...erus.ca
Subject: Re: [PATCH RFX]: napi_struct V3
On Tue, 2007-07-24 at 21:29 -0700, David Miller wrote:
> From: Rusty Russell <rusty@...tcorp.com.au>
> Date: Wed, 25 Jul 2007 12:33:14 +1000
>
> > Maybe by adding YA state bit? Hold on, this might get ugly...
> >
> > Say netif_rx_schedule_prep() sets the MORE_TODO bit (atomically instead
> > of setting __LINK_STATE_RX_SCHED) if it's going to fail, and
> > netif_rx_complete() returns 0 if it was set, or 1 if it's OK. Now
> > callers do:
> >
> > reenable_interrupts();
> > if (rx_pending() || !netif_rx_complete(netdev, napi))
> > disable_interrupts();
>
> This is an interesting idea, and would work, but the extra atomics
> for something that 2 or 3 drivers actually need.... unless I
> misunderstand your suggestion?
Well, netif_rx_schedule_prep() becomes a cmpxchg instead of a
test_and_set_bit:
/* We either set MORE_TODO or RX_SCHED. */
unsigned long state;
again:
state = napi->state;
if (!(state & __LINK_STATE_RX_SCHED)) {
if (cmpxchg(&napi->state, state, state|__LINK_STATE_RX_SCHED) == state)
return 1;
} else {
if (cmpxchg(&napi->state, state, state|__LINK_STATE_MORE_TODO) == state)
return 0;
}
goto again;
netif_rx_complete would need something more complex... hmm...
unsigned long state;
again:
state = napi->state;
if (state & __LINK_STATE_MORE_TODO)
return 0;
list_del(&napi->poll_list);
if (cmpxchg(&napi->state, state, state & ~__LINK_STATE_RX_SCHED) == state)
return 1;
list_add_tail(napi->poll_list, &__get_cpu_var(softnet_data).poll_list);
goto again;
Not pretty 8(
Rusty.
if (
-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists