[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