Re: [PATCH v1 7/7] Bluetooth: __l2cap_wait_ack() limit max waiting time

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

 



Hi Dean,

> Add a limiter counter to prevent the do while loop
> running in an infinite loop. This ensures that the
> channel will be instructed to close within 10 seconds
> so prevents l2cap_sock_shutdown() getting stuck forever.
> 
> Returns -ENOLINK when the limit is reached as the channel
> will be subequently closed and not all data was ACK'ed.
> 
> Signed-off-by: Dean Jenkins <Dean_Jenkins@xxxxxxxxxx>
> ---
> net/bluetooth/l2cap_sock.c | 11 ++++++++++-
> 1 file changed, 10 insertions(+), 1 deletion(-)
> 
> diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
> index 369ad0e..ee6531e 100644
> --- a/net/bluetooth/l2cap_sock.c
> +++ b/net/bluetooth/l2cap_sock.c
> @@ -1059,11 +1059,13 @@ static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
> 	DECLARE_WAITQUEUE(wait, current);
> 	int err = 0;
> 	int timeo = HZ/5;
> +	int limiter = 10 * 5;	/* 10 seconds limit */

while reading this, should timeo not be using msecs_to_jiffies() in the first place.

And with that, can we have a little bit better logic on how you get to 10 seconds. I had to scratch my head a bit to realise that this is 50 * 200 msec. It seems a bit error prone in case anyone ever changes something.

> 
> 	add_wait_queue(sk_sleep(sk), &wait);
> 	set_current_state(TASK_INTERRUPTIBLE);
> 	do {
> -		BT_DBG("Waiting for %d ACKs", chan->unacked_frames);
> +		BT_DBG("Waiting for %d ACKs, limiter %d",
> +			chan->unacked_frames, limiter);
> 
> 		if (!timeo)
> 			timeo = HZ/5;

And with that, I have no idea why we are doing this check here. Seems rather pointless unless I misses something.

I know these are not your bugs, but while we are at it, it might be better to really clean this out.

> @@ -1081,6 +1083,13 @@ static int __l2cap_wait_ack(struct sock *sk, struct l2cap_chan *chan)
> 		err = sock_error(sk);
> 		if (err)
> 			break;
> +
> +		limiter--;
> +		if (!limiter) {
> +			err = -ENOLINK;
> +			break;
> +		}
> +
> 	} while (chan->unacked_frames > 0 &&
> 		 chan->state == BT_CONNECTED);

Regards

Marcel

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




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux