LOCAL / usb: gadget: f_fs: Limit data buffer size to a single page
authorDongwoo <dwoo08.lee@samsung.com>
Fri, 26 Oct 2018 01:41:41 +0000 (10:41 +0900)
committerJaehoon Chung <jh80.chung@samsung.com>
Tue, 29 Jan 2019 02:25:39 +0000 (11:25 +0900)
 Large size request from sdbd usually causes memory allocation failure
in case of memory shortage. The failure is not handled by sdbd
properly and thus it makes sdbd a hung state. To prevent this
situation, this patch limits data buffer size to a single page so as
to guarantee memory allocation success.

* This is WORKAROUND solution for just use case of sdbd, it should be
  reverted when the advanced dma solution is applied to f_fs *

Change-Id: Ib917c3aef2b00a3e00a3d87ca6d6940307038aa1
Signed-off-by: Dongwoo <dwoo08.lee@samsung.com>
drivers/usb/gadget/function/f_fs.c

index 4800bb22cdd61c14258d557644e526acbba4b933..009a776c372a81b2eb242b84d97acad0a316884e 100644 (file)
@@ -736,6 +736,14 @@ static ssize_t ffs_epfile_io(struct file *file, struct ffs_io_data *io_data)
                        return -ESHUTDOWN;
                }
                data_len = iov_iter_count(&io_data->data);
+
+               /*
+                * WORKAROUND:
+                * To prevent memory allocation failure of big size request,
+                * limits data buffer size to a single page.
+                */
+               data_len = (data_len > PAGE_SIZE) ? PAGE_SIZE : data_len;
+
                /*
                 * Controller may require buffer size to be aligned to
                 * maxpacketsize of an out endpoint.