mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-15 00:04:15 +08:00
tty/n_gsm: avoid fifo overflow in gsm_dlci_data_output
n_gsm use a simple approach: every writing to fifo correspond exactly one reading from fifo. There are no problem in this approach until we read less bytes then we write. As result fifo may owerflow. This leads to packet loss and very slow responce. For example, this happens with ping packets (about 96 byte each) and default gsm->mtu = 64. As result we get 50 sec ping timeout and 20% packet loss. Fix the problem by reading and sending all data from the fifo Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevetskiy@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
f37ac5a144
commit
268e526b93
@ -809,12 +809,14 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
|
||||
{
|
||||
struct gsm_msg *msg;
|
||||
u8 *dp;
|
||||
int len, size;
|
||||
int len, total_size, size;
|
||||
int h = dlci->adaption - 1;
|
||||
|
||||
total_size = 0;
|
||||
while(1) {
|
||||
len = kfifo_len(dlci->fifo);
|
||||
if (len == 0)
|
||||
return 0;
|
||||
return total_size;
|
||||
|
||||
/* MTU/MRU count only the data bits */
|
||||
if (len > gsm->mtu)
|
||||
@ -838,8 +840,10 @@ static int gsm_dlci_data_output(struct gsm_mux *gsm, struct gsm_dlci *dlci)
|
||||
}
|
||||
WARN_ON(kfifo_out_locked(dlci->fifo, dp , len, &dlci->lock) != len);
|
||||
__gsm_data_queue(dlci, msg);
|
||||
total_size += size;
|
||||
}
|
||||
/* Bytes of data we used up */
|
||||
return size;
|
||||
return total_size;
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
Reference in New Issue
Block a user