On Tue, 2007-07-24 at 21:29 -0700, David Miller wrote:
> From: Rusty Russell <[EMAIL PROTECTED]>
> 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 [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to