Messages in this thread |  | | | Date | Tue, 13 Apr 2010 15:13:24 +0800 | | From | Cong Wang <> | | Subject | Re: [Patch 3/3] net: reserve ports for applications using fixed port numbers |
| |
Tetsuo Handa wrote: > Hello. > >> --- linux-2.6.orig/drivers/infiniband/core/cma.c >> +++ linux-2.6/drivers/infiniband/core/cma.c >> @@ -1980,6 +1980,8 @@ retry: >> /* FIXME: add proper port randomization per like inet_csk_get_port */ >> do { >> ret = idr_get_new_above(ps, bind_list, next_port, &port); >> + if (!ret && inet_is_reserved_local_port(port)) >> + ret = -EAGAIN; >> } while ((ret == -EAGAIN) && idr_pre_get(ps, GFP_KERNEL)); >> >> if (ret) >> > I think above part is wrong. Below program ... > > This result suggests that above loop will continue until idr_pre_get() fails > due to out of memory if all ports were reserved. > > Also, if idr_get_new_above() returned 0, bind_list (which is a kmalloc()ed > pointer) is already installed into a free slot (see comment on > idr_get_new_above_int()). Thus, simply calling idr_get_new_above() again will > install the same pointer into multiple slots. I guess it will malfunction later.
Thanks for testing!
How about:
+ if (!ret && inet_is_reserved_local_port(port)) + ret = -EBUSY; ? So that it will break the loop and return error.
|  |