1. 31 7月, 2018 2 次提交
  2. 02 7月, 2018 3 次提交
  3. 29 6月, 2018 1 次提交
    • B
      ath10k: use locked skb_dequeue for rx completions · 62652555
      Bob Copeland 提交于
      In our environment we are occasionally seeing the following stack trace
      in ath10k:
      
      Unable to handle kernel paging request at virtual address 0000a800
      pgd = c0204000
      [0000a800] *pgd=00000000
      Internal error: Oops: 17 [#1] SMP ARM
      Modules linked in: dwc3 dwc3_of_simple phy_qcom_dwc3 nf_nat xt_connmark
      CPU: 0 PID: 0 Comm: swapper/0 Not tainted 4.9.31 #2
      Hardware name: Generic DT based system
      task: c09f4f40 task.stack: c09ee000
      PC is at kfree_skb_list+0x1c/0x2c
      LR is at skb_release_data+0x6c/0x108
      pc : [<c065dcc4>]    lr : [<c065da5c>]    psr: 200f0113
      sp : c09efb68  ip : c09efb80  fp : c09efb7c
      r10: 00000000  r9 : 00000000  r8 : 043fddd1
      r7 : bf15d160  r6 : 00000000  r5 : d4ca2f00  r4 : ca7c6480
      r3 : 000000a0  r2 : 01000000  r1 : c0a57470  r0 : 0000a800
      Flags: nzCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment none
      Control: 10c5787d  Table: 56e6006a  DAC: 00000051
      Process swapper/0 (pid: 0, stack limit = 0xc09ee210)
      Stack: (0xc09efb68 to 0xc09f0000)
      fb60:                   ca7c6480 d4ca2f00 c09efb9c c09efb80 c065da5c c065dcb4
      fb80: d4ca2f00 00000000 dcbf8400 bf15d160 c09efbb4 c09efba0 c065db28 c065d9fc
      fba0: d4ca2f00 00000000 c09efbcc c09efbb8 c065db48 c065db04 d4ca2f00 00000000
      fbc0: c09efbe4 c09efbd0 c065ddd0 c065db38 d4ca2f00 00000000 c09efc64 c09efbe8
      fbe0: bf09bd00 c065dd10 00000003 7fffffff c09efc24 dcbfc9c0 01200000 00000000
      fc00: 00000000 00000000 ddb7e440 c09e9440 c09efc48 1d195000 c09efc7c c09efc28
      fc20: c027bb68 c028aa00 ddb7e4f8 bf13231c ddb7e454 0004091f bf154571 d4ca2f00
      fc40: dcbf8d00 ca7c5df6 bf154538 01200000 00000000 bf154538 c09efd1c c09efc68
      fc60: bf132458 bf09bbbc ca7c5dec 00000041 bf154538 bf154539 000007bf bf154545
      fc80: bf154538 bf154538 bf154538 bf154538 bf154538 00000000 00000000 000016c1
      fca0: 00000001 c09efcb0 01200000 00000000 00000000 00000000 00000000 00000001
      fcc0: bf154539 00000041 00000000 00000007 00000000 000000d0 ffffffff 3160ffff
      fce0: 9ad93e97 3e973160 7bf09ad9 0004091f d4ca2f00 c09efdb0 dcbf94e8 00000000
      fd00: dcbf8d00 01200000 00000000 dcbf8d00 c09efd44 c09efd20 bf132544 bf132130
      fd20: dcbf8d00 00000000 d4ca2f00 c09efdb0 00000001 d4ca2f00 c09efdec c09efd48
      fd40: bf133630 bf1324d0 ca7c5cc0 000007c0 c09efd88 c09efd70 c0764230 c02277d8
      fd60: 200f0113 ffffffff dcbf94c8 bf000000 dcbf93b0 dcbf8d00 00000040 dcbf945c
      fd80: dcbf94e8 00000000 c09efdcc 00000000 c09efd90 c09efd90 00000000 00000024
      fda0: dcbf8d00 00000000 00000005 dcbf8d00 c09efdb0 c09efdb0 00000000 00000040
      fdc0: c09efdec dcbf8d00 dcbfc9c0 c09ed140 00000040 00000000 00000100 00000040
      fde0: c09efe14 c09efdf0 bf1739b4 bf132840 dcbfc9c0 ddb82140 c09ed140 1d195000
      fe00: 00000001 00000100 c09efe64 c09efe18 c067136c bf173958 ddb7fac8 c09f0d00
      fe20: 001df678 0000012c c09efe28 c09efe28 c09efe30 c09efe30 c0a7fb28 ffffe000
      fe40: c09f008c 00000003 00000008 c0a598c0 00000100 c09f0080 c09efeb4 c09efe68
      fe60: c02096e0 c0671278 c0494584 00000080 dd5c3300 c09f0d00 00000004 001df677
      fe80: 0000000a 00200100 dd5c3300 00000000 00000000 c09eaa70 00000060 dd410800
      fea0: c09ee000 00000000 c09efecc c09efeb8 c0227944 c02094c4 00000000 00000000
      fec0: c09efef4 c09efed0 c0268b64 c02278ac de802000 c09f1b1c c09eff20 c0a16cc0
      fee0: de803000 c09ee000 c09eff1c c09efef8 c020947c c0268ae0 c02103dc 600f0013
      ff00: ffffffff c09eff54 ffffe000 c09ee000 c09eff7c c09eff20 c021448c c0209424
      ff20: 00000001 00000000 00000000 c021ddc0 00000000 00000000 c09f1024 00000001
      ff40: ffffe000 c09f1078 00000000 c09eff7c c09eff80 c09eff70 c02103ec c02103dc
      ff60: 600f0013 ffffffff 00000051 00000000 c09eff8c c09eff80 c0763cc4 c02103bc
      ff80: c09effa4 c09eff90 c025f0e4 c0763c98 c0a59040 c09f1000 c09effb4 c09effa8
      ffa0: c075efe0 c025efd4 c09efff4 c09effb8 c097dcac c075ef7c ffffffff ffffffff
      ffc0: 00000000 c097d6c4 00000000 c09c1a28 c0a59294 c09f101c c09c1a24 c09f61c0
      ffe0: 4220406a 512f04d0 00000000 c09efff8 4220807c c097d95c 00000000 00000000
      [<c065dcc4>] (kfree_skb_list) from [<c065da5c>] (skb_release_data+0x6c/0x108)
      [<c065da5c>] (skb_release_data) from [<c065db28>] (skb_release_all+0x30/0x34)
      [<c065db28>] (skb_release_all) from [<c065db48>] (__kfree_skb+0x1c/0x9c)
      [<c065db48>] (__kfree_skb) from [<c065ddd0>] (consume_skb+0xcc/0xd8)
      [<c065ddd0>] (consume_skb) from [<bf09bd00>] (ieee80211_rx_napi+0x150/0x82c [mac80211])
      [<bf09bd00>] (ieee80211_rx_napi [mac80211]) from [<bf132458>] (ath10k_htt_t2h_msg_handler+0x15e8/0x19c4 [ath10k_core])
      [<bf132458>] (ath10k_htt_t2h_msg_handler [ath10k_core]) from [<bf132544>] (ath10k_htt_t2h_msg_handler+0x16d4/0x19c4 [ath10k_core])
      [<bf132544>] (ath10k_htt_t2h_msg_handler [ath10k_core]) from [<bf133630>] (ath10k_htt_txrx_compl_task+0xdfc/0x12cc [ath10k_core])
      [<bf133630>] (ath10k_htt_txrx_compl_task [ath10k_core]) from [<bf1739b4>] (ath10k_pci_napi_poll+0x68/0xf4 [ath10k_pci])
      [<bf1739b4>] (ath10k_pci_napi_poll [ath10k_pci]) from [<c067136c>] (net_rx_action+0x100/0x33c)
      [<c067136c>] (net_rx_action) from [<c02096e0>] (__do_softirq+0x228/0x31c)
      [<c02096e0>] (__do_softirq) from [<c0227944>] (irq_exit+0xa4/0x114)
      
      The trace points to a corrupt skb inside kfree_skb(), seemingly because
      one of the shared skb queues is getting corrupted.  Most of the skb queues
      ath10k uses are local to a single call stack, but three are shared among
      multiple codepaths:
      
       - rx_msdus_q,
       - rx_in_ord_compl_q, and
       - tx_fetch_ind_q
      
      Of the three, the first two are manipulated using the unlocked skb_queue
      functions without any additional lock protecting them.  Use the locked
      variants of skb_queue_* functions to protect these manipulations.
      Signed-off-by: NBob Copeland <bobcopeland@fb.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      62652555
  4. 28 6月, 2018 9 次提交
    • E
      ath10k: replace hardcoded constant with define · e4568eac
      Erik Stromdahl 提交于
      The hardcoded values used in ath10k_mac_tx_push_pending and
      ath10k_mac_op_wake_tx_queue set an upper limit of how many packets that
      can be consumed from the TX queue.
      
      HTC_HOST_MAX_MSG_PER_TX_BUNDLE is a proper name for this constant, as
      the value effectively limits the number of messages that can be consumed
      in one step. Thus, the value is an upper limit of the number of messages
      that can be added to a TX message bundle.
      Signed-off-by: NErik Stromdahl <erik.stromdahl@gmail.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      e4568eac
    • E
      ath10k: rename HTC_HOST_MAX_MSG_PER_BUNDLE define · ab687de9
      Erik Stromdahl 提交于
      This define is only used for RX bundling so it is more descriptive if
      RX is added to the define-name.
      Signed-off-by: NErik Stromdahl <erik.stromdahl@gmail.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      ab687de9
    • E
      ath10k: fix bug in masking of TID value · d1a566be
      Erik Stromdahl 提交于
      Although the TID mask is 0xf, the modulus operation does still not
      produce identical results as the bitwise and operator. If the TID is 15, the
      modulus operation will "convert" it to 0, whereas the bitwise and will keep it
      as 15.
      
      This was found during code review.
      Signed-off-by: NErik Stromdahl <erik.stromdahl@gmail.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      d1a566be
    • B
      ath10k: protect ath10k_htt_rx_ring_free with rx_ring.lock · 168f75f1
      Ben Greear 提交于
      While debugging driver crashes related to a buggy firmware
      crashing under load, I noticed that ath10k_htt_rx_ring_free
      could be called without being under lock.  I'm not sure if this
      is the root cause of the crash or not, but it seems prudent to
      protect it.
      
      Originally tested on 4.16+ kernel with ath10k-ct 10.4 firmware
      running on 9984 NIC.
      Signed-off-by: NBen Greear <greearb@candelatech.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      168f75f1
    • N
      ath10k: transmit queued frames after processing rx packets · 3f04950f
      Niklas Cassel 提交于
      When running iperf on ath10k SDIO, TX can stop working:
      
      iperf -c 192.168.1.1 -i 1 -t 20 -w 10K
      [  3]  0.0- 1.0 sec  2.00 MBytes  16.8 Mbits/sec
      [  3]  1.0- 2.0 sec  3.12 MBytes  26.2 Mbits/sec
      [  3]  2.0- 3.0 sec  3.25 MBytes  27.3 Mbits/sec
      [  3]  3.0- 4.0 sec   655 KBytes  5.36 Mbits/sec
      [  3]  4.0- 5.0 sec  0.00 Bytes  0.00 bits/sec
      [  3]  5.0- 6.0 sec  0.00 Bytes  0.00 bits/sec
      [  3]  6.0- 7.0 sec  0.00 Bytes  0.00 bits/sec
      [  3]  7.0- 8.0 sec  0.00 Bytes  0.00 bits/sec
      [  3]  8.0- 9.0 sec  0.00 Bytes  0.00 bits/sec
      [  3]  9.0-10.0 sec  0.00 Bytes  0.00 bits/sec
      [  3]  0.0-10.3 sec  9.01 MBytes  7.32 Mbits/sec
      
      There are frames in the ieee80211_txq and there are frames that have
      been removed from from this queue, but haven't yet been sent on the wire
      (num_pending_tx).
      
      When num_pending_tx reaches max_num_pending_tx, we will stop the queues
      by calling ieee80211_stop_queues().
      
      As frames that have previously been sent for transmission
      (num_pending_tx) are completed, we will decrease num_pending_tx and wake
      the queues by calling ieee80211_wake_queue(). ieee80211_wake_queue()
      does not call wake_tx_queue, so we might still have frames in the
      queue at this point.
      
      While the queues were stopped, the socket buffer might have filled up,
      and in order for user space to write more, we need to free the frames
      in the queue, since they are accounted to the socket. In order to free
      them, we first need to transmit them.
      
      This problem cannot be reproduced on low-latency devices, e.g. pci,
      since they call ath10k_mac_tx_push_pending() from
      ath10k_htt_txrx_compl_task(). ath10k_htt_txrx_compl_task() is not called
      on high-latency devices.
      Fix the problem by calling ath10k_mac_tx_push_pending(), after
      processing rx packets, just like for low-latency devices, also in the
      SDIO case. Since we are calling ath10k_mac_tx_push_pending() directly,
      we also need to export it.
      Signed-off-by: NNiklas Cassel <niklas.cassel@linaro.org>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      3f04950f
    • Z
      ath10k: fix tlv 5ghz channel missing issue · 98dc04ba
      Zhi Chen 提交于
      The 5ghz channel parameters of TLV target wasn't passed to host, it caused
      host can only use lower channels from 36 to 64.
      Signed-off-by: NZhi Chen <zhichen@codeaurora.org>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      98dc04ba
    • Z
      ath10k: fix scan crash due to incorrect length calculation · c8291988
      Zhi Chen 提交于
      Length of WMI scan message was not calculated correctly. The allocated
      buffer was smaller than what we expected. So WMI message corrupted
      skb_info, which is at the end of skb->data. This fix takes TLV header
      into account even if the element is zero-length.
      
      Crash log:
        [49.629986] Unhandled kernel unaligned access[#1]:
        [49.634932] CPU: 0 PID: 1176 Comm: logd Not tainted 4.4.60 #180
        [49.641040] task: 83051460 ti: 8329c000 task.ti: 8329c000
        [49.646608] $ 0   : 00000000 00000001 80984a80 00000000
        [49.652038] $ 4   : 45259e89 8046d484 8046df30 8024ba70
        [49.657468] $ 8   : 00000000 804cc4c0 00000001 20306320
        [49.662898] $12   : 33322037 000110f2 00000000 31203930
        [49.668327] $16   : 82792b40 80984a80 00000001 804207fc
        [49.673757] $20   : 00000000 0000012c 00000040 80470000
        [49.679186] $24   : 00000000 8024af7c
        [49.684617] $28   : 8329c000 8329db88 00000001 802c58d0
        [49.690046] Hi    : 00000000
        [49.693022] Lo    : 453c0000
        [49.696013] epc   : 800efae4 put_page+0x0/0x58
        [49.700615] ra    : 802c58d0 skb_release_data+0x148/0x1d4
        [49.706184] Status: 1000fc03 KERNEL EXL IE
        [49.710531] Cause : 00800010 (ExcCode 04)
        [49.714669] BadVA : 45259e89
        [49.717644] PrId  : 00019374 (MIPS 24Kc)
      Signed-off-by: NZhi Chen <zhichen@codeaurora.org>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      c8291988
    • R
      ath10k: update the phymode along with bandwidth change request · 9191fc2a
      Ryan Hsu 提交于
      In the case of Station connects to AP with narrower bandwidth at beginning.
      And later the AP changes the bandwidth to winder bandwidth, the AP will
      beacon with wider bandwidth IE, eg VHT20->VHT40->VHT80 or VHT40->VHT80.
      
      Since the supported BANDWIDTH will be limited by the PHYMODE, so while
      Station receives the bandwidth change request, it will also need to
      reconfigure the PHYMODE setting to firmware instead of just configuring
      the BANDWIDTH info, otherwise it'll trigger a firmware crash with
      non-support bandwidth.
      
      The issue was observed in WLAN.RM.4.4.1-00051-QCARMSWP-1, QCA6174 with
      below scenario:
      
      AP xxx changed bandwidth, new config is 5200 MHz, width 2 (5190/0 MHz)
      disconnect from AP xxx for new auth to yyy
      RX ReassocResp from xxx (capab=0x1111 status=0 aid=102)
      associated
      
      ....
      
      AP xxx changed bandwidth, new config is 5200 MHz, width 2 (5190/0 MHz)
      AP xxx changed bandwidth, new config is 5200 MHz, width 3 (5210/0 MHz)
      
      ....
      
      firmware register dump:
      [00]: 0x05030000 0x000015B3 0x00987291 0x00955B31
      [04]: 0x00987291 0x00060730 0x00000004 0x00000001
      [08]: 0x004089F0 0x00955A00 0x000A0B00 0x00400000
      [12]: 0x00000009 0x00000000 0x00952CD0 0x00952CE6
      [16]: 0x00952CC4 0x0098E25F 0x00000000 0x0091080D
      [20]: 0x40987291 0x0040E7A8 0x00000000 0x0041EE3C
      [24]: 0x809ABF05 0x0040E808 0x00000000 0xC0987291
      [28]: 0x809A650C 0x0040E948 0x0041FE40 0x004345C4
      [32]: 0x809A5C63 0x0040E988 0x0040E9AC 0x0042D1A8
      [36]: 0x8091D252 0x0040E9A8 0x00000002 0x00000001
      [40]: 0x809FDA9D 0x0040EA58 0x0043D554 0x0042D554
      [44]: 0x809F8B22 0x0040EA78 0x0043D554 0x00000001
      [48]: 0x80911210 0x0040EAC8 0x00000010 0x004041D0
      [52]: 0x80911154 0x0040EB28 0x00400000 0x00000000
      [56]: 0x8091122D 0x0040EB48 0x00000000 0x00400600
      Reported-by: NRouven Czerwinski <rouven@czerwinskis.de>
      Tested-by: NTimur Kristóf <timur.kristof@gmail.com>
      Signed-off-by: NRyan Hsu <ryanhsu@codeaurora.org>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      9191fc2a
    • O
      wireless-drivers: use BIT_ULL for NL80211_STA_INFO_ attribute types · 22d0d2fa
      Omer Efrat 提交于
      The BIT macro uses unsigned long which some architectures handle as 32 bit
      and therefore might cause macro's shift to overflow when used on a value
      equals or larger than 32 (NL80211_STA_INFO_RX_DURATION and afterwards).
      
      Since 'filled' member in station_info changed to u64, BIT_ULL macro
      should be used with all NL80211_STA_INFO_* attribute types instead of BIT
      to prevent future possible bugs when one will use BIT macro for higher
      attributes by mistake.
      
      This commit cleans up all usages of BIT macro with the above field
      in wireless-drivers by changing it to BIT_ULL instead. In addition, there are
      some places which don't use BIT nor BIT_ULL macros so align those as well.
      Signed-off-by: NOmer Efrat <omer.efrat@tandemg.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      22d0d2fa
  5. 14 6月, 2018 14 次提交
  6. 13 6月, 2018 3 次提交
    • C
      ath10k: fix memory leak of tpc_stats · 260e629b
      Colin Ian King 提交于
      Currently tpc_stats is allocated and is leaked on the return
      path if num_tx_chain is greater than WMI_TPC_TX_N_CHAIN. Avoid
      this leak by performing the check on num_tx_chain before the
      allocation of tpc_stats.
      
      Detected by CoverityScan, CID#1469422 ("Resource Leak")
      Fixes: 4b190675 ("ath10k: fix kernel panic while reading tpc_stats")
      Signed-off-by: NColin Ian King <colin.king@canonical.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      260e629b
    • G
      ath10k: htt_tx: mark expected switch fall-throughs · f1d270ae
      Gustavo A. R. Silva 提交于
      In preparation to enabling -Wimplicit-fallthrough, mark switch cases
      where we are expecting to fall through.
      
      Notice that in this particular case, I replaced "pass through" with
      a proper "fall through" comment, which is what GCC is expecting
      to find.
      Signed-off-by: NGustavo A. R. Silva <gustavo@embeddedor.com>
      Signed-off-by: NKalle Valo <kvalo@codeaurora.org>
      f1d270ae
    • K
      treewide: kzalloc() -> kcalloc() · 6396bb22
      Kees Cook 提交于
      The kzalloc() function has a 2-factor argument form, kcalloc(). This
      patch replaces cases of:
      
              kzalloc(a * b, gfp)
      
      with:
              kcalloc(a * b, gfp)
      
      as well as handling cases of:
      
              kzalloc(a * b * c, gfp)
      
      with:
      
              kzalloc(array3_size(a, b, c), gfp)
      
      as it's slightly less ugly than:
      
              kzalloc_array(array_size(a, b), c, gfp)
      
      This does, however, attempt to ignore constant size factors like:
      
              kzalloc(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.
      
      The Coccinelle script used for this was:
      
      // Fix redundant parens around sizeof().
      @@
      type TYPE;
      expression THING, E;
      @@
      
      (
        kzalloc(
      -	(sizeof(TYPE)) * E
      +	sizeof(TYPE) * E
        , ...)
      |
        kzalloc(
      -	(sizeof(THING)) * E
      +	sizeof(THING) * E
        , ...)
      )
      
      // Drop single-byte sizes and redundant parens.
      @@
      expression COUNT;
      typedef u8;
      typedef __u8;
      @@
      
      (
        kzalloc(
      -	sizeof(u8) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(__u8) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(char) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(unsigned char) * (COUNT)
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(u8) * COUNT
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(__u8) * COUNT
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(char) * COUNT
      +	COUNT
        , ...)
      |
        kzalloc(
      -	sizeof(unsigned char) * COUNT
      +	COUNT
        , ...)
      )
      
      // 2-factor product with sizeof(type/expression) and identifier or constant.
      @@
      type TYPE;
      expression THING;
      identifier COUNT_ID;
      constant COUNT_CONST;
      @@
      
      (
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * (COUNT_ID)
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * COUNT_ID
      +	COUNT_ID, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * COUNT_CONST
      +	COUNT_CONST, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * (COUNT_ID)
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * COUNT_ID
      +	COUNT_ID, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * (COUNT_CONST)
      +	COUNT_CONST, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * COUNT_CONST
      +	COUNT_CONST, sizeof(THING)
        , ...)
      )
      
      // 2-factor product, only identifiers.
      @@
      identifier SIZE, COUNT;
      @@
      
      - kzalloc
      + kcalloc
        (
      -	SIZE * COUNT
      +	COUNT, SIZE
        , ...)
      
      // 3-factor product with 1 sizeof(type) or sizeof(expression), with
      // redundant parens removed.
      @@
      expression THING;
      identifier STRIDE, COUNT;
      type TYPE;
      @@
      
      (
        kzalloc(
      -	sizeof(TYPE) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(TYPE))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * (COUNT) * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * (COUNT) * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * COUNT * (STRIDE)
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      |
        kzalloc(
      -	sizeof(THING) * COUNT * STRIDE
      +	array3_size(COUNT, STRIDE, sizeof(THING))
        , ...)
      )
      
      // 3-factor product with 2 sizeof(variable), with redundant parens removed.
      @@
      expression THING1, THING2;
      identifier COUNT;
      type TYPE1, TYPE2;
      @@
      
      (
        kzalloc(
      -	sizeof(TYPE1) * sizeof(TYPE2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
        , ...)
      |
        kzalloc(
      -	sizeof(THING1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        kzalloc(
      -	sizeof(THING1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(THING1), sizeof(THING2))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * COUNT
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      |
        kzalloc(
      -	sizeof(TYPE1) * sizeof(THING2) * (COUNT)
      +	array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
        , ...)
      )
      
      // 3-factor product, only identifiers, with redundant parens removed.
      @@
      identifier STRIDE, SIZE, COUNT;
      @@
      
      (
        kzalloc(
      -	(COUNT) * STRIDE * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	(COUNT) * (STRIDE) * SIZE
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	COUNT * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	(COUNT) * STRIDE * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	(COUNT) * (STRIDE) * (SIZE)
      +	array3_size(COUNT, STRIDE, SIZE)
        , ...)
      |
        kzalloc(
      -	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 E1, E2, E3;
      constant C1, C2, C3;
      @@
      
      (
        kzalloc(C1 * C2 * C3, ...)
      |
        kzalloc(
      -	(E1) * E2 * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kzalloc(
      -	(E1) * (E2) * E3
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kzalloc(
      -	(E1) * (E2) * (E3)
      +	array3_size(E1, E2, E3)
        , ...)
      |
        kzalloc(
      -	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 THING, E1, E2;
      type TYPE;
      constant C1, C2, C3;
      @@
      
      (
        kzalloc(sizeof(THING) * C2, ...)
      |
        kzalloc(sizeof(TYPE) * C2, ...)
      |
        kzalloc(C1 * C2 * C3, ...)
      |
        kzalloc(C1 * C2, ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * (E2)
      +	E2, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(TYPE) * E2
      +	E2, sizeof(TYPE)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * (E2)
      +	E2, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	sizeof(THING) * E2
      +	E2, sizeof(THING)
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	(E1) * E2
      +	E1, E2
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	(E1) * (E2)
      +	E1, E2
        , ...)
      |
      - kzalloc
      + kcalloc
        (
      -	E1 * E2
      +	E1, E2
        , ...)
      )
      Signed-off-by: NKees Cook <keescook@chromium.org>
      6396bb22
  7. 25 5月, 2018 5 次提交
  8. 14 5月, 2018 2 次提交
  9. 12 5月, 2018 1 次提交