All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/1] Zerocopy for USB Gadget FunctionFS
@ 2022-02-02 17:20 Ingo Rohloff
  2022-02-02 17:20 ` [PATCH v2 1/1] usb: gadget: f_fs: Support zerocopy transfers via mmap Ingo Rohloff
  0 siblings, 1 reply; 6+ messages in thread
From: Ingo Rohloff @ 2022-02-02 17:20 UTC (permalink / raw)
  To: gregkh, balbi; +Cc: linux-usb, Ingo Rohloff

The
commit f7d34b445abc00e979b7 ("USB: Add support for usbfs zerocopy.")
added support for zerocopy operations for an USB Host via devio.c

The idea is to mmap buffers into user space, which are then filled
with data (either by the kernel for reads or by the user for writes).

Using these mmapped buffers avoids copying data between kernel space
and user space.

The patch proposed here, tries to do the same for a USB Gadget and a
user space application using USB Gaget FunctionFS.

Note: As long as you do not use mmap and/or libaio, FunctionFS should
behave exactly as before.

V2:

The mmapped buffers are now associated with a "struct file *".

This is achieved by adding another in-between 
"struct ffs_ep_listener", which is allocated per "struct file *".

I believe I botched that up in the previous V1 proposal;

It seems using a list of mmapped segments associated to a 
"struct file *" is the right approach?

To limit the amount of memory user space processes might mmap, per
default this is limited to 16 MiB per FunctionFS mount point.  This
limit can be modified at the time FunctionFS is mounted, by using the
mount option "mmap_memory_mb=<value>", specifying the allowed mmap
space in MiB.
Example:

   mount -t functionfs -ommap_memory_mb=1 usb0 /usbfunc

A value of 0 means there is NO LIMIT on the amount of memory a user
space application might mmap in total.

If you want to try out, I updated the demonstration code accordingly:

   https://github.com/trace32/test_usb_ffs

so long
  Ingo

Ingo Rohloff (1):
  usb: gadget: f_fs: Support zerocopy transfers via mmap.

 drivers/usb/gadget/function/f_fs.c | 268 ++++++++++++++++++++++++++++-
 drivers/usb/gadget/function/u_fs.h |   4 +
 2 files changed, 266 insertions(+), 6 deletions(-)

-- 
2.17.1


^ permalink raw reply	[flat|nested] 6+ messages in thread
* Re: [PATCH v2 1/1] usb: gadget: f_fs: Support zerocopy transfers via mmap.
@ 2022-02-12 18:17 kernel test robot
  0 siblings, 0 replies; 6+ messages in thread
From: kernel test robot @ 2022-02-12 18:17 UTC (permalink / raw)
  To: kbuild

[-- Attachment #1: Type: text/plain, Size: 23257 bytes --]

CC: llvm(a)lists.linux.dev
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20220202172056.44722-2-ingo.rohloff@lauterbach.com>
References: <20220202172056.44722-2-ingo.rohloff@lauterbach.com>
TO: Ingo Rohloff <ingo.rohloff@lauterbach.com>
TO: gregkh(a)linuxfoundation.org
TO: balbi(a)kernel.org
CC: linux-usb(a)vger.kernel.org
CC: Ingo Rohloff <ingo.rohloff@lauterbach.com>

Hi Ingo,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on usb/usb-testing]
[also build test WARNING on v5.17-rc3 next-20220211]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Ingo-Rohloff/Zerocopy-for-USB-Gadget-FunctionFS/20220203-012919
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
:::::: branch date: 10 days ago
:::::: commit date: 10 days ago
config: riscv-randconfig-c006-20220205 (https://download.01.org/0day-ci/archive/20220212/202202122302.z3tLgceb-lkp(a)intel.com/config)
compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project dee058c670593b999fec19c458dbbd882ad9de56)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/dee77498ca5c303beb5ef64b95072fea55d6267f
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Ingo-Rohloff/Zerocopy-for-USB-Gadget-FunctionFS/20220203-012919
        git checkout dee77498ca5c303beb5ef64b95072fea55d6267f
        # save the config file to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv clang-analyzer 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


clang-analyzer warnings: (new ones prefixed by >>)
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   drivers/w1/w1.c:997:2: warning: Value stored to 'search_bit' is never read [clang-analyzer-deadcode.DeadStores]
           search_bit = 0;
           ^            ~
   drivers/w1/w1.c:997:2: note: Value stored to 'search_bit' is never read
           search_bit = 0;
           ^            ~
   drivers/w1/w1.c:999:2: warning: Value stored to 'last_rn' is never read [clang-analyzer-deadcode.DeadStores]
           last_rn = 0;
           ^         ~
   drivers/w1/w1.c:999:2: note: Value stored to 'last_rn' is never read
           last_rn = 0;
           ^         ~
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   2 warnings generated.
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   6 warnings generated.
   drivers/w1/slaves/w1_therm.c:159:8: warning: Excessive padding in 'struct w1_therm_family_converter' (12 padding bytes, where 4 is optimal). 
   Optimal fields order: 
   f, 
   convert, 
   get_conversion_time, 
   set_resolution, 
   get_resolution, 
   write_data, 
   reserved, 
   broken, 
   bulk_read, 
   consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding]
   struct w1_therm_family_converter {
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:159:8: note: Excessive padding in 'struct w1_therm_family_converter' (12 padding bytes, where 4 is optimal). Optimal fields order: f, convert, get_conversion_time, set_resolution, get_resolution, write_data, reserved, broken, bulk_read, consider reordering the fields or adding explicit padding members
   struct w1_therm_family_converter {
   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:1252:5: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
                                   ret = -EIO;
                                   ^     ~~~~
   drivers/w1/slaves/w1_therm.c:1252:5: note: Value stored to 'ret' is never read
                                   ret = -EIO;
                                   ^     ~~~~
   drivers/w1/slaves/w1_therm.c:1799:2: warning: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
           strcpy(p_args, buf);
           ^~~~~~
   drivers/w1/slaves/w1_therm.c:1799:2: note: Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119
           strcpy(p_args, buf);
           ^~~~~~
   drivers/w1/slaves/w1_therm.c:2089:22: warning: The right operand of '==' is a garbage value [clang-analyzer-core.UndefinedBinaryOperatorResult]
                   if (sl->reg_num.id == reg_num->id)
                                      ^  ~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:2066:6: note: Assuming the condition is false
           if (w1_reset_bus(sl->master))
               ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:2066:2: note: Taking false branch
           if (w1_reset_bus(sl->master))
           ^
   drivers/w1/slaves/w1_therm.c:2076:6: note: Assuming 'ack' is equal to W1_42_SUCCESS_CONFIRM_BYTE
           if (ack != W1_42_SUCCESS_CONFIRM_BYTE)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:2076:2: note: Taking false branch
           if (ack != W1_42_SUCCESS_CONFIRM_BYTE)
           ^
   drivers/w1/slaves/w1_therm.c:2080:2: note: Loop condition is true.  Entering loop body
           for (i = 0; i <= 64; i++) {
           ^
   drivers/w1/slaves/w1_therm.c:2081:7: note: Assuming the condition is false
                   if (w1_reset_bus(sl->master))
                       ^~~~~~~~~~~~~~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:2081:3: note: Taking false branch
                   if (w1_reset_bus(sl->master))
                   ^
   drivers/w1/slaves/w1_therm.c:2087:7: note: Assuming field 'family' is not equal to W1_42_FINISHED_BYTE
                   if (reg_num->family == W1_42_FINISHED_BYTE)
                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/w1/slaves/w1_therm.c:2087:3: note: Taking false branch
                   if (reg_num->family == W1_42_FINISHED_BYTE)
                   ^
   drivers/w1/slaves/w1_therm.c:2089:22: note: The right operand of '==' is a garbage value
                   if (sl->reg_num.id == reg_num->id)
                                      ^  ~~~~~~~~~~~
   Suppressed 2 warnings (2 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
>> drivers/usb/gadget/function/f_fs.c:866:2: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]
           ret = 0;
           ^     ~
   drivers/usb/gadget/function/f_fs.c:866:2: note: Value stored to 'ret' is never read
           ret = 0;
           ^     ~
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   10 warnings generated.
   Suppressed 10 warnings (3 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   11 warnings generated.
   drivers/usb/gadget/function/uvc_configfs.c:2037:30: warning: Value stored to 'u' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
                           struct uvcg_uncompressed *u =
                                                     ^
   drivers/usb/gadget/function/uvc_configfs.c:2037:30: note: Value stored to 'u' during its initialization is never read
                           struct uvcg_uncompressed *u =
                                                     ^
   drivers/usb/gadget/function/uvc_configfs.c:2043:23: warning: Value stored to 'm' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
                           struct uvcg_mjpeg *m =
                                              ^
   drivers/usb/gadget/function/uvc_configfs.c:2043:23: note: Value stored to 'm' during its initialization is never read
                           struct uvcg_mjpeg *m =
                                              ^
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   9 warnings generated.
   Suppressed 9 warnings (2 in non-user code, 7 with check filters).
   Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well.
   12 warnings generated.
   drivers/usb/gadget/legacy/ether.c:373:20: warning: Access to field 'bound' results in a dereference of a null pointer (loaded from variable 'eem_opts') [clang-analyzer-core.NullDereference]
                           eem_opts->bound = true;
                           ~~~~~~~~        ^
   drivers/usb/gadget/legacy/ether.c:307:2: note: 'eem_opts' initialized to a null pointer value
           struct f_eem_opts       *eem_opts = NULL;
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/gadget/legacy/ether.c:314:6: note: Assuming 'use_eem' is false
           if (use_eem) {
               ^~~~~~~
   drivers/usb/gadget/legacy/ether.c:314:2: note: Taking false branch
           if (use_eem) {
           ^
   drivers/usb/gadget/legacy/ether.c:327:13: note: Calling 'can_support_ecm'
           } else if (can_support_ecm(gadget)) {
                      ^~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/gadget/function/u_ether.h:268:7: note: Calling 'gadget_is_altset_supported'
           if (!gadget_is_altset_supported(gadget))
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/usb/gadget.h:523:9: note: Assuming field 'quirk_altset_not_supp' is 0, which participates in a condition later
           return !g->quirk_altset_not_supp;
                  ^~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/usb/gadget.h:523:2: note: Returning without writing to 'g->quirk_altset_not_supp', which participates in a condition later
           return !g->quirk_altset_not_supp;
           ^
   include/linux/usb/gadget.h:523:2: note: Returning the value 1, which participates in a condition later
           return !g->quirk_altset_not_supp;
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/gadget/function/u_ether.h:268:7: note: Returning from 'gadget_is_altset_supported'
           if (!gadget_is_altset_supported(gadget))
                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/gadget/function/u_ether.h:268:2: note: Taking false branch
           if (!gadget_is_altset_supported(gadget))
           ^
   drivers/usb/gadget/function/u_ether.h:275:2: note: Returning the value 1, which participates in a condition later
           return true;
           ^~~~~~~~~~~
   drivers/usb/gadget/legacy/ether.c:327:13: note: Returning from 'can_support_ecm'
           } else if (can_support_ecm(gadget)) {
                      ^~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/gadget/legacy/ether.c:327:9: note: Taking true branch
           } else if (can_support_ecm(gadget)) {
                  ^
   drivers/usb/gadget/legacy/ether.c:331:7: note: Calling 'IS_ERR'
                   if (IS_ERR(fi_ecm))
                       ^~~~~~~~~~~~~~
   include/linux/err.h:36:9: note: Assuming the condition is false
           return IS_ERR_VALUE((unsigned long)ptr);
                  ^
   include/linux/err.h:22:34: note: expanded from macro 'IS_ERR_VALUE'
   #define IS_ERR_VALUE(x) unlikely((unsigned long)(void *)(x) >= (unsigned long)-MAX_ERRNO)
                           ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:48:41: note: expanded from macro 'unlikely'
   #  define unlikely(x)   (__branch_check__(x, 0, __builtin_constant_p(x)))
                            ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/compiler.h:33:34: note: expanded from macro '__branch_check__'
                           ______r = __builtin_expect(!!(x), expect);      \

vim +/ret +866 drivers/usb/gadget/function/f_fs.c

dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  847  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  848  static int ffs_epfile_mmap(struct file *file, struct vm_area_struct *vma)
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  849  {
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  850  	struct ffs_ep_listener *listener = file->private_data;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  851  	struct ffs_memory *ffsm = NULL;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  852  	size_t size = vma->vm_end - vma->vm_start;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  853  	char *kmem;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  854  	int rc, ret;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  855  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  856  	if (!IS_ALIGNED(size, PAGE_SIZE))
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  857  		return -EFAULT;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  858  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  859  	rc = ffsm_increase_mmap_mem_usage(
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  860  		listener->epfile->ffs,
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  861  		size + sizeof(struct ffs_memory)
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  862  	);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  863  	if (rc)
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  864  		return -ENOMEM;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  865  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02 @866  	ret = 0;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  867  	ffsm = kzalloc(sizeof(struct ffs_memory), GFP_KERNEL);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  868  	if (!ffsm) {
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  869  		ret = -ENOMEM;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  870  		goto error_decrease_mem;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  871  	}
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  872  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  873  	kmem = kzalloc(size, GFP_USER | __GFP_NOWARN);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  874  	if (!kmem) {
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  875  		kfree(ffsm);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  876  		ret = -ENOMEM;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  877  		goto error_decrease_mem;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  878  	}
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  879  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  880  	rc = remap_pfn_range(
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  881  		vma,
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  882  		vma->vm_start,
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  883  		PHYS_PFN(virt_to_phys(kmem)),
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  884  		size,
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  885  		vma->vm_page_prot
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  886  	);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  887  	if (rc < 0) {
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  888  		kfree(kmem);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  889  		kfree(ffsm);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  890  		ret = -EAGAIN;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  891  		goto error_decrease_mem;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  892  	}
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  893  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  894  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  895  	INIT_LIST_HEAD(&ffsm->memlist);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  896  	ffsm->listener = listener;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  897  	ffsm->kmem = kmem;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  898  	ffsm->vm_start = vma->vm_start;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  899  	ffsm->size = size;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  900  	ffsm->vma_use_count = 1;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  901  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  902  	vma->vm_ops = &ffsm_vm_ops;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  903  	vma->vm_private_data = ffsm;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  904  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  905  	spin_lock_irq(&listener->ffsm_lock);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  906  	list_add_tail(&ffsm->memlist, &listener->ffsm_list);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  907  	spin_unlock_irq(&listener->ffsm_lock);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  908  	return 0;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  909  
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  910  error_decrease_mem:
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  911  	ffsm_decrease_mmap_mem_usage(
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  912  		listener->epfile->ffs,
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  913  		size + sizeof(struct ffs_memory)
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  914  	);
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  915  	return ret;
dee77498ca5c30 drivers/usb/gadget/function/f_fs.c Ingo Rohloff      2022-02-02  916  }
ddf8abd2599491 drivers/usb/gadget/f_fs.c          Michal Nazarewicz 2010-05-05  917  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2022-02-12 18:17 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-02-02 17:20 [PATCH v2 0/1] Zerocopy for USB Gadget FunctionFS Ingo Rohloff
2022-02-02 17:20 ` [PATCH v2 1/1] usb: gadget: f_fs: Support zerocopy transfers via mmap Ingo Rohloff
2022-02-08 10:44   ` Greg KH
2022-02-08 11:48     ` Ingo Rohloff
2022-02-08 15:21       ` Alan Stern
  -- strict thread matches above, loose matches on Subject: below --
2022-02-12 18:17 kernel test robot

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.