1. 14 11月, 2018 1 次提交
  2. 18 10月, 2018 1 次提交
  3. 29 8月, 2018 3 次提交
  4. 03 8月, 2018 2 次提交
    • M
      scsi: target: loop, usb, vhost, xen: use target_remove_session · 25b88550
      Mike Christie 提交于
      This converts drivers that were only calling transport_deregister_session
      to use target_remove_session. The calling of
      transport_deregister_session_configfs via target_remove_session for these
      types of drivers is ok, because they were not exporting info from fields
      like sess_acl_list, sess->se_tpg and sess->fabric_sess_ptr from configfs
      accessible functions, so they will see no difference.
      Signed-off-by: NMike Christie <mchristi@redhat.com>
      Reviewed-by: NBart Van Assche <bart.vanassche@wdc.com>
      Reviewed-by: NChristoph Hellwig <hch@lst.de>
      Cc: Felipe Balbi <balbi@kernel.org>
      Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
      Cc: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Cc: Juergen Gross <jgross@suse.com>
      Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
      25b88550
    • M
      scsi: target: rename target_alloc_session · fa834287
      Mike Christie 提交于
      Rename target_alloc_session to target_setup_session to avoid confusion with
      the other transport session allocation function that only allocates the
      session and because the target_alloc_session does so much more. It
      allocates the session, sets up the nacl and registers the session.
      
      The next patch will then add a remove function to match the setup in this
      one, so it should make sense for all drivers, except iscsi, to just call
      those 2 functions to setup and remove a session.
      
      iscsi will continue to be the odd driver.
      Signed-off-by: NMike Christie <mchristi@redhat.com>
      Reviewed-by: NBart Van Assche <bart.vanassche@wdc.com>
      Reviewed-by: NChristoph Hellwig <hch@lst.de>
      Cc: Chris Boot <bootc@bootc.net>
      Cc: Bryant G. Ly <bryantly@linux.vnet.ibm.com>
      Cc: Michael Cyr <mikecyr@linux.vnet.ibm.com>
      Cc: <qla2xxx-upstream@qlogic.com>
      Cc: Johannes Thumshirn <jth@kernel.org>
      Cc: Felipe Balbi <balbi@kernel.org>
      Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
      Cc: Andrzej Pietrasiewicz <andrzej.p@samsung.com>
      Cc: Michael S. Tsirkin <mst@redhat.com>
      Cc: Juergen Gross <jgross@suse.com>
      Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
      fa834287
  5. 30 7月, 2018 1 次提交
    • Y
      usb: gadget: udc: renesas_usb3: Add register of usb role switch · 39facfa0
      Yoshihiro Shimoda 提交于
      This patch adds role switch support for R-Car SoCs into the USB 3.0
      peripheral driver. Some R-Car SoCs (e.g. R-Car H3) have USB 3.0
      dual-role device controller which has the USB 3.0 xHCI host and
      Renesas USB 3.0 peripheral.
      
      Unfortunately, the mode change register (DRD_CON) contains
      the USB 3.0 peripheral controller side only. So, this renesas_usb3
      driver manages the DRD_CON now. However, in peripheral mode, the host
      should stop. Also the host hardware needs to reinitialize its own
      registers when the mode changes from peripheral to host mode.
      Otherwise, the host cannot work correctly (e.g. detect a device
      as high-speed).
      
      To achieve this reinitialization by a driver, this driver also
      registers a role switch driver to manage the DRD_CON and get
      a device pointer of usb 3.0 host from "companion" property of OF.
      Then, when the usb role is changed, renesas_usb3_role_switch_set()
      will attach/release the xhci-plat driver to reinitialize the host
      hardware.
      Signed-off-by: NYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
      Reviewed-by: NHeikki Krogerus <heikki.krogerus@linux.intel.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      39facfa0
  6. 26 7月, 2018 11 次提交
  7. 20 7月, 2018 1 次提交
    • J
      usb: gadget: f_fs: Only return delayed status when len is 0 · 4d644abf
      Jerry Zhang 提交于
      Commit 1b9ba000 ("Allow function drivers to pause control
      transfers") states that USB_GADGET_DELAYED_STATUS is only
      supported if data phase is 0 bytes.
      
      It seems that when the length is not 0 bytes, there is no
      need to explicitly delay the data stage since the transfer
      is not completed until the user responds. However, when the
      length is 0, there is no data stage and the transfer is
      finished once setup() returns, hence there is a need to
      explicitly delay completion.
      
      This manifests as the following bugs:
      
      Prior to 946ef68a ('Let setup() return
      USB_GADGET_DELAYED_STATUS'), when setup is 0 bytes, ffs
      would require user to queue a 0 byte request in order to
      clear setup state. However, that 0 byte request was actually
      not needed and would hang and cause errors in other setup
      requests.
      
      After the above commit, 0 byte setups work since the gadget
      now accepts empty queues to ep0 to clear the delay, but all
      other setups hang.
      
      Fixes: 946ef68a ("Let setup() return USB_GADGET_DELAYED_STATUS")
      Signed-off-by: NJerry Zhang <zhangjerry@google.com>
      Cc: stable <stable@vger.kernel.org>
      Acked-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      4d644abf
  8. 17 7月, 2018 12 次提交
    • E
      usb: gadget: f_uac2: fix endianness of 'struct cntrl_*_lay3' · eec24f2a
      Eugeniu Rosca 提交于
      The list [1] of commits doing endianness fixes in USB subsystem is long
      due to below quote from USB spec Revision 2.0 from April 27, 2000:
      
      ------------
      8.1 Byte/Bit Ordering
      
      Multiple byte fields in standard descriptors, requests, and responses
      are interpreted as and moved over the bus in little-endian order, i.e.
      LSB to MSB.
      ------------
      
      This commit belongs to the same family.
      
      [1] Example of endianness fixes in USB subsystem:
      commit 14e1d56c ("usb: gadget: f_uac2: endianness fixes.")
      commit 42370b82 ("usb: gadget: f_uac1: endianness fixes.")
      commit 63afd5cc ("USB: chaoskey: fix Alea quirk on big-endian hosts")
      commit 74098c4a ("usb: gadget: acm: fix endianness in notifications")
      commit cdd7928d ("ACM gadget: fix endianness in notifications")
      commit 323ece54 ("cdc-wdm: fix endianness bug in debug statements")
      commit e102609f ("usb: gadget: uvc: Fix endianness mismatches")
             list goes on
      
      Fixes: 132fcb46 ("usb: gadget: Add Audio Class 2.0 Driver")
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Reviewed-by: NRuslan Bilovol <ruslan.bilovol@gmail.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      eec24f2a
    • B
      usb: gadget: aspeed: Workaround memory ordering issue · bb286336
      Benjamin Herrenschmidt 提交于
      The Aspeed SoC has a memory ordering issue that (thankfully)
      only affects the USB gadget device. A read back is necessary
      after writing to memory and before letting the device DMA
      from it.
      Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      bb286336
    • V
      usb: gadget: u_audio: protect stream runtime fields with stream spinlock · 56bc6158
      Vladimir Zapolskiy 提交于
      The change protects almost the whole body of u_audio_iso_complete()
      function by PCM stream lock, this is mainly sufficient to avoid a race
      between USB request completion and stream termination, the change
      prevents a possibility of invalid memory access in interrupt context
      by memcpy():
      
          Unable to handle kernel paging request at virtual address 00004e80
          pgd = c0004000
          [00004e80] *pgd=00000000
          Internal error: Oops: 817 [#1] PREEMPT SMP ARM
          CPU: 0 PID: 3 Comm: ksoftirqd/0 Tainted: G         C   3.14.54+ #117
          task: da180b80 ti: da192000 task.ti: da192000
          PC is at memcpy+0x50/0x330
          LR is at 0xcdd92b0e
          pc : [<c029ef30>]    lr : [<cdd92b0e>]    psr: 20000193
          sp : da193ce4  ip : dd86ae26  fp : 0000b180
          r10: daf81680  r9 : 00000000  r8 : d58a01ea
          r7 : 2c0b43e4  r6 : acdfb08b  r5 : 01a271cf  r4 : 87389377
          r3 : 69469782  r2 : 00000020  r1 : daf82fe0  r0 : 00004e80
          Flags: nzCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
          Control: 10c5387d  Table: 2b70804a  DAC: 00000015
          Process ksoftirqd/0 (pid: 3, stack limit = 0xda192238)
      
      Also added a check for potential !runtime condition, commonly it is
      done by PCM_RUNTIME_CHECK(substream) in the beginning, however this
      does not completely prevent from oopses in u_audio_iso_complete(),
      because the proper protection scheme must be implemented in PCM
      library functions.
      
      An example of *not fixed* oops due to substream->runtime->*
      dereference by snd_pcm_running(substream) from
      snd_pcm_period_elapsed(), where substream->runtime is gone while
      waiting the substream lock:
      
          Unable to handle kernel paging request at virtual address 6b6b6b6b
          pgd = db7e4000
          [6b6b6b6b] *pgd=00000000
          CPU: 0 PID: 193 Comm: klogd Tainted: G         C   3.14.54+ #118
          task: db5ac500 ti: db60c000 task.ti: db60c000
          PC is at snd_pcm_period_elapsed+0x48/0xd8 [snd_pcm]
          LR is at snd_pcm_period_elapsed+0x40/0xd8 [snd_pcm]
          pc : [<>]    lr : [<>]    psr: 60000193
          Flags: nZCv  IRQs off  FIQs on  Mode SVC_32  ISA ARM  Segment user
          Control: 10c5387d  Table: 2b7e404a  DAC: 00000015
          Process klogd (pid: 193, stack limit = 0xdb60c238)
          [<>] (snd_pcm_period_elapsed [snd_pcm]) from [<>] (udc_irq+0x500/0xbbc)
          [<>] (udc_irq) from [<>] (ci_irq+0x280/0x304)
          [<>] (ci_irq) from [<>] (handle_irq_event_percpu+0xa4/0x40c)
          [<>] (handle_irq_event_percpu) from [<>] (handle_irq_event+0x3c/0x5c)
          [<>] (handle_irq_event) from [<>] (handle_fasteoi_irq+0xc4/0x110)
          [<>] (handle_fasteoi_irq) from [<>] (generic_handle_irq+0x20/0x30)
          [<>] (generic_handle_irq) from [<>] (handle_IRQ+0x80/0xc0)
          [<>] (handle_IRQ) from [<>] (gic_handle_irq+0x3c/0x60)
          [<>] (gic_handle_irq) from [<>] (__irq_svc+0x44/0x78)
      Signed-off-by: NVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
      [erosca: W/o this patch, with minimal instrumentation [1], I can
               consistently reproduce BUG: KASAN: use-after-free [2]]
      
      [1] Instrumentation to reproduce issue [2]:
       diff --git a/drivers/usb/gadget/function/u_audio.c b/drivers/usb/gadget/function/u_audio.c
       index a72295c953bb..bd0b308024fe 100644
       --- a/drivers/usb/gadget/function/u_audio.c
       +++ b/drivers/usb/gadget/function/u_audio.c
       @@ -16,6 +16,7 @@
        #include <sound/core.h>
        #include <sound/pcm.h>
        #include <sound/pcm_params.h>
       +#include <linux/delay.h>
      
        #include "u_audio.h"
      
       @@ -147,6 +148,8 @@ static void u_audio_iso_complete(struct usb_ep *ep, struct usb_request *req)
      
       	spin_unlock_irqrestore(&prm->lock, flags);
      
       +	udelay(500); //delay here to increase probability of parallel activities
       +
       	/* Pack USB load in ALSA ring buffer */
       	pending = prm->dma_bytes - hw_ptr;
      
      [2] After applying [1], below BUG occurs on Rcar-H3-Salvator-X board:
      ==================================================================
      BUG: KASAN: use-after-free in u_audio_iso_complete+0x24c/0x520 [u_audio]
      Read of size 8 at addr ffff8006cafcc248 by task swapper/0/0
      
      CPU: 0 PID: 0 Comm: swapper/0 Tainted: G        WC      4.14.47+ #160
      Hardware name: Renesas Salvator-X board based on r8a7795 ES2.0+ (DT)
      Call trace:
      [<ffff2000080925ac>] dump_backtrace+0x0/0x364
      [<ffff200008092924>] show_stack+0x14/0x1c
      [<ffff200008f8dbcc>] dump_stack+0x108/0x174
      [<ffff2000083c71b8>] print_address_description+0x7c/0x32c
      [<ffff2000083c78e8>] kasan_report+0x324/0x354
      [<ffff2000083c6114>] __asan_load8+0x24/0x94
      [<ffff2000021d1b34>] u_audio_iso_complete+0x24c/0x520 [u_audio]
      [<ffff20000152fe50>] usb_gadget_giveback_request+0x480/0x4d0 [udc_core]
      [<ffff200001860ab8>] usbhsg_queue_done+0x100/0x130 [renesas_usbhs]
      [<ffff20000185f814>] usbhsf_pkt_handler+0x1a4/0x298 [renesas_usbhs]
      [<ffff20000185fb38>] usbhsf_irq_ready+0x128/0x178 [renesas_usbhs]
      [<ffff200001859cc8>] usbhs_interrupt+0x440/0x490 [renesas_usbhs]
      [<ffff2000081a0288>] __handle_irq_event_percpu+0x594/0xa58
      [<ffff2000081a07d0>] handle_irq_event_percpu+0x84/0x12c
      [<ffff2000081a0928>] handle_irq_event+0xb0/0x10c
      [<ffff2000081a8384>] handle_fasteoi_irq+0x1e0/0x2ec
      [<ffff20000819e5f8>] generic_handle_irq+0x2c/0x44
      [<ffff20000819f0d0>] __handle_domain_irq+0x190/0x194
      [<ffff20000808177c>] gic_handle_irq+0x80/0xac
      Exception stack(0xffff200009e97c80 to 0xffff200009e97dc0)
      7c80: 0000000000000000 0000000000000000 0000000000000003 ffff200008179298
      7ca0: ffff20000ae1c180 dfff200000000000 0000000000000000 ffff2000081f9a88
      7cc0: ffff200009eb5960 ffff200009e97cf0 0000000000001600 ffff0400041b064b
      7ce0: 0000000000000000 0000000000000002 0000000200000001 0000000000000001
      7d00: ffff20000842197c 0000ffff958c4970 0000000000000000 ffff8006da0d5b80
      7d20: ffff8006d4678498 0000000000000000 000000126bde0a8b ffff8006d4678480
      7d40: 0000000000000000 000000126bdbea64 ffff200008fd0000 ffff8006fffff980
      7d60: 00000000495f0018 ffff200009e97dc0 ffff200008b6c4ec ffff200009e97dc0
      7d80: ffff200008b6c4f0 0000000020000145 ffff8006da0d5b80 ffff8006d4678498
      7da0: ffffffffffffffff ffff8006d4678498 ffff200009e97dc0 ffff200008b6c4f0
      [<ffff200008084034>] el1_irq+0xb4/0x12c
      [<ffff200008b6c4f0>] cpuidle_enter_state+0x818/0x844
      [<ffff200008b6c59c>] cpuidle_enter+0x18/0x20
      [<ffff20000815f2e4>] call_cpuidle+0x98/0x9c
      [<ffff20000815f674>] do_idle+0x214/0x264
      [<ffff20000815facc>] cpu_startup_entry+0x20/0x24
      [<ffff200008fb09d8>] rest_init+0x30c/0x320
      [<ffff2000095f1338>] start_kernel+0x570/0x5b0
      ---<-snip->---
      
      Fixes: 132fcb46 ("usb: gadget: Add Audio Class 2.0 Driver")
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      56bc6158
    • V
      usb: gadget: u_audio: remove cached period bytes value · 773e53d5
      Vladimir Zapolskiy 提交于
      Substream period size potentially can be changed in runtime, however
      this is not accounted in the data copying routine, the change replaces
      the cached value with an actual value from substream runtime.
      
      As a side effect the change also removes a potential division by zero
      in u_audio_iso_complete() function, if there is a race with
      uac_pcm_hw_free(), which sets prm->period_size to 0.
      
      Fixes: 132fcb46 ("usb: gadget: Add Audio Class 2.0 Driver")
      Signed-off-by: NVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      773e53d5
    • V
      usb: gadget: u_audio: remove caching of stream buffer parameters · 96afb54e
      Vladimir Zapolskiy 提交于
      There is no necessity to copy PCM stream ring buffer area and size
      properties to UAC private data structure, these values can be got
      from substream itself.
      
      The change gives more control on substream and avoid stale caching.
      
      Fixes: 132fcb46 ("usb: gadget: Add Audio Class 2.0 Driver")
      Signed-off-by: NVladimir Zapolskiy <vladimir_zapolskiy@mentor.com>
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      96afb54e
    • J
      usb: gadget: u_audio: update hw_ptr in iso_complete after data copied · 6b37bd78
      Joshua Frkuska 提交于
      In u_audio_iso_complete, the runtime hw_ptr is updated before the
      data is actually copied over to/from the buffer/dma area. When
      ALSA uses this hw_ptr, the data may not actually be available to
      be used. This causes trash/stale audio to play/record. This
      patch updates the hw_ptr after the data has been copied to avoid
      this.
      
      Fixes: 132fcb46 ("usb: gadget: Add Audio Class 2.0 Driver")
      Signed-off-by: NJoshua Frkuska <joshua_frkuska@mentor.com>
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      6b37bd78
    • E
      usb: gadget: u_audio: fix pcm/card naming in g_audio_setup() · dfa042fa
      Eugeniu Rosca 提交于
      Fix below smatch (v0.5.0-4443-g69e9094e11c1) warnings:
      drivers/usb/gadget/function/u_audio.c:607 g_audio_setup() warn: strcpy() 'pcm_name' of unknown size might be too large for 'pcm->name'
      drivers/usb/gadget/function/u_audio.c:614 g_audio_setup() warn: strcpy() 'card_name' of unknown size might be too large for 'card->driver'
      drivers/usb/gadget/function/u_audio.c:615 g_audio_setup() warn: strcpy() 'card_name' of unknown size might be too large for 'card->shortname'
      
      Below commits performed a similar 's/strcpy/strlcpy/' rework:
      * v2.6.31 commit 8372d498 ("ALSA: ctxfi - Fix PCM device naming")
      * v4.14 commit 003d3e70 ("ALSA: ad1848: fix format string overflow warning")
      * v4.14 commit 6d8b04de ("ALSA: cs423x: fix format string overflow warning")
      
      Fixes: eb9fecb9 ("usb: gadget: f_uac2: split out audio core")
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      dfa042fa
    • E
      usb: gadget: f_uac2: fix error handling in afunc_bind (again) · e87581fe
      Eugeniu Rosca 提交于
      If usb_ep_autoconfig() fails (i.e. returns a null endpoint descriptor),
      we expect afunc_bind() to fail (i.e. return a negative error code).
      
      However, due to v4.10-rc1 commit f1d3861d ("usb: gadget: f_uac2: fix
      error handling at afunc_bind"), afunc_bind() returns zero, telling the
      caller that it succeeded. This then generates NULL pointer dereference
      in below scenario on Rcar H3-ES20-Salvator-X target:
      
      rcar-gen3:/home/root# modprobe g_audio
      [  626.521155] g_audio gadget: afunc_bind:565 Error!
      [  626.526319] g_audio gadget: Linux USB Audio Gadget, version: Feb 2, 2012
      [  626.533405] g_audio gadget: g_audio ready
      rcar-gen3:/home/root#
      rcar-gen3:/home/root# modprobe -r g_audio
      [  728.256707] ==================================================================
      [  728.264293] BUG: KASAN: null-ptr-deref in u_audio_stop_capture+0x70/0x268 [u_audio]
      [  728.272244] Read of size 8 at addr 00000000000000a0 by task modprobe/2545
      [  728.279309]
      [  728.280849] CPU: 0 PID: 2545 Comm: modprobe Tainted: G        WC      4.14.47+ #152
      [  728.288778] Hardware name: Renesas Salvator-X board based on r8a7795 ES2.0+ (DT)
      [  728.296454] Call trace:
      [  728.299151] [<ffff2000080925ac>] dump_backtrace+0x0/0x364
      [  728.304808] [<ffff200008092924>] show_stack+0x14/0x1c
      [  728.310081] [<ffff200008f8d5cc>] dump_stack+0x108/0x174
      [  728.315522] [<ffff2000083c77c8>] kasan_report+0x1fc/0x354
      [  728.321134] [<ffff2000083c611c>] __asan_load8+0x24/0x94
      [  728.326600] [<ffff2000021e1618>] u_audio_stop_capture+0x70/0x268 [u_audio]
      [  728.333735] [<ffff2000021f8b7c>] afunc_disable+0x44/0x60 [usb_f_uac2]
      [  728.340503] [<ffff20000218177c>] usb_remove_function+0x9c/0x210 [libcomposite]
      [  728.348060] [<ffff200002183320>] remove_config.isra.2+0x1d8/0x218 [libcomposite]
      [  728.355788] [<ffff200002186c54>] __composite_unbind+0x104/0x1f8 [libcomposite]
      [  728.363339] [<ffff200002186d58>] composite_unbind+0x10/0x18 [libcomposite]
      [  728.370536] [<ffff20000152f158>] usb_gadget_remove_driver+0xc0/0x170 [udc_core]
      [  728.378172] [<ffff20000153154c>] usb_gadget_unregister_driver+0x1cc/0x258 [udc_core]
      [  728.386274] [<ffff200002180de8>] usb_composite_unregister+0x10/0x18 [libcomposite]
      [  728.394116] [<ffff2000021d035c>] audio_driver_exit+0x14/0x28 [g_audio]
      [  728.400878] [<ffff200008213ed4>] SyS_delete_module+0x288/0x32c
      [  728.406935] Exception stack(0xffff8006cf6c7ec0 to 0xffff8006cf6c8000)
      [  728.413624] 7ec0: 0000000006136428 0000000000000800 0000000000000000 0000ffffd706efe8
      [  728.421718] 7ee0: 0000ffffd706efe9 000000000000000a 1999999999999999 0000000000000000
      [  728.429792] 7f00: 000000000000006a 000000000042c078 0000000000000000 0000000000000005
      [  728.437870] 7f20: 0000000000000000 0000000000000000 0000000000000004 0000000000000000
      [  728.445952] 7f40: 000000000042bfc8 0000ffffbc7c8f40 0000000000000000 00000000061363c0
      [  728.454035] 7f60: 0000000006136428 0000000000000000 0000000000000000 0000000006136428
      [  728.462114] 7f80: 000000000042c000 0000ffffd7071448 000000000042c000 0000000000000000
      [  728.470190] 7fa0: 00000000061350c0 0000ffffd7070010 000000000041129c 0000ffffd7070010
      [  728.478281] 7fc0: 0000ffffbc7c8f48 0000000060000000 0000000006136428 000000000000006a
      [  728.486351] 7fe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
      [  728.494434] [<ffff200008084780>] el0_svc_naked+0x34/0x38
      [  728.499957] ==================================================================
      [  728.507801] Unable to handle kernel NULL pointer dereference at virtual address 000000a0
      [  728.517742] Mem abort info:
      [  728.520993]   Exception class = DABT (current EL), IL = 32 bits
      [  728.527375]   SET = 0, FnV = 0
      [  728.530731]   EA = 0, S1PTW = 0
      [  728.534361] Data abort info:
      [  728.537650]   ISV = 0, ISS = 0x00000006
      [  728.541863]   CM = 0, WnR = 0
      [  728.545167] user pgtable: 4k pages, 48-bit VAs, pgd = ffff8006c6100000
      [  728.552156] [00000000000000a0] *pgd=0000000716a8d003
      [  728.557519] , *pud=00000007116fc003
      [  728.561259] , *pmd=0000000000000000
      [  728.564985] Internal error: Oops: 96000006 [#1] PREEMPT SMP
      [  728.570815] Modules linked in:
      [  728.574023]  usb_f_uac2
      [  728.576560]  u_audio
      [  728.578827]  g_audio(-)
      [  728.581361]  libcomposite
      [  728.584071]  configfs
      [  728.586428]  aes_ce_blk
      [  728.588960]  sata_rcar
      [  728.591421]  crypto_simd
      [  728.594039]  cryptd
      [  728.596217]  libata
      [  728.598396]  aes_ce_cipher
      [  728.601188]  crc32_ce
      [  728.603542]  ghash_ce
      [  728.605896]  gf128mul
      [  728.608250]  aes_arm64
      [  728.610692]  scsi_mod
      [  728.613046]  sha2_ce
      [  728.615313]  xhci_plat_hcd
      [  728.618106]  sha256_arm64
      [  728.620811]  sha1_ce
      [  728.623077]  renesas_usbhs
      [  728.625869]  xhci_hcd
      [  728.628243]  renesas_usb3
      [  728.630948]  sha1_generic
      [  728.633670]  ravb_streaming(C)
      [  728.636814]  udc_core
      [  728.639168]  cpufreq_dt
      [  728.641697]  rcar_gen3_thermal
      [  728.644840]  usb_dmac
      [  728.647194]  pwm_rcar
      [  728.649548]  thermal_sys
      [  728.652165]  virt_dma
      [  728.654519]  mch_core(C)
      [  728.657137]  pwm_bl
      [  728.659315]  snd_soc_rcar
      [  728.662020]  snd_aloop
      [  728.664462]  snd_soc_generic_card
      [  728.667869]  snd_soc_ak4613
      [  728.670749]  ipv6
      [  728.672768]  autofs4
      [  728.675052] CPU: 0 PID: 2545 Comm: modprobe Tainted: G    B   WC      4.14.47+ #152
      [  728.682973] Hardware name: Renesas Salvator-X board based on r8a7795 ES2.0+ (DT)
      [  728.690637] task: ffff8006ced38000 task.stack: ffff8006cf6c0000
      [  728.696814] PC is at u_audio_stop_capture+0x70/0x268 [u_audio]
      [  728.702896] LR is at u_audio_stop_capture+0x70/0x268 [u_audio]
      [  728.708964] pc : [<ffff2000021e1618>] lr : [<ffff2000021e1618>] pstate: 60000145
      [  728.716620] sp : ffff8006cf6c7a50
      [  728.720154] x29: ffff8006cf6c7a50
      [  728.723760] x28: ffff8006ced38000
      [  728.727272] x27: ffff200008fd7000
      [  728.730857] x26: ffff2000021d2340
      [  728.734361] x25: 0000000000000000
      [  728.737948] x24: ffff200009e94b08
      [  728.741452] x23: 00000000000000a0
      [  728.745052] x22: 00000000000000a8
      [  728.748558] x21: 1ffff000d9ed8f7c
      [  728.752142] x20: ffff8006d671a800
      [  728.755646] x19: 0000000000000000
      [  728.759231] x18: 0000000000000000
      [  728.762736] x17: 0000ffffbc7c8f40
      [  728.766320] x16: ffff200008213c4c
      [  728.769823] x15: 0000000000000000
      [  728.773408] x14: 0720072007200720
      [  728.776912] x13: 0720072007200720
      [  728.780497] x12: ffffffffffffffff
      [  728.784001] x11: 0000000000000040
      [  728.787598] x10: 0000000000001600
      [  728.791103] x9 : ffff8006cf6c77a0
      [  728.794689] x8 : ffff8006ced39660
      [  728.798193] x7 : ffff20000811c738
      [  728.801794] x6 : 0000000000000000
      [  728.805299] x5 : dfff200000000000
      [  728.808885] x4 : ffff8006ced38000
      [  728.812390] x3 : ffff200008fb46e8
      [  728.815976] x2 : 0000000000000007
      [  728.819480] x1 : 3ba68643e7431500
      [  728.823066] x0 : 0000000000000000
      [  728.826574] Process modprobe (pid: 2545, stack limit = 0xffff8006cf6c0000)
      [  728.833704] Call trace:
      [  728.836292] Exception stack(0xffff8006cf6c7910 to 0xffff8006cf6c7a50)
      [  728.842987] 7900:                                   0000000000000000 3ba68643e7431500
      [  728.851084] 7920: 0000000000000007 ffff200008fb46e8 ffff8006ced38000 dfff200000000000
      [  728.859173] 7940: 0000000000000000 ffff20000811c738 ffff8006ced39660 ffff8006cf6c77a0
      [  728.867248] 7960: 0000000000001600 0000000000000040 ffffffffffffffff 0720072007200720
      [  728.875323] 7980: 0720072007200720 0000000000000000 ffff200008213c4c 0000ffffbc7c8f40
      [  728.883412] 79a0: 0000000000000000 0000000000000000 ffff8006d671a800 1ffff000d9ed8f7c
      [  728.891485] 79c0: 00000000000000a8 00000000000000a0 ffff200009e94b08 0000000000000000
      [  728.899561] 79e0: ffff2000021d2340 ffff200008fd7000 ffff8006ced38000 ffff8006cf6c7a50
      [  728.907636] 7a00: ffff2000021e1618 ffff8006cf6c7a50 ffff2000021e1618 0000000060000145
      [  728.915710] 7a20: 0000000000000008 0000000000000000 0000ffffffffffff 3ba68643e7431500
      [  728.923780] 7a40: ffff8006cf6c7a50 ffff2000021e1618
      [  728.928880] [<ffff2000021e1618>] u_audio_stop_capture+0x70/0x268 [u_audio]
      [  728.936032] [<ffff2000021f8b7c>] afunc_disable+0x44/0x60 [usb_f_uac2]
      [  728.942822] [<ffff20000218177c>] usb_remove_function+0x9c/0x210 [libcomposite]
      [  728.950385] [<ffff200002183320>] remove_config.isra.2+0x1d8/0x218 [libcomposite]
      [  728.958134] [<ffff200002186c54>] __composite_unbind+0x104/0x1f8 [libcomposite]
      [  728.965689] [<ffff200002186d58>] composite_unbind+0x10/0x18 [libcomposite]
      [  728.972882] [<ffff20000152f158>] usb_gadget_remove_driver+0xc0/0x170 [udc_core]
      [  728.980522] [<ffff20000153154c>] usb_gadget_unregister_driver+0x1cc/0x258 [udc_core]
      [  728.988638] [<ffff200002180de8>] usb_composite_unregister+0x10/0x18 [libcomposite]
      [  728.996472] [<ffff2000021d035c>] audio_driver_exit+0x14/0x28 [g_audio]
      [  729.003231] [<ffff200008213ed4>] SyS_delete_module+0x288/0x32c
      [  729.009278] Exception stack(0xffff8006cf6c7ec0 to 0xffff8006cf6c8000)
      [  729.015946] 7ec0: 0000000006136428 0000000000000800 0000000000000000 0000ffffd706efe8
      [  729.024022] 7ee0: 0000ffffd706efe9 000000000000000a 1999999999999999 0000000000000000
      [  729.032099] 7f00: 000000000000006a 000000000042c078 0000000000000000 0000000000000005
      [  729.040172] 7f20: 0000000000000000 0000000000000000 0000000000000004 0000000000000000
      [  729.048263] 7f40: 000000000042bfc8 0000ffffbc7c8f40 0000000000000000 00000000061363c0
      [  729.056337] 7f60: 0000000006136428 0000000000000000 0000000000000000 0000000006136428
      [  729.064411] 7f80: 000000000042c000 0000ffffd7071448 000000000042c000 0000000000000000
      [  729.072484] 7fa0: 00000000061350c0 0000ffffd7070010 000000000041129c 0000ffffd7070010
      [  729.080563] 7fc0: 0000ffffbc7c8f48 0000000060000000 0000000006136428 000000000000006a
      [  729.088636] 7fe0: 0000000000000000 0000000000000000 0000000000000000 0000000000000000
      [  729.096733] [<ffff200008084780>] el0_svc_naked+0x34/0x38
      [  729.102259] Code: 9597d1b3 aa1703e0 9102a276 958792b9 (f9405275)
      [  729.108617] ---[ end trace 7560c5fa3d100243 ]---
      
      After this patch is applied, the issue is fixed:
      rcar-gen3:/home/root# modprobe g_audio
      [   59.217127] g_audio gadget: afunc_bind:565 Error!
      [   59.222329] g_audio ee020000.usb: failed to start g_audio: -19
      modprobe: ERROR: could not insert 'g_audio': No such device
      rcar-gen3:/home/root# modprobe -r g_audio
      rcar-gen3:/home/root#
      
      Fixes: f1d3861d ("usb: gadget: f_uac2: fix error handling at afunc_bind")
      Signed-off-by: NEugeniu Rosca <erosca@de.adit-jv.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      e87581fe
    • J
      usb: gadget: r8a66597: Fix a possible sleep-in-atomic-context bugs in r8a66597_queue() · f36b507c
      Jia-Ju Bai 提交于
      The driver may sleep in an interrupt handler.
      The function call path (from bottom to top) in Linux-4.16.7 is:
      
      [FUNC] r8a66597_queue(GFP_KERNEL)
      drivers/usb/gadget/udc/r8a66597-udc.c, 1193:
      		r8a66597_queue in get_status
      drivers/usb/gadget/udc/r8a66597-udc.c, 1301:
      		get_status in setup_packet
      drivers/usb/gadget/udc/r8a66597-udc.c, 1381:
      		setup_packet in irq_control_stage
      drivers/usb/gadget/udc/r8a66597-udc.c, 1508:
      		irq_control_stage in r8a66597_irq (interrupt handler)
      
      To fix this bug, GFP_KERNEL is replaced with GFP_ATOMIC.
      
      This bug is found by my static analysis tool (DSAC-2) and checked by
      my code review.
      Signed-off-by: NJia-Ju Bai <baijiaju1990@gmail.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      f36b507c
    • J
      usb: gadget: r8a66597: Fix two possible sleep-in-atomic-context bugs in init_controller() · 0602088b
      Jia-Ju Bai 提交于
      The driver may sleep with holding a spinlock.
      The function call paths (from bottom to top) in Linux-4.16.7 are:
      
      [FUNC] msleep
      drivers/usb/gadget/udc/r8a66597-udc.c, 839:
      		msleep in init_controller
      drivers/usb/gadget/udc/r8a66597-udc.c, 96:
      		init_controller in r8a66597_usb_disconnect
      drivers/usb/gadget/udc/r8a66597-udc.c, 93:
      		spin_lock in r8a66597_usb_disconnect
      
      [FUNC] msleep
      drivers/usb/gadget/udc/r8a66597-udc.c, 835:
      		msleep in init_controller
      drivers/usb/gadget/udc/r8a66597-udc.c, 96:
      		init_controller in r8a66597_usb_disconnect
      drivers/usb/gadget/udc/r8a66597-udc.c, 93:
      		spin_lock in r8a66597_usb_disconnect
      
      To fix these bugs, msleep() is replaced with mdelay().
      
      This bug is found by my static analysis tool (DSAC-2) and checked by
      my code review.
      Signed-off-by: NJia-Ju Bai <baijiaju1990@gmail.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      0602088b
    • B
      usb: gadget: Fix OS descriptors support · 50b9773c
      Benjamin Herrenschmidt 提交于
      The current code is broken as it re-defines "req" inside the
      if block, then goto out of it. Thus the request that ends
      up being sent is not the one that was populated by the
      code in question.
      
      This fixes RNDIS driver autodetect by Windows 10 for me.
      
      The bug was introduced by Chris rework to remove the local
      queuing inside the if { } block of the redefined request.
      
      Fixes: 636ba13a ("usb: gadget: composite: remove duplicated code in OS desc handling")
      Cc: <stable@vger.kernel.org> # v4.17
      Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      50b9773c
    • B
      usb: gadget: aspeed-vhub: Fix SETUP packets with OUT data phase · 9196b55e
      Benjamin Herrenschmidt 提交于
      A couple of bugs in the driver are preventing SETUP packets
      with an OUT data phase from working properly.
      
      Interestingly those are incredibly rare (RNDIS typically
      uses them and thus is broken without this fix).
      
      The main problem was an incorrect register offset being
      applied for arming RX on EP0. The other problem relates
      to stalling such a packet before the data phase, in which
      case we don't get an ACK cycle, and get the next SETUP
      packet directly, so we shouldn't reject it.
      Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      9196b55e
  9. 07 7月, 2018 1 次提交
    • R
      headers: separate linux/mod_devicetable.h from linux/platform_device.h · ac316725
      Randy Dunlap 提交于
      At over 4000 #includes, <linux/platform_device.h> is the 9th most
      #included header file in the Linux kernel.  It does not need
      <linux/mod_devicetable.h>, so drop that header and explicitly add
      <linux/mod_devicetable.h> to source files that need it.
      
         4146 #include <linux/platform_device.h>
      
      After this patch, there are 225 files that use <linux/mod_devicetable.h>,
      for a reduction of around 3900 times that <linux/mod_devicetable.h>
      does not have to be read & parsed.
      
          225 #include <linux/mod_devicetable.h>
      
      This patch was build-tested on 20 different arch-es.
      
      It also makes these drivers SubmitChecklist#1 compliant.
      Signed-off-by: NRandy Dunlap <rdunlap@infradead.org>
      Reported-by: kbuild test robot <lkp@intel.com> # drivers/media/platform/vimc/
      Reported-by: kbuild test robot <lkp@intel.com> # drivers/pinctrl/pinctrl-u300.c
      Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      ac316725
  10. 06 7月, 2018 1 次提交
  11. 03 7月, 2018 1 次提交
  12. 20 6月, 2018 2 次提交
  13. 19 6月, 2018 1 次提交
  14. 18 6月, 2018 1 次提交
    • V
      usb: gadget: ffs: Fix BUG when userland exits with submitted AIO transfers · d52e4d0c
      Vincent Pelletier 提交于
      This bug happens only when the UDC needs to sleep during usb_ep_dequeue,
      as is the case for (at least) dwc3.
      
      [  382.200896] BUG: scheduling while atomic: screen/1808/0x00000100
      [  382.207124] 4 locks held by screen/1808:
      [  382.211266]  #0:  (rcu_callback){....}, at: [<c10b4ff0>] rcu_process_callbacks+0x260/0x440
      [  382.219949]  #1:  (rcu_read_lock_sched){....}, at: [<c1358ba0>] percpu_ref_switch_to_atomic_rcu+0xb0/0x130
      [  382.230034]  #2:  (&(&ctx->ctx_lock)->rlock){....}, at: [<c11f0c73>] free_ioctx_users+0x23/0xd0
      [  382.230096]  #3:  (&(&ffs->eps_lock)->rlock){....}, at: [<f81e7710>] ffs_aio_cancel+0x20/0x60 [usb_f_fs]
      [  382.230160] Modules linked in: usb_f_fs libcomposite configfs bnep btsdio bluetooth ecdh_generic brcmfmac brcmutil intel_powerclamp coretemp dwc3 kvm_intel ulpi udc_core kvm irqbypass crc32_pclmul crc32c_intel pcbc dwc3_pci aesni_intel aes_i586 crypto_simd cryptd ehci_pci ehci_hcd gpio_keys usbcore basincove_gpadc industrialio usb_common
      [  382.230407] CPU: 1 PID: 1808 Comm: screen Not tainted 4.14.0-edison+ #117
      [  382.230416] Hardware name: Intel Corporation Merrifield/BODEGA BAY, BIOS 542 2015.01.21:18.19.48
      [  382.230425] Call Trace:
      [  382.230438]  <SOFTIRQ>
      [  382.230466]  dump_stack+0x47/0x62
      [  382.230498]  __schedule_bug+0x61/0x80
      [  382.230522]  __schedule+0x43/0x7a0
      [  382.230587]  schedule+0x5f/0x70
      [  382.230625]  dwc3_gadget_ep_dequeue+0x14c/0x270 [dwc3]
      [  382.230669]  ? do_wait_intr_irq+0x70/0x70
      [  382.230724]  usb_ep_dequeue+0x19/0x90 [udc_core]
      [  382.230770]  ffs_aio_cancel+0x37/0x60 [usb_f_fs]
      [  382.230798]  kiocb_cancel+0x31/0x40
      [  382.230822]  free_ioctx_users+0x4d/0xd0
      [  382.230858]  percpu_ref_switch_to_atomic_rcu+0x10a/0x130
      [  382.230881]  ? percpu_ref_exit+0x40/0x40
      [  382.230904]  rcu_process_callbacks+0x2b3/0x440
      [  382.230965]  __do_softirq+0xf8/0x26b
      [  382.231011]  ? __softirqentry_text_start+0x8/0x8
      [  382.231033]  do_softirq_own_stack+0x22/0x30
      [  382.231042]  </SOFTIRQ>
      [  382.231071]  irq_exit+0x45/0xc0
      [  382.231089]  smp_apic_timer_interrupt+0x13c/0x150
      [  382.231118]  apic_timer_interrupt+0x35/0x3c
      [  382.231132] EIP: __copy_user_ll+0xe2/0xf0
      [  382.231142] EFLAGS: 00210293 CPU: 1
      [  382.231154] EAX: bfd4508c EBX: 00000004 ECX: 00000003 EDX: f3d8fe50
      [  382.231165] ESI: f3d8fe51 EDI: bfd4508d EBP: f3d8fe14 ESP: f3d8fe08
      [  382.231176]  DS: 007b ES: 007b FS: 00d8 GS: 0033 SS: 0068
      [  382.231265]  core_sys_select+0x25f/0x320
      [  382.231346]  ? __wake_up_common_lock+0x62/0x80
      [  382.231399]  ? tty_ldisc_deref+0x13/0x20
      [  382.231438]  ? ldsem_up_read+0x1b/0x40
      [  382.231459]  ? tty_ldisc_deref+0x13/0x20
      [  382.231479]  ? tty_write+0x29f/0x2e0
      [  382.231514]  ? n_tty_ioctl+0xe0/0xe0
      [  382.231541]  ? tty_write_unlock+0x30/0x30
      [  382.231566]  ? __vfs_write+0x22/0x110
      [  382.231604]  ? security_file_permission+0x2f/0xd0
      [  382.231635]  ? rw_verify_area+0xac/0x120
      [  382.231677]  ? vfs_write+0x103/0x180
      [  382.231711]  SyS_select+0x87/0xc0
      [  382.231739]  ? SyS_write+0x42/0x90
      [  382.231781]  do_fast_syscall_32+0xd6/0x1a0
      [  382.231836]  entry_SYSENTER_32+0x47/0x71
      [  382.231848] EIP: 0xb7f75b05
      [  382.231857] EFLAGS: 00000246 CPU: 1
      [  382.231868] EAX: ffffffda EBX: 00000400 ECX: bfd4508c EDX: bfd4510c
      [  382.231878] ESI: 00000000 EDI: 00000000 EBP: 00000000 ESP: bfd45020
      [  382.231889]  DS: 007b ES: 007b FS: 0000 GS: 0033 SS: 007b
      [  382.232281] softirq: huh, entered softirq 9 RCU c10b4d90 with preempt_count 00000100, exited with 00000000?
      Tested-by: NSam Protsenko <semen.protsenko@linaro.org>
      Signed-off-by: NVincent Pelletier <plr.vincent@gmail.com>
      Signed-off-by: NFelipe Balbi <felipe.balbi@linux.intel.com>
      d52e4d0c
  15. 13 6月, 2018 1 次提交
    • K
      treewide: devm_kzalloc() -> devm_kcalloc() · a86854d0
      Kees Cook 提交于
      The devm_kzalloc() function has a 2-factor argument form, devm_kcalloc().
      This patch replaces cases of:
      
              devm_kzalloc(handle, a * b, gfp)
      
      with:
              devm_kcalloc(handle, a * b, gfp)
      
      as well as handling cases of:
      
              devm_kzalloc(handle, a * b * c, gfp)
      
      with:
      
              devm_kzalloc(handle, array3_size(a, b, c), gfp)
      
      as it's slightly less ugly than:
      
              devm_kcalloc(handle, array_size(a, b), c, gfp)
      
      This does, however, attempt to ignore constant size factors like:
      
              devm_kzalloc(handle, 4 * 1024, gfp)
      
      though any constants defined via macros get caught up in the conversion.
      
      Any factors with a sizeof() of "unsigned char", "char", and "u8" were
      dropped, since they're redundant.
      
      Some manual whitespace fixes were needed in this patch, as Coccinelle
      really liked to write "=devm_kcalloc..." instead of "= devm_kcalloc...".
      
      The Coccinelle script used for this was:
      
      // Fix redundant parens around sizeof().
      @@
      expression HANDLE;
      type TYPE;
      expression THING, E;
      @@
      
      (
        devm_kzalloc(HANDLE,
      -	(sizeof(TYPE)) * E
      +	sizeof(TYPE) * E
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	(sizeof(THING)) * E
      +	sizeof(THING) * E
        , ...)
      )
      
      // Drop single-byte sizes and redundant parens.
      @@
      expression HANDLE;
      expression COUNT;
      typedef u8;
      typedef __u8;
      @@
      
      (
        devm_kzalloc(HANDLE,
      -	sizeof(u8) * (COUNT)
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(__u8) * (COUNT)
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(char) * (COUNT)
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(unsigned char) * (COUNT)
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(u8) * COUNT
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(__u8) * COUNT
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(char) * COUNT
      +	COUNT
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(unsigned char) * COUNT
      +	COUNT
        , ...)
      )
      
      // 2-factor product with sizeof(type/expression) and identifier or constant.
      @@
      expression HANDLE;
      type TYPE;
      expression THING;
      identifier COUNT_ID;
      constant COUNT_CONST;
      @@
      
      (
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(TYPE) * (COUNT_ID)
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(TYPE) * COUNT_ID
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(TYPE) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(TYPE) * COUNT_CONST
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(THING) * (COUNT_ID)
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(THING) * COUNT_ID
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(THING) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(THING)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(THING) * COUNT_CONST
      +	COUNT_CONST, sizeof(THING)
        , ...)
      )
      
      // 2-factor product, only identifiers.
      @@
      expression HANDLE;
      identifier SIZE, COUNT;
      @@
      
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	SIZE * COUNT
      +	COUNT, SIZE
        , ...)
      
      // 3-factor product with 1 sizeof(type) or sizeof(expression), with
      // redundant parens removed.
      @@
      expression HANDLE;
      expression THING;
      identifier STRIDE, COUNT;
      type TYPE;
      @@
      
      (
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(THING) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(THING) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(THING) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(THING) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      )
      
      // 3-factor product with 2 sizeof(variable), with redundant parens removed.
      @@
      expression HANDLE;
      expression THING1, THING2;
      identifier COUNT;
      type TYPE1, TYPE2;
      @@
      
      (
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE1) * sizeof(TYPE2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(THING1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(THING1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      )
      
      // 3-factor product, only identifiers, with redundant parens removed.
      @@
      expression HANDLE;
      identifier STRIDE, SIZE, COUNT;
      @@
      
      (
        devm_kzalloc(HANDLE,
      -	(COUNT) * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	COUNT * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	COUNT * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	(COUNT) * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	COUNT * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	(COUNT) * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	(COUNT) * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	COUNT * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      )
      
      // Any remaining multi-factor products, first at least 3-factor products,
      // when they're not all constants...
      @@
      expression HANDLE;
      expression E1, E2, E3;
      constant C1, C2, C3;
      @@
      
      (
        devm_kzalloc(HANDLE, C1 * C2 * C3, ...)
      |
        devm_kzalloc(HANDLE,
      -	(E1) * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	(E1) * (E2) * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	(E1) * (E2) * (E3)
      +	array3_size(E1, E2, E3)
        , ...)
      |
        devm_kzalloc(HANDLE,
      -	E1 * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      )
      
      // And then all remaining 2 factors products when they're not all constants,
      // keeping sizeof() as the second factor argument.
      @@
      expression HANDLE;
      expression THING, E1, E2;
      type TYPE;
      constant C1, C2, C3;
      @@
      
      (
        devm_kzalloc(HANDLE, sizeof(THING) * C2, ...)
      |
        devm_kzalloc(HANDLE, sizeof(TYPE) * C2, ...)
      |
        devm_kzalloc(HANDLE, C1 * C2 * C3, ...)
      |
        devm_kzalloc(HANDLE, C1 * C2, ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(TYPE) * (E2)
      +	E2, sizeof(TYPE)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(TYPE) * E2
      +	E2, sizeof(TYPE)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(THING) * (E2)
      +	E2, sizeof(THING)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	sizeof(THING) * E2
      +	E2, sizeof(THING)
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	(E1) * E2
      +	E1, E2
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	(E1) * (E2)
      +	E1, E2
        , ...)
      |
      - devm_kzalloc
      + devm_kcalloc
        (HANDLE,
      -	E1 * E2
      +	E1, E2
        , ...)
      )
      Signed-off-by: NKees Cook <keescook@chromium.org>
      a86854d0