* Stephen Hemminger <[EMAIL PROTECTED]> 2006-08-14 14:20
> --- net-2.6.19.orig/net/core/neighbour.c
> +++ net-2.6.19/net/core/neighbour.c
> @@ -1160,19 +1164,24 @@ int neigh_resolve_output(struct sk_buff 
>       if (!neigh_event_send(neigh, skb)) {
>               int err;
>               struct net_device *dev = neigh->dev;
> +             unsigned short type = ntohs(skb->protocol);
> +
>               if (dev->hard_header_cache && !dst->hh) {
> -                     write_lock_bh(&neigh->lock);
> +                     write_seqlock_bh(&neigh->lock);
>                       if (!dst->hh)
>                               neigh_hh_init(neigh, dst, dst->ops->protocol);
> -                     err = dev->hard_header(skb, dev, ntohs(skb->protocol),
> +                     err = dev->hard_header(skb, dev, type,
>                                              neigh->ha, NULL, skb->len);
> -                     write_unlock_bh(&neigh->lock);
> +                     write_sequnlock_bh(&neigh->lock);
>               } else {
> -                     read_lock_bh(&neigh->lock);
> -                     err = dev->hard_header(skb, dev, ntohs(skb->protocol),
> -                                            neigh->ha, NULL, skb->len);
> -                     read_unlock_bh(&neigh->lock);
> +                     unsigned seq;
> +                     do {
> +                             seq = read_seqbegin(&neigh->lock);
> +                             err = dev->hard_header(skb, dev, type,
> +                                                    neigh->ha, NULL, 
> skb->len);
> +                     } while (read_seqretry(&neigh->lock, seq));

Don't you need to pull in order to undo the push that probably
happened in dev->hard_header()?
-
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