Re: [PATCH] xs_bind retry binding forever

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Oct 21, 2010, at 3:38 PM, Trond Myklebust wrote:

> On Thu, 2010-10-21 at 13:33 -0500, Ben Myers wrote:
>> Retry bind for reserved source ports forever.  Add an error message when we
>> have a hard time binding one.
> 
> NACK. This approach leads to the process spinning forever in that loop,
> which is exactly why we introduced the limit in the first place. See all
> the old archived bug report emails about 'rpciod taking 100% cpu'.

The root problem seems to be the hard loop.  Thinking out loud, what if the client's FSM or some other higher up layer performed the retry, with a short delay inserted after each attempt?

> Cheers
>  Trond
> 
>> Signed-off-by: Ben Myers <bpm@xxxxxxx>
>> ---
>> net/sunrpc/xprtsock.c |   22 ++++++++++++++++++----
>> 1 files changed, 18 insertions(+), 4 deletions(-)
>> 
>> diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
>> index b6309db..79a001b 100644
>> --- a/net/sunrpc/xprtsock.c
>> +++ b/net/sunrpc/xprtsock.c
>> @@ -1560,9 +1560,16 @@ static int xs_bind4(struct sock_xprt *transport, struct socket *sock)
>> 		}
>> 		last = port;
>> 		port = xs_next_srcport(transport, sock, port);
>> -		if (port > last)
>> +		if (port > last) {
>> +			if (nloop > 2 && net_ratelimit()) {
>> +				printk("RPC: %s %pI4: Cannot bind reserved "
>> +				       "source port.  Consider decreasing "
>> +				       "min_resvport.\n",
>> +				       __func__, &myaddr.sin_addr);
>> +			}
>> 			nloop++;
>> -	} while (err == -EADDRINUSE && nloop != 2);
>> +		}
>> +	} while (err == -EADDRINUSE);
>> 	dprintk("RPC:       %s %pI4:%u: %s (%d)\n",
>> 			__func__, &myaddr.sin_addr,
>> 			port, err ? "failed" : "ok", err);
>> @@ -1593,9 +1600,16 @@ static int xs_bind6(struct sock_xprt *transport, struct socket *sock)
>> 		}
>> 		last = port;
>> 		port = xs_next_srcport(transport, sock, port);
>> -		if (port > last)
>> +		if (port > last) {
>> +			if (nloop > 2 && net_ratelimit()) {
>> +				printk("RPC: %s %pI6: Cannot bind reserved "
>> +				       "source port.  Consider decreasing "
>> +				       "min_resvport.\n",
>> +					__func__, &myaddr.sin6_addr);
>> +			}
>> 			nloop++;
>> -	} while (err == -EADDRINUSE && nloop != 2);
>> +		}
>> +	} while (err == -EADDRINUSE);
>> 	dprintk("RPC:       xs_bind6 %pI6:%u: %s (%d)\n",
>> 		&myaddr.sin6_addr, port, err ? "failed" : "ok", err);
>> 	return err;
>> 
>> --
>> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
>> the body of a message to majordomo@xxxxxxxxxxxxxxx
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
chuck[dot]lever[at]oracle[dot]com




--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux