Messages in this thread Patch in this message | | | From | Andrzej Pietrasiewicz <> | Subject | Re: [REGRESSION] usb: gadget: f_fs: Allow scatter-gather buffers | Date | Wed, 8 May 2019 14:44:22 +0200 |
| |
Hi John,
W dniu 08.05.2019 o 04:18, John Stultz pisze: > Since commit 772a7a724f69 ("usb: gadget: f_fs: Allow scatter-gather > buffers"), I've been seeing trouble with adb transfers in Android on > HiKey960, HiKey and now Dragonboard 845c. > > Sometimes things crash, but often the transfers just stop w/o any > obvious error messages. >
<snip>
> > Andrzej: Do you have any ideas or suggestions on this? I'm happy to > test or run any debug patches, if it would help narrow the issue down. >
Can you please try the below patch?
One more thing to consider is "functionfs read size 512 > requested size 24, splitting request into multiple reads." in your original report, but let's try this first:
From f2b8f27cfa42cafe1f56d8abbe2c76fa0072e368 Mon Sep 17 00:00:00 2001 From: Andrzej Pietrasiewicz <andrzej.p@collabora.com> Date: Wed, 8 May 2019 13:52:40 +0200 Subject: [PATCH] usb: gadget: Zero ffs_io_data
In some cases the "Allocate & copy" block in ffs_epfile_io() is not executed. Consequently, in such a case ffs_alloc_buffer() is never called and struct ffs_io_data is not initialized properly. This in turn leads to problems when ffs_free_buffer() is called at the end of ffs_epfile_io().
This patch uses kzalloc() instead of kmalloc() in the aio case and memset() in non-aio case to properly initialize struct ffs_io_data.
Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> --- drivers/usb/gadget/function/f_fs.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 47be961f1bf3..41d57ae8bc15 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c @@ -1182,11 +1182,12 @@ static ssize_t ffs_epfile_write_iter(struct kiocb *kiocb, struct iov_iter *from) ENTER();
if (!is_sync_kiocb(kiocb)) { - p = kmalloc(sizeof(io_data), GFP_KERNEL); + p = kzalloc(sizeof(io_data), GFP_KERNEL); if (unlikely(!p)) return -ENOMEM; p->aio = true; } else { + memset(p, 0, sizeof(*p)); p->aio = false; }
@@ -1218,11 +1219,12 @@ static ssize_t ffs_epfile_read_iter(struct kiocb *kiocb, struct iov_iter *to) ENTER();
if (!is_sync_kiocb(kiocb)) { - p = kmalloc(sizeof(io_data), GFP_KERNEL); + p = kzalloc(sizeof(io_data), GFP_KERNEL); if (unlikely(!p)) return -ENOMEM; p->aio = true; } else { + memset(p, 0, sizeof(*p)); p->aio = false; }
-- 2.17.1
| |