[openib-general] Re: [PATCH] SDP: In sdp_link.c::do_link_path_lookup, handle interface table numbering holes
Michael S. Tsirkin
mst at mellanox.co.il
Tue Oct 11 06:47:47 PDT 2005
Quoting r. Hal Rosenstock <halr at voltaire.com>:
> Subject: [PATCH] SDP: In sdp_link.c::do_link_path_lookup, handle interface table numbering holes
>
> SDP: In sdp_link.c::do_link_path_lookup, handle interface table
> numbering holes
> (similar to James Lentini's patch to at.c)
>
> (this is untested)
>
> Signed-off-by: Hal Rosenstock <halr at voltaire.com>
>
> Index: sdp_link.c
> ===================================================================
> --- sdp_link.c (revision 3623)
> +++ sdp_link.c (working copy)
> @@ -354,7 +354,6 @@ static void do_link_path_lookup(struct s
> struct ipoib_dev_priv *priv;
> struct net_device *dev = NULL;
> struct rtable *rt;
> - int counter = 0;
> int result = 0;
> struct flowi fl = {
> .oif = info->dif, /* oif */
> @@ -435,7 +434,7 @@ static void do_link_path_lookup(struct s
>
> if (dev->flags & IFF_LOOPBACK) {
> dev_put(dev);
> - while ((dev = dev_get_by_index(++counter))) {
> + for (dev = dev_base; dev; dev = dev->next) {
> if (dev->type == ARPHRD_INFINIBAND &&
> (dev->flags & IFF_UP))
> break;
>
I think this list scan needs some kind of protection.
The following is what I checked in. Does this needs to be updated
in other places as well?
Handle net interface table numbering holes
(similar to James Lentini's patch to at.c)
Signed-off-by: Michael S. Tsirkin <mst at mellanox.co.il>
Signed-off-by: Hal Rosenstock <halr at voltaire.com>
Index: linux-kernel/drivers/infiniband/ulp/sdp/sdp_link.c
===================================================================
--- linux-kernel.orig/drivers/infiniband/ulp/sdp/sdp_link.c 2005-10-11 13:48:30.000000000 +0200
+++ linux-kernel/drivers/infiniband/ulp/sdp/sdp_link.c 2005-10-11 13:55:15.000000000 +0200
@@ -433,13 +433,15 @@ static void do_link_path_lookup(struct s
if (dev->flags & IFF_LOOPBACK) {
dev_put(dev);
- while ((dev = dev_get_by_index(++counter))) {
+ read_lock(&dev_base_lock);
+ for (dev = dev_base; dev; dev = dev->next) {
if (dev->type == ARPHRD_INFINIBAND &&
- (dev->flags & IFF_UP))
+ (dev->flags & IFF_UP)) {
+ dev_hold(dev);
break;
- else
- dev_put(dev);
+ }
}
+ read_unlock(&dev_base_lock);
}
if (!dev) {
--
MST
More information about the general
mailing list