[ofa-general] Re: Kernel panic in IPoIB stability testing
Moni Shoua
monis at Voltaire.COM
Wed Feb 4 05:30:03 PST 2009
> It was originally written without the path->valid check in the "if", and so was based on the path record
> being allocated within the "if". In this case, the path record was not yet inserted into the path list.
> When you added the "valid" processing, you did not take this into account.
>
> You need code something like the following:
>
> path = __path_find(dev, phdr->hwaddr + 4);
> if (!path || !path->valid) {
> int had_path = 0;
> if (!path)
> path = path_rec_create(dev, phdr->hwaddr + 4);
> else
> had_path = 1;
> if (path) {
> /* put pseudoheader back on for next time */
> skb_push(skb, sizeof *phdr);
> __skb_queue_tail(&path->queue, skb);
>
> if (path_rec_start(dev, path)) {
> if (had_path)
> /* detach from path list here under spinlock */
> spin_unlock(&priv->lock);
> path_free(dev, path);
> return;
> } else if (!had_path)
> __path_add(dev, path);
> } else {
> ++dev->stats.tx_dropped;
> dev_kfree_skb_any(skb);
> }
>
> spin_unlock(&priv->lock);
> return;
> }
I hope I'm not missing something but __path_rec() checks for path existence
and returns -EEXIST if the path is not added.
ret = memcmp(path->pathrec.dgid.raw, tpath->pathrec.dgid.raw,
sizeof (union ib_gid));
if (ret < 0)
n = &pn->rb_left;
else if (ret > 0)
n = &pn->rb_right;
else
return -EEXIST;
}
so the code you suggest may improve performance but I don't see how it solves the bug.
More information about the general
mailing list