Netdev List
 help / color / mirror / Atom feed
* Re: [v3] Bluetooth: btrsi: rework dependencies
From: Kalle Valo @ 2018-03-27  7:12 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: Arnd Bergmann, Marcel Holtmann, Johan Hedberg, Johan Hovold,
	Amitkumar Karwar, Siva Rebbagondla, linux-bluetooth, linux-kernel,
	linux-wireless, netdev
In-Reply-To: <20180315211904.2256817-1-arnd@arndb.de>

Arnd Bergmann <arnd@arndb.de> wrote:

> The linkage between the bluetooth driver and the wireless
> driver is not defined properly, leading to build problems
> such as:
> 
> warning: (BT_HCIRSI) selects RSI_COEX which has unmet direct dependencies (NETDEVICES && WLAN && WLAN_VENDOR_RSI && BT_HCIRSI && RSI_91X)
> drivers/net/wireless/rsi/rsi_91x_main.o: In function `rsi_read_pkt':
> (.text+0x205): undefined reference to `rsi_bt_ops'
> 
> As the dependency is actually the reverse (RSI_91X uses
> the BT_RSI driver, not the other way round), this changes
> the dependency to match, and enables the bluetooth driver
> from the RSI_COEX symbol.
> 
> Fixes: 38aa4da50483 ("Bluetooth: btrsi: add new rsi bluetooth driver")
> Acked-by; Marcel Holtmann <marcel@holtmann.org>
> Signed-off-by: Arnd Bergmann <arnd@arndb.de>

Patch applied to wireless-drivers-next.git, thanks.

255dd5b79d54 Bluetooth: btrsi: rework dependencies

-- 
https://patchwork.kernel.org/patch/10285795/

https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches

^ permalink raw reply

* Re: [RFC PATCH 00/24] Introducing AF_XDP support
From: Björn Töpel @ 2018-03-27  6:30 UTC (permalink / raw)
  To: Alexander Duyck
  Cc: Tushar Dave, Jesper Dangaard Brouer, William Tu, Karlsson, Magnus,
	Alexander Duyck, John Fastabend, Alexei Starovoitov,
	Willem de Bruijn, Daniel Borkmann,
	Linux Kernel Network Developers, Björn Töpel,
	michael.lundkvist, Brandeburg, Jesse, Anjali Singhai Jain,
	Shaw, Jeffrey B, Yigit, Ferruh, Zhang, Qi Z
In-Reply-To: <CAKgT0Ufya10bXa4BXFbR2GtwZM6i7x8LPYoodFPZ82=S+t7x2w@mail.gmail.com>

2018-03-27 1:03 GMT+02:00 Alexander Duyck <alexander.duyck@gmail.com>:
> On Mon, Mar 26, 2018 at 3:54 PM, Tushar Dave <tushar.n.dave@oracle.com> wrote:
[...]
>>
>> Whats the implication here. Should IOMMU be disabled?
>> I'm asking because I do see a huge difference while running pktgen test for
>> my performance benchmarks, with and without intel_iommu.
>>
>>
>> -Tushar
>
> For the Intel parts the IOMMU can be expensive primarily for Tx, since
> it should have minimal impact if the Rx pages are pinned/recycled. I
> am assuming the same is true here for AF_XDP, Bjorn can correct me if
> I am wrong.
>

For the non-zc case the DMA mapping is done in the Tx fast path, so
there, as Alex says, you'll definitely see a performance penalty. For
Rx the page-recycle mechanism (Intel drivers) usally avoids doing any
DMA mappings in the fast-path.

As for AF_XDP zerocopy mode, we do the DMA mapping up front (avoiding
the single-use mappings), to avoid that performance hit. Keep in mind,
though, that the IOTLB is still in play, and usually performs worse
under pressure, than the non-IOMMU case.

> Basically the IOMMU can make creating/destroying a DMA mapping really
> expensive. The easiest way to work around it in the case of the Intel
> IOMMU is to boot with "iommu=pt" which will create an identity mapping
> for the host. The downside is though that you then have the entire
> system accessible to the device unless a new mapping is created for it
> by assigning it to a new IOMMU domain.
>



> Thanks.
>
> - Alex

^ permalink raw reply

* Re: [RFC PATCH 00/24] Introducing AF_XDP support
From: Björn Töpel @ 2018-03-27  6:09 UTC (permalink / raw)
  To: William Tu
  Cc: Jesper Dangaard Brouer, Karlsson, Magnus, Alexander Duyck,
	Alexander Duyck, John Fastabend, Alexei Starovoitov,
	Willem de Bruijn, Daniel Borkmann,
	Linux Kernel Network Developers, Björn Töpel,
	michael.lundkvist, Brandeburg, Jesse, Singhai, Anjali,
	Shaw, Jeffrey B, Yigit, Ferruh, Zhang, Qi Z
In-Reply-To: <CALDO+SZcxks4xF-YZEJe3dL2sp9wR7kWYCnAnokhr-y3f9-AeQ@mail.gmail.com>

 2018-03-26 23:58 GMT+02:00 William Tu <u9012063@gmail.com>:
> Hi Jesper,
>
> Thanks a lot for your prompt reply.
>
>>> Hi,
>>> I also did an evaluation of AF_XDP, however the performance isn't as
>>> good as above.
>>> I'd like to share the result and see if there are some tuning suggestions.
>>>
>>> System:
>>> 16 core, Intel(R) Xeon(R) CPU E5-2440 v2 @ 1.90GHz
>>> Intel 10G X540-AT2 ---> so I can only run XDP_SKB mode
>>
>> Hmmm, why is X540-AT2 not able to use XDP natively?
>
> Because I'm only able to use ixgbe driver for this NIC,
> and AF_XDP patch only has i40e support?
>

It's only i40e that support zero copy. As for native XDP support, only
XDP_REDIRECT support is required and ixgbe does support XDP_REDIRECT
-- unfortunately, ixgbe still needs a needs a patch to work properly,
which is in net-next: ed93a3987128 ("ixgbe: tweak page counting for
XDP_REDIRECT").

>>
>>> AF_XDP performance:
>>> Benchmark   XDP_SKB
>>> rxdrop      1.27 Mpps
>>> txpush      0.99 Mpps
>>> l2fwd        0.85 Mpps
>>
>> Definitely too low...
>>
> I did another run, the rxdrop seems better.
> Benchmark   XDP_SKB
> rxdrop      2.3 Mpps
> txpush     1.05 Mpps
> l2fwd        0.90 Mpps
>
>> What is the performance if you drop packets via iptables?
>>
>> Command:
>>  $ iptables -t raw -I PREROUTING -p udp --dport 9 --j DROP
>>
> I did
> # iptables -t raw -I PREROUTING -p udp -i enp10s0f0 -j DROP
> # iptables -nvL -t raw; sleep 10; iptables -nvL -t raw
>
> and I got 2.9Mpps.
>
>>> NIC configuration:
>>> the command
>>> "ethtool -N p3p2 flow-type udp4 src-port 4242 dst-port 4242 action 16"
>>> doesn't work on my ixgbe driver, so I use ntuple:
>>>
>>> ethtool -K enp10s0f0 ntuple on
>>> ethtool -U enp10s0f0 flow-type udp4 src-ip 10.1.1.100 action 1
>>> then
>>> echo 1 > /proc/sys/net/core/bpf_jit_enable
>>> ./xdpsock -i enp10s0f0 -r -S --queue=1
>>>
>>> I also take a look at perf result:
>>> For rxdrop:
>>> 86.56%  xdpsock xdpsock           [.] main
>>>   9.22%  xdpsock  [kernel.vmlinux]  [k] nmi
>>>   4.23%  xdpsock  xdpsock         [.] xq_enq
>>
>> It looks very strange that you see non-maskable interrupt's (NMI) being
>> this high...
>>
> yes, that's weird. Looking at the perf annotate of nmi,
> it shows 100% spent on nop instruction.
>
>>
>>> For l2fwd:
>>>  20.81%  xdpsock xdpsock             [.] main
>>>  10.64%  xdpsock [kernel.vmlinux]    [k] clflush_cache_range
>>
>> Oh, clflush_cache_range is being called!
>
> I though clflush_cache_range is high because we have many smp_rmb, smp_wmb
> in the xdpsock queue/ring management userspace code.
> (perf shows that 75% of this 10.64% spent on mfence instruction.)
>
>> Do your system use an IOMMU ?
>>
> Yes.
> With CONFIG_INTEL_IOMMU=y
> and I saw some related functions called (ex: intel_alloc_iova).
>
>>>   8.46%  xdpsock  [kernel.vmlinux]    [k] xsk_sendmsg
>>>   6.72%  xdpsock  [kernel.vmlinux]    [k] skb_set_owner_w
>>>   5.89%  xdpsock  [kernel.vmlinux]    [k] __domain_mapping
>>>   5.74%  xdpsock  [kernel.vmlinux]    [k] alloc_skb_with_frags
>>>   4.62%  xdpsock  [kernel.vmlinux]    [k] netif_skb_features
>>>   3.96%  xdpsock  [kernel.vmlinux]    [k] ___slab_alloc
>>>   3.18%  xdpsock  [kernel.vmlinux]    [k] nmi
>>
>> Again high count for NMI ?!?
>>
>> Maybe you just forgot to tell perf that you want it to decode the
>> bpf_prog correctly?
>>
>> https://prototype-kernel.readthedocs.io/en/latest/bpf/troubleshooting.html#perf-tool-symbols
>>
>> Enable via:
>>  $ sysctl net/core/bpf_jit_kallsyms=1
>>
>> And use perf report (while BPF is STILL LOADED):
>>
>>  $ perf report --kallsyms=/proc/kallsyms
>>
>> E.g. for emailing this you can use this command:
>>
>>  $ perf report --sort cpu,comm,dso,symbol --kallsyms=/proc/kallsyms --no-children --stdio -g none | head -n 40
>>
>
> Thanks, I followed the steps, the result of l2fwd
> # Total Lost Samples: 119
> #
> # Samples: 2K of event 'cycles:ppp'
> # Event count (approx.): 25675705627
> #
> # Overhead  CPU  Command  Shared Object       Symbol
> # ........  ...  .......  ..................  ..................................
> #
>     10.48%  013  xdpsock  xdpsock             [.] main
>      9.77%  013  xdpsock  [kernel.vmlinux]    [k] clflush_cache_range
>      8.45%  013  xdpsock  [kernel.vmlinux]    [k] nmi
>      8.07%  013  xdpsock  [kernel.vmlinux]    [k] xsk_sendmsg
>      7.81%  013  xdpsock  [kernel.vmlinux]    [k] __domain_mapping
>      4.95%  013  xdpsock  [kernel.vmlinux]    [k] ixgbe_xmit_frame_ring
>      4.66%  013  xdpsock  [kernel.vmlinux]    [k] skb_store_bits
>      4.39%  013  xdpsock  [kernel.vmlinux]    [k] syscall_return_via_sysret
>      3.93%  013  xdpsock  [kernel.vmlinux]    [k] pfn_to_dma_pte
>      2.62%  013  xdpsock  [kernel.vmlinux]    [k] __intel_map_single
>      2.53%  013  xdpsock  [kernel.vmlinux]    [k] __alloc_skb
>      2.36%  013  xdpsock  [kernel.vmlinux]    [k] iommu_no_mapping
>      2.21%  013  xdpsock  [kernel.vmlinux]    [k] alloc_skb_with_frags
>      2.07%  013  xdpsock  [kernel.vmlinux]    [k] skb_set_owner_w
>      1.98%  013  xdpsock  [kernel.vmlinux]    [k] __kmalloc_node_track_caller
>      1.94%  013  xdpsock  [kernel.vmlinux]    [k] ksize
>      1.84%  013  xdpsock  [kernel.vmlinux]    [k] validate_xmit_skb_list
>      1.62%  013  xdpsock  [kernel.vmlinux]    [k] kmem_cache_alloc_node
>      1.48%  013  xdpsock  [kernel.vmlinux]    [k] __kmalloc_reserve.isra.37
>      1.21%  013  xdpsock  xdpsock             [.] xq_enq
>      1.08%  013  xdpsock  [kernel.vmlinux]    [k] intel_alloc_iova
>
> And l2fwd under "perf stat" looks OK to me. There is little context
> switches, cpu
> is fully utilized, 1.17 insn per cycle seems ok.
>
> Performance counter stats for 'CPU(s) 6':
>       10000.787420      cpu-clock (msec)          #    1.000 CPUs
> utilized
>                 24      context-switches          #    0.002 K/sec
>                  0      cpu-migrations            #    0.000 K/sec
>                  0      page-faults               #    0.000 K/sec
>     22,361,333,647      cycles                    #    2.236 GHz
>     13,458,442,838      stalled-cycles-frontend   #   60.19% frontend
> cycles idle
>     26,251,003,067      instructions              #    1.17  insn per
> cycle
>                                                   #    0.51  stalled
> cycles per insn
>      4,938,921,868      branches                  #  493.853 M/sec
>          7,591,739      branch-misses             #    0.15% of all
> branches
>       10.000835769 seconds time elapsed
>
> Will continue investigate...
> Thanks
> William

^ permalink raw reply

* Re: [PATCH v3 iproute2-next 1/8] rdma: include rdma-core <rdma/rdma_cma.h>
From: Leon Romanovsky @ 2018-03-27  5:46 UTC (permalink / raw)
  To: Steve Wise; +Cc: dsahern, stephen, netdev, linux-rdma
In-Reply-To: <326e72eaa0a6ed3d42aa857f13c80232a2550c77.1522097991.git.swise@opengridcomputing.com>

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

On Mon, Mar 26, 2018 at 01:57:32PM -0700, Steve Wise wrote:
> This avoids requiring rdma-core be installed on systems.
>
> Signed-off-by: Steve Wise <swise@opengridcomputing.com>
> ---
>  rdma/include/rdma/rdma_cma.h | 728 +++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 728 insertions(+)
>  create mode 100644 rdma/include/rdma/rdma_cma.h
>

Steve,

Sorry for not spotting it before, you actually need only 3 enums for the
cm_id_ps_to_str() from rdma_cma.h.

Simply copy/paste that enum into cm_id_ps_to_str().

Thanks

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [PATCH net-next] qed*: Utilize FW 8.33.11.0
From: kbuild test robot @ 2018-03-27  4:48 UTC (permalink / raw)
  To: Michal Kalderon
  Cc: kbuild-all, michal.kalderon, davem, netdev, linux-rdma,
	linux-scsi, Tomer Tayar, Manish Rangankar, Ariel Elior
In-Reply-To: <1522083732-26560-1-git-send-email-Michal.Kalderon@cavium.com>

Hi Michal,

I love your patch! Perhaps something to improve:

[auto build test WARNING on net-next/master]

url:    https://github.com/0day-ci/linux/commits/Michal-Kalderon/qed-Utilize-FW-8-33-11-0/20180327-070630
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> drivers/net/ethernet/qlogic/qed/qed_cxt.c:972:41: sparse: incorrect type in assignment (different base types) @@    expected unsigned long long [unsigned] [usertype] next @@    got g long [unsigned] [usertype] next @@
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:972:41:    expected unsigned long long [unsigned] [usertype] next
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:972:41:    got restricted __be64 [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:979:33: sparse: incorrect type in assignment (different base types) @@    expected unsigned long long [unsigned] [usertype] next @@    got g long [unsigned] [usertype] next @@
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:979:33:    expected unsigned long long [unsigned] [usertype] next
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:979:33:    got restricted __be64 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_cxt.c:1534:6: sparse: symbol 'qed_cm_init_pf' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_cxt.c:2331:25: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:2331:25:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:2331:25:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:2331:25: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:2331:25:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_cxt.c:2331:25:    right side has type unsigned long long
--
>> drivers/net/ethernet/qlogic/qed/qed_dev.c:233:4: sparse: symbol 'qed_init_qm_get_num_tcs' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_dev.c:238:5: sparse: symbol 'qed_init_qm_get_num_vfs' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_dev.c:246:5: sparse: symbol 'qed_init_qm_get_num_pf_rls' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_dev.c:264:5: sparse: symbol 'qed_init_qm_get_num_vports' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_dev.c:276:5: sparse: symbol 'qed_init_qm_get_num_pqs' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_dev.c:510:5: sparse: symbol 'qed_get_cm_pq_idx_rl' was not declared. Should it be static?
--
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:503:17:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1228:6: sparse: symbol 'qed_set_gft_event_id_cm_hdr' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1396:23: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1396:23: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1396:23: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1396:23: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1396:23: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c:1396:23: sparse: cast to restricted __be32
--
>> drivers/net/ethernet/qlogic/qed/qed_init_ops.c:238:33: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:239:20: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:252:16: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:309:20: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:325:24: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:329:24: sparse: cast to restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_init_ops.c:341:29: sparse: cast to restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:342:29: sparse: cast to restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:374:16: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:400:16: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:409:17: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:409:17: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:465:22: sparse: cast to restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:470:24: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:478:20: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:479:23: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:507:28: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:530:25: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:530:25: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:530:25: sparse: cast to restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_init_ops.c:530:25: sparse: cast to restricted __le32
--
>> drivers/net/ethernet/qlogic/qed/qed_int.c:1039:33: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] sb_id_and_flags @@    got  [usertype] sb_id_and_flags @@
   drivers/net/ethernet/qlogic/qed/qed_int.c:1039:33:    expected restricted __le32 [usertype] sb_id_and_flags
   drivers/net/ethernet/qlogic/qed/qed_int.c:1039:33:    got unsigned int
>> drivers/net/ethernet/qlogic/qed/qed_int.c:1046:9: sparse: cast from restricted __le32
   include/linux/qed/qed_if.h:969:33: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] sb_id_and_flags @@    got  [usertype] sb_id_and_flags @@
   include/linux/qed/qed_if.h:969:33:    expected restricted __le32 [usertype] sb_id_and_flags
   include/linux/qed/qed_if.h:969:33:    got unsigned int
   include/linux/qed/qed_if.h:976:9: sparse: cast from restricted __le32
   include/linux/qed/qed_if.h:969:33: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] sb_id_and_flags @@    got  [usertype] sb_id_and_flags @@
   include/linux/qed/qed_if.h:969:33:    expected restricted __le32 [usertype] sb_id_and_flags
   include/linux/qed/qed_if.h:969:33:    got unsigned int
   include/linux/qed/qed_if.h:976:9: sparse: cast from restricted __le32
   include/linux/qed/qed_if.h:969:33: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] sb_id_and_flags @@    got  [usertype] sb_id_and_flags @@
   include/linux/qed/qed_if.h:969:33:    expected restricted __le32 [usertype] sb_id_and_flags
   include/linux/qed/qed_if.h:969:33:    got unsigned int
   include/linux/qed/qed_if.h:976:9: sparse: cast from restricted __le32
   include/linux/qed/qed_if.h:969:33: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] sb_id_and_flags @@    got  [usertype] sb_id_and_flags @@
   include/linux/qed/qed_if.h:969:33:    expected restricted __le32 [usertype] sb_id_and_flags
   include/linux/qed/qed_if.h:969:33:    got unsigned int
   include/linux/qed/qed_if.h:976:9: sparse: cast from restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_int.c:1266:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1266:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1266:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1266:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1266:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1266:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1267:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1267:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1267:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1267:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1267:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1267:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1268:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1268:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1268:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1268:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1268:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1268:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1269:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1269:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1269:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1269:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1269:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1269:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1270:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1270:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1270:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1270:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1270:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1270:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1289:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1289:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1289:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1289:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1289:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1289:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1297:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1297:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1297:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1297:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1297:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1297:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1299:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1299:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1299:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1299:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1299:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1299:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1300:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1300:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1300:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1300:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1300:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1300:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1319:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1319:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1319:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1319:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1319:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1319:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1321:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1321:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1321:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1321:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1321:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1321:17:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:1323:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1323:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1323:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:1323:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:1323:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:1323:17:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:2220:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:2220:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:2220:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:2220:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:2220:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:2220:17:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_int.c:2222:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_int.c:2222:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:2222:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_int.c:2222:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_int.c:2222:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_int.c:2222:17:    right side has type unsigned long long
--
>> drivers/net/ethernet/qlogic/qed/qed_mcp.c:2691:1: sparse: symbol '__qed_mcp_resc_lock' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_mcp.c:464:9: sparse: context imbalance in '_qed_mcp_cmd_and_union' - unexpected unlock
--
>> drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:163:32: sparse: mixing different enum types
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:163:32:     int enum tunnel_clss  versus
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:163:32:     int enum qed_tunn_clss
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:165:33: sparse: mixing different enum types
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:165:33:     int enum tunnel_clss  versus
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:165:33:     int enum qed_tunn_clss
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:167:33: sparse: mixing different enum types
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:167:33:     int enum tunnel_clss  versus
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:167:33:     int enum qed_tunn_clss
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:169:36: sparse: mixing different enum types
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:169:36:     int enum tunnel_clss  versus
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:169:36:     int enum qed_tunn_clss
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:171:36: sparse: mixing different enum types
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:171:36:     int enum tunnel_clss  versus
   drivers/net/ethernet/qlogic/qed/qed_sp_commands.c:171:36:     int enum qed_tunn_clss
--
>> drivers/net/ethernet/qlogic/qed/qed_spq.c:310:55: sparse: incorrect type in argument 3 (different base types) @@    expected unsigned short [unsigned] [usertype] echo @@    got  short [unsigned] [usertype] echo @@
   drivers/net/ethernet/qlogic/qed/qed_spq.c:310:55:    expected unsigned short [unsigned] [usertype] echo
   drivers/net/ethernet/qlogic/qed/qed_spq.c:310:55:    got restricted __le16 [usertype] echo
--
>> drivers/net/ethernet/qlogic/qed/qed_l2.c:414:50: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tpa_max_size @@    got unsignedrestricted __le16 [usertype] tpa_max_size @@
   drivers/net/ethernet/qlogic/qed/qed_l2.c:414:50:    expected restricted __le16 [usertype] tpa_max_size
   drivers/net/ethernet/qlogic/qed/qed_l2.c:414:50:    got unsigned short [unsigned] [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_l2.c:415:58: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tpa_min_size_to_cont @@    got e] tpa_min_size_to_cont @@
   drivers/net/ethernet/qlogic/qed/qed_l2.c:415:58:    expected restricted __le16 [usertype] tpa_min_size_to_cont
   drivers/net/ethernet/qlogic/qed/qed_l2.c:415:58:    got int
>> drivers/net/ethernet/qlogic/qed/qed_l2.c:416:59: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tpa_min_size_to_start @@    got e] tpa_min_size_to_start @@
   drivers/net/ethernet/qlogic/qed/qed_l2.c:416:59:    expected restricted __le16 [usertype] tpa_min_size_to_start
   drivers/net/ethernet/qlogic/qed/qed_l2.c:416:59:    got int
   drivers/net/ethernet/qlogic/qed/qed_l2.c:647:29: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tpa_max_size @@    got unsignedrestricted __le16 [usertype] tpa_max_size @@
   drivers/net/ethernet/qlogic/qed/qed_l2.c:647:29:    expected restricted __le16 [usertype] tpa_max_size
   drivers/net/ethernet/qlogic/qed/qed_l2.c:647:29:    got unsigned short [unsigned] [usertype] tpa_max_size
>> drivers/net/ethernet/qlogic/qed/qed_l2.c:648:38: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tpa_min_size_to_start @@    got unsignedrestricted __le16 [usertype] tpa_min_size_to_start @@
   drivers/net/ethernet/qlogic/qed/qed_l2.c:648:38:    expected restricted __le16 [usertype] tpa_min_size_to_start
   drivers/net/ethernet/qlogic/qed/qed_l2.c:648:38:    got unsigned short [unsigned] [usertype] tpa_min_size_to_start
>> drivers/net/ethernet/qlogic/qed/qed_l2.c:649:37: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tpa_min_size_to_cont @@    got unsignedrestricted __le16 [usertype] tpa_min_size_to_cont @@
   drivers/net/ethernet/qlogic/qed/qed_l2.c:649:37:    expected restricted __le16 [usertype] tpa_min_size_to_cont
   drivers/net/ethernet/qlogic/qed/qed_l2.c:649:37:    got unsigned short [unsigned] [usertype] tpa_min_size_to_cont
>> drivers/net/ethernet/qlogic/qed/qed_l2.c:2090:21: sparse: restricted __le32 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_l2.c:2123:21: sparse: restricted __le32 degrades to integer
--
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:586:21: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:586:21: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:586:21: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:586:21: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:586:21: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:586:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:587:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:587:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:587:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:587:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:587:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:587:21: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:588:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:588:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:588:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:588:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:588:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:588:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:589:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:589:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:589:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:589:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:589:22: sparse: cast to restricted __be32
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:589:22: sparse: cast to restricted __be32
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:863:6: sparse: symbol 'qed_dcbx_aen' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_dcbx.c:1083:37: sparse: incorrect type in assignment (different base types) @@    expected unsigned int [unsigned] <noident> @@    got restrunsigned int [unsigned] <noident> @@
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:1083:37:    expected unsigned int [unsigned] <noident>
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:1083:37:    got restricted __be32 [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:1084:38: sparse: incorrect type in assignment (different base types) @@    expected unsigned int [unsigned] <noident> @@    got restrunsigned int [unsigned] <noident> @@
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:1084:38:    expected unsigned int [unsigned] <noident>
   drivers/net/ethernet/qlogic/qed/qed_dcbx.c:1084:38:    got restricted __be32 [usertype] <noident>
--
>> drivers/net/ethernet/qlogic/qed/qed_debug.c:1847:29: sparse: restricted __le32 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_debug.c:1847:58: sparse: restricted __le32 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_debug.c:1849:22: sparse: incorrect type in assignment (different base types) @@    expected unsigned int [unsigned] [assigned] [usertype] addr @@    got igned int [unsigned] [assigned] [usertype] addr @@
   drivers/net/ethernet/qlogic/qed/qed_debug.c:1849:22:    expected unsigned int [unsigned] [assigned] [usertype] addr
   drivers/net/ethernet/qlogic/qed/qed_debug.c:1849:22:    got restricted __le32 [addressable] [usertype] grc_addr
   drivers/net/ethernet/qlogic/qed/qed_debug.c:1851:33: sparse: restricted __le32 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_debug.c:1996:65: sparse: incorrect type in argument 4 (different base types) @@    expected unsigned int [unsigned] [usertype] param_val @@    got restrictunsigned int [unsigned] [usertype] param_val @@
   drivers/net/ethernet/qlogic/qed/qed_debug.c:1996:65:    expected unsigned int [unsigned] [usertype] param_val
   drivers/net/ethernet/qlogic/qed/qed_debug.c:1996:65:    got restricted __le32 [addressable] [usertype] timestamp
--
>> drivers/net/ethernet/qlogic/qed/qed_sriov.c:574:35: sparse: incorrect type in argument 3 (incompatible argument 3 (different base types)) @@    expected int ( *[usertype] cb )( ... ) @@    got rtype] cb )( ... ) @@
   drivers/net/ethernet/qlogic/qed/qed_sriov.c:574:35:    expected int ( *[usertype] cb )( ... )
   drivers/net/ethernet/qlogic/qed/qed_sriov.c:574:35:    got int ( *<noident> )( ... )
>> drivers/net/ethernet/qlogic/qed/qed_sriov.c:675:6: sparse: symbol '_qed_iov_pf_sanity_check' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_sriov.c:690:6: sparse: symbol 'qed_iov_pf_sanity_check' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_sriov.c:3928:6: sparse: symbol 'qed_iov_pf_get_pending_events' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_sriov.c:3971:39: sparse: cast from restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_sriov.c:3971:70: sparse: restricted __le32 degrades to integer
--
>> drivers/net/ethernet/qlogic/qed/qed_vf.c:172:5: sparse: symbol '_qed_vf_pf_release' was not declared. Should it be static?
--
>> drivers/net/ethernet/qlogic/qed/qed_ll2.c:161:6: sparse: symbol 'qed_ll2b_complete_rx_packet' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_ll2.c:756:44: sparse: mixing different enum types
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:756:44:     int enum core_tx_dest  versus
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:756:44:     int enum qed_ll2_tx_dest
>> drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9:    right side has type int
>> drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9: sparse: cast from restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1661:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1663:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1663:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1663:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1663:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1663:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_ll2.c:1663:9:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_ll2.c:2126:20: sparse: symbol 'll2_cbs' was not declared. Should it be static?
--
>> drivers/net/ethernet/qlogic/qed/qed_roce.c:151:6: sparse: symbol 'qed_roce_free_cid_pair' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_roce.c:267:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:267:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:267:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:267:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:267:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:267:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:270:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:270:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:270:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:270:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:270:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:270:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:274:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:274:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:274:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:274:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:274:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:274:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:278:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:278:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:278:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:278:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:278:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:278:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:282:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:282:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:282:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:282:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:282:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:282:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:286:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:286:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:286:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:286:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:286:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:286:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:289:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:289:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:289:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:289:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:289:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:289:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:293:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:293:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:293:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:293:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:293:9:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:293:9:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_roce.c:311:44: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:312:44: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:313:42: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:314:42: sparse: cast from restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_roce.c:327:29: sparse: incorrect type in argument 1 (different base types) @@    expected unsigned short [usertype] *p_fw_mac @@    got  short [usertype] *p_fw_mac @@
   drivers/net/ethernet/qlogic/qed/qed_roce.c:327:29:    expected unsigned short [usertype] *p_fw_mac
   drivers/net/ethernet/qlogic/qed/qed_roce.c:327:29:    got restricted __le16 *<noident>
   drivers/net/ethernet/qlogic/qed/qed_roce.c:328:29: sparse: incorrect type in argument 1 (different base types) @@    expected unsigned short [usertype] *p_fw_mac @@    got  short [usertype] *p_fw_mac @@
   drivers/net/ethernet/qlogic/qed/qed_roce.c:328:29:    expected unsigned short [usertype] *p_fw_mac
   drivers/net/ethernet/qlogic/qed/qed_roce.c:328:29:    got restricted __le16 *<noident>
>> drivers/net/ethernet/qlogic/qed/qed_roce.c:330:32: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] udp_src_port @@    got unsignedrestricted __le16 [usertype] udp_src_port @@
   drivers/net/ethernet/qlogic/qed/qed_roce.c:330:32:    expected restricted __le16 [usertype] udp_src_port
   drivers/net/ethernet/qlogic/qed/qed_roce.c:330:32:    got unsigned short [unsigned] [usertype] udp_src_port
   drivers/net/ethernet/qlogic/qed/qed_roce.c:408:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:408:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:408:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:408:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:408:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:408:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:411:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:411:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:411:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:411:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:411:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:411:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:415:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:415:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:415:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:415:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:415:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:415:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:418:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:418:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:418:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:418:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:418:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:418:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:421:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:421:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:421:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:421:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:421:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:421:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:440:44: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:441:44: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:442:42: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:443:42: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_roce.c:456:29: sparse: incorrect type in argument 1 (different base types) @@    expected unsigned short [usertype] *p_fw_mac @@    got  short [usertype] *p_fw_mac @@
   drivers/net/ethernet/qlogic/qed/qed_roce.c:456:29:    expected unsigned short [usertype] *p_fw_mac
   drivers/net/ethernet/qlogic/qed/qed_roce.c:456:29:    got restricted __le16 *<noident>
   drivers/net/ethernet/qlogic/qed/qed_roce.c:457:29: sparse: incorrect type in argument 1 (different base types) @@    expected unsigned short [usertype] *p_fw_mac @@    got  short [usertype] *p_fw_mac @@
   drivers/net/ethernet/qlogic/qed/qed_roce.c:457:29:    expected unsigned short [usertype] *p_fw_mac
   drivers/net/ethernet/qlogic/qed/qed_roce.c:457:29:    got restricted __le16 *<noident>
   drivers/net/ethernet/qlogic/qed/qed_roce.c:459:32: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] udp_src_port @@    got unsignedrestricted __le16 [usertype] udp_src_port @@
   drivers/net/ethernet/qlogic/qed/qed_roce.c:459:32:    expected restricted __le16 [usertype] udp_src_port
   drivers/net/ethernet/qlogic/qed/qed_roce.c:459:32:    got unsigned short [unsigned] [usertype] udp_src_port
   drivers/net/ethernet/qlogic/qed/qed_roce.c:519:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:519:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:519:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:519:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:519:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:519:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:522:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:522:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:522:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:522:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:522:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:522:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:526:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:526:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:526:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:526:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:526:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:526:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:530:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:530:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:530:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:530:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:530:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:530:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:534:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:534:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:534:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:534:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:534:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:534:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:538:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:538:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:538:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:538:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:538:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:538:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:543:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:543:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:543:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:543:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:543:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:543:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:547:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:547:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:547:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:547:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:547:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:547:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:552:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:552:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:552:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_roce.c:552:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_roce.c:552:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_roce.c:552:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_roce.c:557:9: sparse: invalid assignment: &=
--
>> drivers/net/ethernet/qlogic/qed/qed_rdma.c:137:5: sparse: symbol 'qed_rdma_get_sb_id' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_rdma.c:685:5: sparse: symbol 'qed_rdma_stop' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_rdma.c:772:33: sparse: cast removes address space of expression
>> drivers/net/ethernet/qlogic/qed/qed_rdma.c:1039:31: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] int_timeout @@    got unsignedrestricted __le16 [usertype] int_timeout @@
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1039:31:    expected restricted __le16 [usertype] int_timeout
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1039:31:    got unsigned short [unsigned] [usertype] int_timeout
>> drivers/net/ethernet/qlogic/qed/qed_rdma.c:1141:21: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [short] [usertype] <noident> @@    got unsigned] [short] [usertype] <noident> @@
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1141:21:    expected unsigned short [unsigned] [short] [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1141:21:    got restricted __le16 [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1142:21: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [short] [usertype] <noident> @@    got unsigned] [short] [usertype] <noident> @@
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1142:21:    expected unsigned short [unsigned] [short] [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1142:21:    got restricted __le16 [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1143:21: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [short] [usertype] <noident> @@    got unsigned] [short] [usertype] <noident> @@
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1143:21:    expected unsigned short [unsigned] [short] [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1143:21:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_rdma.c:1434:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1434:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1434:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1434:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1434:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1434:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1438:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1438:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1438:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1438:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1438:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1438:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1441:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1441:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1441:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1441:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1441:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1441:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1446:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1446:17:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1446:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1446:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1446:17:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1446:17:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1450:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1450:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1450:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1450:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1450:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1450:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1454:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1454:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1454:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1454:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1454:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1454:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1458:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1458:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1458:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1458:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1458:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1458:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1462:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1462:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1462:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1462:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1462:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1462:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1466:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1466:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1466:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1466:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1466:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1466:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1469:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1469:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1469:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1469:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1469:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_rdma.c:1469:9:    right side has type unsigned long long
--
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:270:22: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] pd @@    got unsignedrestricted __le16 [usertype] pd @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:270:22:    expected restricted __le16 [usertype] pd
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:270:22:    got unsigned short [unsigned] [usertype] pd
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:271:32: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] sq_num_pages @@    got unsignedrestricted __le16 [usertype] sq_num_pages @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:271:32:    expected restricted __le16 [usertype] sq_num_pages
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:271:32:    got unsigned short [unsigned] [usertype] sq_num_pages
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:272:32: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] rq_num_pages @@    got unsignedrestricted __le16 [usertype] rq_num_pages @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:272:32:    expected restricted __le16 [usertype] rq_num_pages
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:272:32:    got unsigned short [unsigned] [usertype] rq_num_pages
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:274:42: sparse: cast from restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:275:42: sparse: cast from restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:325:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:325:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:325:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:325:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:325:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:325:9:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:328:47: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] transition_to_state @@    got e] transition_to_state @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:328:47:    expected restricted __le16 [usertype] transition_to_state
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:328:47:    got int
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:330:47: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] transition_to_state @@    got e] transition_to_state @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:330:47:    expected restricted __le16 [usertype] transition_to_state
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:330:47:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:378:12: sparse: symbol 'iwarp_state_names' was not declared. Should it be static?
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:695:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:695:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:695:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:695:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:695:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:695:9:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:698:9: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:698:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:698:9:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:698:9: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:698:9:    left side has type restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:698:9:    right side has type unsigned long long
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:716:53: sparse: restricted __le16 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:716:19: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] cwnd @@    got e] cwnd @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:716:19:    expected restricted __le32 [usertype] cwnd
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:716:19:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:718:25: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] ka_timeout @@    got e] ka_timeout @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:718:25:    expected restricted __le32 [usertype] ka_timeout
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:718:25:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:719:26: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] ka_interval @@    got e] ka_interval @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:719:26:    expected restricted __le32 [usertype] ka_interval
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:719:26:    got int
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:813:63: sparse: restricted __le16 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:865:54: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] len @@    got unsignedrestricted __le16 [usertype] len @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:865:54:    expected restricted __le16 [usertype] len
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:865:54:    got unsigned short [unsigned] [usertype] private_data_len
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:869:41: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] ord @@    got unsignerestricted __le32 [usertype] ord @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:869:41:    expected restricted __le32 [usertype] ord
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:869:41:    got unsigned char [unsigned] [usertype] ord
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:870:41: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] ird @@    got unsignerestricted __le32 [usertype] ird @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:870:41:    expected restricted __le32 [usertype] ird
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:870:41:    got unsigned char [unsigned] [usertype] ird
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:872:31: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] tcp_cid @@    got  [usertype] tcp_cid @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:872:31:    expected restricted __le32 [usertype] tcp_cid
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:872:31:    got unsigned int
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:898:31: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] rcv_wnd @@    got unsignedrestricted __le16 [usertype] rcv_wnd @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:898:31:    expected restricted __le16 [usertype] rcv_wnd
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:898:31:    got unsigned short [unsigned] [usertype] rcv_wnd_size
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:964:64: sparse: restricted __le16 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:944:1: sparse: symbol 'qed_iwarp_parse_private_data' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:969:1: sparse: symbol 'qed_iwarp_mpa_reply_arrived' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1835:19: sparse: cast to restricted __be16
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1835:19: sparse: cast to restricted __be16
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1835:19: sparse: cast to restricted __be16
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1835:19: sparse: cast to restricted __be16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1860:56: sparse: restricted __le16 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1861:59: sparse: restricted __le16 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1896:9: sparse: restricted __le16 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:1903:9: sparse: restricted __le16 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2103:56: sparse: restricted __le16 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2124:23: sparse: cast to restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2124:23: sparse: cast to restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2127:36: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] first_mpa_offset @@    got e] first_mpa_offset @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2127:36:    expected restricted __le16 [usertype] first_mpa_offset
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2127:36:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2129:23: sparse: incorrect type in assignment (different base types) @@    expected restricted __le32 [usertype] cid @@    got unsignrestricted __le32 [usertype] cid @@
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2129:23:    expected restricted __le32 [usertype] cid
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2129:23:    got unsigned int [unsigned] [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2147:56: sparse: restricted __le32 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2155:57: sparse: restricted __le16 degrades to integer
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2201:52: sparse: bad assignment (+=) to restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2240:52: sparse: bad assignment (+=) to restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2313:49: sparse: restricted __le16 degrades to integer
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2314:40: sparse: bad assignment (+=) to restricted __le16
   drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2525:49: sparse: cast from restricted __le32
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2511:1: sparse: symbol 'qed_iwarp_ll2_slowpath' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2813:6: sparse: symbol 'qed_iwarp_qp_in_error' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2834:6: sparse: symbol 'qed_iwarp_exception_received' was not declared. Should it be static?
>> drivers/net/ethernet/qlogic/qed/qed_iwarp.c:2965:1: sparse: symbol 'qed_iwarp_connect_complete' was not declared. Should it be static?
--
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:325:29: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] physical_q0 @@    got  short [unsigned] [usertype] physical_q0 @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:325:29:    expected unsigned short [unsigned] [usertype] physical_q0
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:325:29:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:330:29: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] physical_q1 @@    got  short [unsigned] [usertype] physical_q1 @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:330:29:    expected unsigned short [unsigned] [usertype] physical_q1
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:330:29:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:361:42: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] local_mac_addr_hi @@    got e] local_mac_addr_hi @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:361:42:    expected restricted __le16 [usertype] local_mac_addr_hi
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:361:42:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:362:43: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] local_mac_addr_mid @@    got e] local_mac_addr_mid @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:362:43:    expected restricted __le16 [usertype] local_mac_addr_mid
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:362:43:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:363:42: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] local_mac_addr_lo @@    got e] local_mac_addr_lo @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:363:42:    expected restricted __le16 [usertype] local_mac_addr_lo
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:363:42:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:366:43: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] remote_mac_addr_hi @@    got e] remote_mac_addr_hi @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:366:43:    expected restricted __le16 [usertype] remote_mac_addr_hi
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:366:43:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:367:44: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] remote_mac_addr_mid @@    got e] remote_mac_addr_mid @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:367:44:    expected restricted __le16 [usertype] remote_mac_addr_mid
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:367:44:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:368:43: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] remote_mac_addr_lo @@    got e] remote_mac_addr_lo @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:368:43:    expected restricted __le16 [usertype] remote_mac_addr_lo
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:368:43:    got int
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:427:43: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] local_mac_addr_hi @@    got e] local_mac_addr_hi @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:427:43:    expected restricted __le16 [usertype] local_mac_addr_hi
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:427:43:    got int
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:428:44: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] local_mac_addr_mid @@    got e] local_mac_addr_mid @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:428:44:    expected restricted __le16 [usertype] local_mac_addr_mid
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:428:44:    got int
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:429:43: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] local_mac_addr_lo @@    got e] local_mac_addr_lo @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:429:43:    expected restricted __le16 [usertype] local_mac_addr_lo
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:429:43:    got int
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:432:44: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] remote_mac_addr_hi @@    got e] remote_mac_addr_hi @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:432:44:    expected restricted __le16 [usertype] remote_mac_addr_hi
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:432:44:    got int
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:433:45: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] remote_mac_addr_mid @@    got e] remote_mac_addr_mid @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:433:45:    expected restricted __le16 [usertype] remote_mac_addr_mid
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:433:45:    got int
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:434:44: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] remote_mac_addr_lo @@    got e] remote_mac_addr_lo @@
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:434:44:    expected restricted __le16 [usertype] remote_mac_addr_lo
   drivers/net/ethernet/qlogic/qed/qed_iscsi.c:434:44:    got int
>> drivers/net/ethernet/qlogic/qed/qed_iscsi.c:876:6: sparse: symbol 'qed_iscsi_free_connection' was not declared. Should it be static?
--
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:154:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:154:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:154:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:155:37: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] sq_num_pages_in_pbl @@    got unsignedrestricted __le16 [usertype] sq_num_pages_in_pbl @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:155:37:    expected restricted __le16 [usertype] sq_num_pages_in_pbl
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:155:37:    got unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:174:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:174:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:174:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:175:39: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] num_tasks @@    got unsignedrestricted __le16 [usertype] num_tasks @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:175:39:    expected restricted __le16 [usertype] num_tasks
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:175:39:    got unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:182:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:182:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:182:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:183:41: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] cq_num_entries @@    got unsignedrestricted __le16 [usertype] cq_num_entries @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:183:41:    expected restricted __le16 [usertype] cq_num_entries
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:183:41:    got unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:185:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:185:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:185:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:186:43: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] cmdq_num_entries @@    got unsignedrestricted __le16 [usertype] cmdq_num_entries @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:186:43:    expected restricted __le16 [usertype] cmdq_num_entries
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:186:43:    got unsigned short [unsigned] [usertype] tmp
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:198:21: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [assigned] [usertype] tmp @@    got igned] [assigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:198:21:    expected unsigned short [unsigned] [assigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:198:21:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:199:56: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 <noident> @@    got unsigned short [unsigned] [assrestricted __le16 <noident> @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:199:56:    expected restricted __le16 <noident>
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:199:56:    got unsigned short [unsigned] [assigned] [usertype] tmp
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:276:29: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] physical_q0 @@    got  short [unsigned] [usertype] physical_q0 @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:276:29:    expected unsigned short [unsigned] [usertype] physical_q0
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:276:29:    got restricted __le16 [usertype] <noident>
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:298:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:298:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:298:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:299:35: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] tx_max_fc_pay_len @@    got unsignedrestricted __le16 [usertype] tx_max_fc_pay_len @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:299:35:    expected restricted __le16 [usertype] tx_max_fc_pay_len
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:299:35:    got unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:300:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:300:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:300:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:301:35: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] e_d_tov_timer_val @@    got unsignedrestricted __le16 [usertype] e_d_tov_timer_val @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:301:35:    expected restricted __le16 [usertype] e_d_tov_timer_val
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:301:35:    got unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:302:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:302:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:302:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:303:38: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] rec_rr_tov_timer_val @@    got unsignedrestricted __le16 [usertype] rec_rr_tov_timer_val @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:303:38:    expected restricted __le16 [usertype] rec_rr_tov_timer_val
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:303:38:    got unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:304:13: sparse: incorrect type in assignment (different base types) @@    expected unsigned short [unsigned] [usertype] tmp @@    got  short [unsigned] [usertype] tmp @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:304:13:    expected unsigned short [unsigned] [usertype] tmp
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:304:13:    got restricted __le16 [usertype] <noident>
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:305:35: sparse: incorrect type in assignment (different base types) @@    expected restricted __le16 [usertype] rx_max_fc_pay_len @@    got unsignedrestricted __le16 [usertype] rx_max_fc_pay_len @@
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:305:35:    expected restricted __le16 [usertype] rx_max_fc_pay_len
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:305:35:    got unsigned short [unsigned] [usertype] tmp
>> drivers/net/ethernet/qlogic/qed/qed_fcoe.c:584:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:584:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:584:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:584:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:584:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:584:17:    right side has type unsigned long long
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:586:17: sparse: invalid assignment: &=
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:586:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:586:17:    right side has type int
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:586:17: sparse: invalid assignment: |=
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:586:17:    left side has type restricted __le32
   drivers/net/ethernet/qlogic/qed/qed_fcoe.c:586:17:    right side has type unsigned long long

Please review and possibly fold the followup patch.

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

^ permalink raw reply

* [RFC PATCH] qed*: qed_cm_init_pf() can be static
From: kbuild test robot @ 2018-03-27  4:48 UTC (permalink / raw)
  To: Michal Kalderon
  Cc: kbuild-all, michal.kalderon, davem, netdev, linux-rdma,
	linux-scsi, Tomer Tayar, Manish Rangankar, Ariel Elior
In-Reply-To: <1522083732-26560-1-git-send-email-Michal.Kalderon@cavium.com>


Fixes: cda33d25b808 ("qed*: Utilize FW 8.33.11.0")
Signed-off-by: Fengguang Wu <fengguang.wu@intel.com>
---
 qed_cxt.c           |    2 +-
 qed_dcbx.c          |    2 +-
 qed_dev.c           |   12 ++++++------
 qed_init_fw_funcs.c |    2 +-
 qed_iscsi.c         |    4 ++--
 qed_iwarp.c         |   18 +++++++++---------
 qed_ll2.c           |    4 ++--
 qed_mcp.c           |    2 +-
 qed_rdma.c          |    4 ++--
 qed_roce.c          |    2 +-
 qed_sriov.c         |    8 ++++----
 qed_vf.c            |    2 +-
 12 files changed, 31 insertions(+), 31 deletions(-)

diff --git a/drivers/net/ethernet/qlogic/qed/qed_cxt.c b/drivers/net/ethernet/qlogic/qed/qed_cxt.c
index 00f41c1..1695c90 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_cxt.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_cxt.c
@@ -1531,7 +1531,7 @@ void qed_qm_init_pf(struct qed_hwfn *p_hwfn,
 }
 
 /* CM PF */
-void qed_cm_init_pf(struct qed_hwfn *p_hwfn)
+static void qed_cm_init_pf(struct qed_hwfn *p_hwfn)
 {
 	/* XCM pure-LB queue */
 	STORE_RT_REG(p_hwfn, XCM_REG_CON_PHY_Q3_RT_OFFSET,
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
index 449777f..456b8d1 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dcbx.c
@@ -860,7 +860,7 @@ static int qed_dcbx_read_mib(struct qed_hwfn *p_hwfn,
 	return rc;
 }
 
-void qed_dcbx_aen(struct qed_hwfn *hwfn, u32 mib_type)
+static void qed_dcbx_aen(struct qed_hwfn *hwfn, u32 mib_type)
 {
 	struct qed_common_cb_ops *op = hwfn->cdev->protocol_ops.common;
 	void *cookie = hwfn->cdev->ops_cookie;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_dev.c b/drivers/net/ethernet/qlogic/qed/qed_dev.c
index de5527c..0daef44 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_dev.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_dev.c
@@ -230,12 +230,12 @@ static u32 qed_get_pq_flags(struct qed_hwfn *p_hwfn)
 }
 
 /* Getters for resource amounts necessary for qm initialization */
-u8 qed_init_qm_get_num_tcs(struct qed_hwfn *p_hwfn)
+static u8 qed_init_qm_get_num_tcs(struct qed_hwfn *p_hwfn)
 {
 	return p_hwfn->hw_info.num_hw_tc;
 }
 
-u16 qed_init_qm_get_num_vfs(struct qed_hwfn *p_hwfn)
+static u16 qed_init_qm_get_num_vfs(struct qed_hwfn *p_hwfn)
 {
 	return IS_QED_SRIOV(p_hwfn->cdev) ?
 	       p_hwfn->cdev->p_iov_info->total_vfs : 0;
@@ -243,7 +243,7 @@ u16 qed_init_qm_get_num_vfs(struct qed_hwfn *p_hwfn)
 
 #define NUM_DEFAULT_RLS 1
 
-u16 qed_init_qm_get_num_pf_rls(struct qed_hwfn *p_hwfn)
+static u16 qed_init_qm_get_num_pf_rls(struct qed_hwfn *p_hwfn)
 {
 	u16 num_pf_rls, num_vfs = qed_init_qm_get_num_vfs(p_hwfn);
 
@@ -261,7 +261,7 @@ u16 qed_init_qm_get_num_pf_rls(struct qed_hwfn *p_hwfn)
 	return num_pf_rls;
 }
 
-u16 qed_init_qm_get_num_vports(struct qed_hwfn *p_hwfn)
+static u16 qed_init_qm_get_num_vports(struct qed_hwfn *p_hwfn)
 {
 	u32 pq_flags = qed_get_pq_flags(p_hwfn);
 
@@ -273,7 +273,7 @@ u16 qed_init_qm_get_num_vports(struct qed_hwfn *p_hwfn)
 }
 
 /* calc amount of PQs according to the requested flags */
-u16 qed_init_qm_get_num_pqs(struct qed_hwfn *p_hwfn)
+static u16 qed_init_qm_get_num_pqs(struct qed_hwfn *p_hwfn)
 {
 	u32 pq_flags = qed_get_pq_flags(p_hwfn);
 
@@ -507,7 +507,7 @@ u16 qed_get_cm_pq_idx_vf(struct qed_hwfn *p_hwfn, u16 vf)
 	return qed_get_cm_pq_idx(p_hwfn, PQ_FLAGS_VFS) + vf;
 }
 
-u16 qed_get_cm_pq_idx_rl(struct qed_hwfn *p_hwfn, u8 rl)
+static u16 qed_get_cm_pq_idx_rl(struct qed_hwfn *p_hwfn, u8 rl)
 {
 	u16 max_rl = qed_init_qm_get_num_pf_rls(p_hwfn);
 
diff --git a/drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c b/drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c
index 1365da7..b296b78 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_init_fw_funcs.c
@@ -1225,7 +1225,7 @@ void qed_gft_disable(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt, u16 pf_id)
 	       0);
 }
 
-void qed_set_gft_event_id_cm_hdr(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
+static void qed_set_gft_event_id_cm_hdr(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
 {
 	u32 rfs_cm_hdr_event_id;
 
diff --git a/drivers/net/ethernet/qlogic/qed/qed_iscsi.c b/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
index c0d4a54..1135387 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_iscsi.c
@@ -873,8 +873,8 @@ static void qed_iscsi_release_connection(struct qed_hwfn *p_hwfn,
 	spin_unlock_bh(&p_hwfn->p_iscsi_info->lock);
 }
 
-void qed_iscsi_free_connection(struct qed_hwfn *p_hwfn,
-			       struct qed_iscsi_conn *p_conn)
+static void qed_iscsi_free_connection(struct qed_hwfn *p_hwfn,
+				      struct qed_iscsi_conn *p_conn)
 {
 	qed_chain_free(p_hwfn->cdev, &p_conn->xhq);
 	qed_chain_free(p_hwfn->cdev, &p_conn->uhq);
diff --git a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
index 2a2b101..7b292ec 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_iwarp.c
@@ -375,7 +375,7 @@ qed_iwarp2roce_state(enum qed_iwarp_qp_state state)
 	}
 }
 
-const char *iwarp_state_names[] = {
+static const char *iwarp_state_names[] = {
 	"IDLE",
 	"RTS",
 	"TERMINATE",
@@ -940,7 +940,7 @@ qed_iwarp_return_ep(struct qed_hwfn *p_hwfn, struct qed_iwarp_ep *ep)
 	spin_unlock_bh(&p_hwfn->p_rdma_info->iwarp.iw_lock);
 }
 
-void
+static void
 qed_iwarp_parse_private_data(struct qed_hwfn *p_hwfn, struct qed_iwarp_ep *ep)
 {
 	struct mpa_v2_hdr *mpa_v2_params;
@@ -965,7 +965,7 @@ qed_iwarp_parse_private_data(struct qed_hwfn *p_hwfn, struct qed_iwarp_ep *ep)
 				       mpa_data_size;
 }
 
-void
+static void
 qed_iwarp_mpa_reply_arrived(struct qed_hwfn *p_hwfn, struct qed_iwarp_ep *ep)
 {
 	struct qed_iwarp_cm_event_params params;
@@ -2507,7 +2507,7 @@ static void qed_iwarp_ll2_rel_tx_pkt(void *cxt, u8 connection_handle,
 /* The only slowpath for iwarp ll2 is unalign flush. When this completion
  * is received, need to reset the FPDU.
  */
-void
+static void
 qed_iwarp_ll2_slowpath(void *cxt,
 		       u8 connection_handle,
 		       u32 opaque_data_0, u32 opaque_data_1)
@@ -2810,8 +2810,8 @@ int qed_iwarp_stop(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
 	return qed_iwarp_ll2_stop(p_hwfn, p_ptt);
 }
 
-void qed_iwarp_qp_in_error(struct qed_hwfn *p_hwfn,
-			   struct qed_iwarp_ep *ep, u8 fw_return_code)
+static void qed_iwarp_qp_in_error(struct qed_hwfn *p_hwfn,
+				  struct qed_iwarp_ep *ep, u8 fw_return_code)
 {
 	struct qed_iwarp_cm_event_params params;
 
@@ -2831,8 +2831,8 @@ void qed_iwarp_qp_in_error(struct qed_hwfn *p_hwfn,
 	ep->event_cb(ep->cb_context, &params);
 }
 
-void qed_iwarp_exception_received(struct qed_hwfn *p_hwfn,
-				  struct qed_iwarp_ep *ep, int fw_ret_code)
+static void qed_iwarp_exception_received(struct qed_hwfn *p_hwfn,
+					 struct qed_iwarp_ep *ep, int fw_ret_code)
 {
 	struct qed_iwarp_cm_event_params params;
 	bool event_cb = false;
@@ -2961,7 +2961,7 @@ qed_iwarp_tcp_connect_unsuccessful(struct qed_hwfn *p_hwfn,
 	}
 }
 
-void
+static void
 qed_iwarp_connect_complete(struct qed_hwfn *p_hwfn,
 			   struct qed_iwarp_ep *ep, u8 fw_return_code)
 {
diff --git a/drivers/net/ethernet/qlogic/qed/qed_ll2.c b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
index 74fc626..ff0556e 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_ll2.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_ll2.c
@@ -158,7 +158,7 @@ static void qed_ll2_kill_buffers(struct qed_dev *cdev)
 		qed_ll2_dealloc_buffer(cdev, buffer);
 }
 
-void qed_ll2b_complete_rx_packet(void *cxt, struct qed_ll2_comp_rx_data *data)
+static void qed_ll2b_complete_rx_packet(void *cxt, struct qed_ll2_comp_rx_data *data)
 {
 	struct qed_hwfn *p_hwfn = cxt;
 	struct qed_ll2_buffer *buffer = data->cookie;
@@ -2123,7 +2123,7 @@ static void qed_ll2_register_cb_ops(struct qed_dev *cdev,
 	cdev->ll2->cb_cookie = cookie;
 }
 
-struct qed_ll2_cbs ll2_cbs = {
+static struct qed_ll2_cbs ll2_cbs = {
 	.rx_comp_cb = &qed_ll2b_complete_rx_packet,
 	.rx_release_cb = &qed_ll2b_release_rx_packet,
 	.tx_comp_cb = &qed_ll2b_complete_tx_packet,
diff --git a/drivers/net/ethernet/qlogic/qed/qed_mcp.c b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
index 6f46cb1..a4141fa 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_mcp.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_mcp.c
@@ -2687,7 +2687,7 @@ static int qed_mcp_resource_cmd(struct qed_hwfn *p_hwfn,
 	return rc;
 }
 
-int
+static int
 __qed_mcp_resc_lock(struct qed_hwfn *p_hwfn,
 		    struct qed_ptt *p_ptt,
 		    struct qed_resc_lock_params *p_params)
diff --git a/drivers/net/ethernet/qlogic/qed/qed_rdma.c b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
index a411f9c..a47cf6f 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_rdma.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_rdma.c
@@ -134,7 +134,7 @@ static bool qed_bmap_is_empty(struct qed_bmap *bmap)
 	return bmap->max_count == find_first_bit(bmap->bitmap, bmap->max_count);
 }
 
-u32 qed_rdma_get_sb_id(void *p_hwfn, u32 rel_sb_id)
+static u32 qed_rdma_get_sb_id(void *p_hwfn, u32 rel_sb_id)
 {
 	/* First sb id for RoCE is after all the l2 sb */
 	return FEAT_NUM((struct qed_hwfn *)p_hwfn, QED_PF_L2_QUE) + rel_sb_id;
@@ -682,7 +682,7 @@ static int qed_rdma_setup(struct qed_hwfn *p_hwfn,
 	return qed_rdma_start_fw(p_hwfn, params, p_ptt);
 }
 
-int qed_rdma_stop(void *rdma_cxt)
+static int qed_rdma_stop(void *rdma_cxt)
 {
 	struct qed_hwfn *p_hwfn = (struct qed_hwfn *)rdma_cxt;
 	struct rdma_close_func_ramrod_data *p_ramrod;
diff --git a/drivers/net/ethernet/qlogic/qed/qed_roce.c b/drivers/net/ethernet/qlogic/qed/qed_roce.c
index fb7c2d1..db36e3b 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_roce.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_roce.c
@@ -148,7 +148,7 @@ static enum roce_flavor qed_roce_mode_to_flavor(enum roce_mode roce_mode)
 	return flavor;
 }
 
-void qed_roce_free_cid_pair(struct qed_hwfn *p_hwfn, u16 cid)
+static void qed_roce_free_cid_pair(struct qed_hwfn *p_hwfn, u16 cid)
 {
 	spin_lock_bh(&p_hwfn->p_rdma_info->lock);
 	qed_bmap_release_id(p_hwfn, &p_hwfn->p_rdma_info->cid_map, cid);
diff --git a/drivers/net/ethernet/qlogic/qed/qed_sriov.c b/drivers/net/ethernet/qlogic/qed/qed_sriov.c
index 5acb91b..8bab9af 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_sriov.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_sriov.c
@@ -672,8 +672,8 @@ int qed_iov_hw_info(struct qed_hwfn *p_hwfn)
 	return 0;
 }
 
-bool _qed_iov_pf_sanity_check(struct qed_hwfn *p_hwfn,
-			      int vfid, bool b_fail_malicious)
+static bool _qed_iov_pf_sanity_check(struct qed_hwfn *p_hwfn,
+				     int vfid, bool b_fail_malicious)
 {
 	/* Check PF supports sriov */
 	if (IS_VF(p_hwfn->cdev) || !IS_QED_SRIOV(p_hwfn->cdev) ||
@@ -687,7 +687,7 @@ bool _qed_iov_pf_sanity_check(struct qed_hwfn *p_hwfn,
 	return true;
 }
 
-bool qed_iov_pf_sanity_check(struct qed_hwfn *p_hwfn, int vfid)
+static bool qed_iov_pf_sanity_check(struct qed_hwfn *p_hwfn, int vfid)
 {
 	return _qed_iov_pf_sanity_check(p_hwfn, vfid, true);
 }
@@ -3925,7 +3925,7 @@ static void qed_iov_process_mbx_req(struct qed_hwfn *p_hwfn,
 	}
 }
 
-void qed_iov_pf_get_pending_events(struct qed_hwfn *p_hwfn, u64 *events)
+static void qed_iov_pf_get_pending_events(struct qed_hwfn *p_hwfn, u64 *events)
 {
 	int i;
 
diff --git a/drivers/net/ethernet/qlogic/qed/qed_vf.c b/drivers/net/ethernet/qlogic/qed/qed_vf.c
index 91b5e9f..d83e38f 100644
--- a/drivers/net/ethernet/qlogic/qed/qed_vf.c
+++ b/drivers/net/ethernet/qlogic/qed/qed_vf.c
@@ -169,7 +169,7 @@ static void qed_vf_pf_add_qid(struct qed_hwfn *p_hwfn,
 	p_qid_tlv->qid = p_cid->qid_usage_idx;
 }
 
-int _qed_vf_pf_release(struct qed_hwfn *p_hwfn, bool b_final)
+static int _qed_vf_pf_release(struct qed_hwfn *p_hwfn, bool b_final)
 {
 	struct qed_vf_iov *p_iov = p_hwfn->vf_iov_info;
 	struct pfvf_def_resp_tlv *resp;

^ permalink raw reply related

* [PATCH net] vhost: correctly remove wait queue during poll failure
From: Jason Wang @ 2018-03-27  3:47 UTC (permalink / raw)
  To: mst, jasowang; +Cc: kvm, virtualization, netdev, linux-kernel

We tried to remove vq poll from wait queue, but do not check whether
or not it was in a list before. This will lead double free. Fixing
this by checking poll->wqh to make sure it was in a list.

Reported-by: syzbot+c0272972b01b872e604a@syzkaller.appspotmail.com
Fixes: 2b8b328b61c79 ("vhost_net: handle polling errors when setting backend")
Signed-off-by: Jason Wang <jasowang@redhat.com>
---
 drivers/vhost/vhost.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 1b3e8d2d..5d5a9d9 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -212,8 +212,7 @@ int vhost_poll_start(struct vhost_poll *poll, struct file *file)
 	if (mask)
 		vhost_poll_wakeup(&poll->wait, 0, 0, poll_to_key(mask));
 	if (mask & EPOLLERR) {
-		if (poll->wqh)
-			remove_wait_queue(poll->wqh, &poll->wait);
+		vhost_poll_stop(poll);
 		ret = -EINVAL;
 	}
 
-- 
2.7.4

^ permalink raw reply related

* Re: BUG: corrupted list in remove_wait_queue
From: Jason Wang @ 2018-03-27  3:36 UTC (permalink / raw)
  To: syzbot, kvm, linux-kernel, mst, netdev, syzkaller-bugs,
	virtualization
In-Reply-To: <0000000000004822e3056827baf4@google.com>



On 2018年03月24日 20:32, syzbot wrote:
> syzbot has found reproducer for the following crash on upstream commit
> 99fec39e7725d091c94d1bb0242e40c8092994f6 (Fri Mar 23 22:34:18 2018 +0000)
> Merge tag 'trace-v4.16-rc4' of 
> git://git.kernel.org/pub/scm/linux/kernel/git/rostedt/linux-trace
> syzbot dashboard link: 
> https://syzkaller.appspot.com/bug?extid=c0272972b01b872e604a
>
> So far this crash happened 4 times on upstream.
> C reproducer is attached.
> syzkaller reproducer is attached.
> Raw console output is attached.
> .config is attached.
> compiler: gcc (GCC) 7.1.1 20170620
>
> IMPORTANT: if you fix the bug, please add the following tag to the 
> commit:
> Reported-by: syzbot+c0272972b01b872e604a@syzkaller.appspotmail.com
> It will help syzbot understand when the bug is fixed.
>
> list_del corruption, 0000000054a89bb5->next is LIST_POISON1 
> (00000000a63e4a19)
> ------------[ cut here ]------------
> kernel BUG at lib/list_debug.c:47!
> invalid opcode: 0000 [#1] SMP KASAN
> Dumping ftrace buffer:
>    (ftrace buffer empty)
> Modules linked in:
> CPU: 0 PID: 4851 Comm: syzkaller762396 Not tainted 4.16.0-rc6+ #364
> Hardware name: Google Google Compute Engine/Google Compute Engine, 
> BIOS Google 01/01/2011
> RIP: 0010:__list_del_entry_valid+0xd3/0x150 lib/list_debug.c:45
> RSP: 0018:ffff8801d3ff71b8 EFLAGS: 00010086
> RAX: 000000000000004e RBX: dead000000000200 RCX: 0000000000000000
> RDX: 000000000000004e RSI: 1ffff1003a7fedec RDI: ffffed003a7fee2b
> RBP: ffff8801d3ff71d0 R08: ffff8801db227fc0 R09: 1ffff1003a7fed93
> R10: ffff8801d3ff7090 R11: 0000000000000002 R12: dead000000000100
> R13: ffff8801b6a2d458 R14: ffff8801b6a2d460 R15: ffff8801d27d1780
> FS:  0000000000000000(0000) GS:ffff8801db200000(0000) 
> knlGS:0000000000000000
> CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> CR2: 000000002001d000 CR3: 0000000006e22002 CR4: 00000000001606f0
> DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
> DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
> Call Trace:
>  __list_del_entry include/linux/list.h:117 [inline]
>  list_del include/linux/list.h:125 [inline]
>  __remove_wait_queue include/linux/wait.h:184 [inline]
>  remove_wait_queue+0x90/0x350 kernel/sched/wait.c:51
>  vhost_poll_stop+0x46/0x90 drivers/vhost/vhost.c:229
>  vhost_net_disable_vq drivers/vhost/net.c:405 [inline]
>  vhost_net_stop_vq+0x90/0x120 drivers/vhost/net.c:973
>  vhost_net_stop drivers/vhost/net.c:984 [inline]
>  vhost_net_release+0x49/0x190 drivers/vhost/net.c:1017
>  __fput+0x327/0x7e0 fs/file_table.c:209
>  ____fput+0x15/0x20 fs/file_table.c:243
>  task_work_run+0x199/0x270 kernel/task_work.c:113
>  exit_task_work include/linux/task_work.h:22 [inline]
>  do_exit+0x9bb/0x1ad0 kernel/exit.c:865
>  do_group_exit+0x149/0x400 kernel/exit.c:968
>  get_signal+0x73a/0x16d0 kernel/signal.c:2469
>  do_signal+0x90/0x1e90 arch/x86/kernel/signal.c:809
>  exit_to_usermode_loop+0x258/0x2f0 arch/x86/entry/common.c:162
>  prepare_exit_to_usermode arch/x86/entry/common.c:196 [inline]
>  syscall_return_slowpath arch/x86/entry/common.c:265 [inline]
>  do_syscall_64+0x6ec/0x940 arch/x86/entry/common.c:292
>  entry_SYSCALL_64_after_hwframe+0x42/0xb7
> RIP: 0033:0x44a8e9
> RSP: 002b:00007f7ec8480da8 EFLAGS: 00000293 ORIG_RAX: 0000000000000010
> RAX: 0000000000000000 RBX: 00000000006e29e4 RCX: 000000000044a8e9
> RDX: 0000000020000340 RSI: 00000000400454ca RDI: 0000000000000005
> RBP: 00000000006e29e0 R08: 0000000000000000 R09: 0000000000000000
> R10: 0000000000000000 R11: 0000000000000293 R12: 6f68762f7665642f
> R13: 6475612f7665642f R14: 74656e2f7665642f R15: 0000000000000001
> Code: 8f 00 00 00 49 8b 54 24 08 48 39 f2 75 3b 48 83 c4 08 b8 01 00 
> 00 00 5b 41 5c 5d c3 4c 89 e2 48 c7 c7 00 80 40 86 e8 85 df fb fe <0f> 
> 0b 48 c7 c7 60 80 40 86 e8 77 df fb fe 0f 0b 48 c7 c7 c0 80
> RIP: __list_del_entry_valid+0xd3/0x150 lib/list_debug.c:45 RSP: 
> ffff8801d3ff71b8
> ---[ end trace bdcbea47fcda73ff ]---
>

This is because we do not clear poll->wqh when poll fails, then a double 
free may be triggered. Will post a patch. And I suspect we need hold vq 
mutex in vhost_dev_stop().

Thanks

^ permalink raw reply

* Re: [RFC PATCH V2 0/8] Packed ring for vhost
From: Jason Wang @ 2018-03-27  3:33 UTC (permalink / raw)
  To: Konrad Rzeszutek Wilk; +Cc: mst, virtualization, kvm, netdev, linux-kernel
In-Reply-To: <20180326190130.GE6928@char.us.oracle.com>



On 2018年03月27日 03:01, Konrad Rzeszutek Wilk wrote:
> On Mon, Mar 26, 2018 at 11:38:45AM +0800, Jason Wang wrote:
>> Hi all:
>>
>> This RFC implement packed ring layout. The code were tested with pmd
>> implement by Jens at
>> http://dpdk.org/ml/archives/dev/2018-January/089417.html. Minor change
>> was needed for pmd codes to kick virtqueue since it assumes a busy
>> polling backend.
>>
>> Test were done between localhost and guest. Testpmd (rxonly) in guest
>> reports 2.4Mpps. Testpmd (txonly) repots about 2.1Mpps.
> And how does it compare to older ring layout?
>

No obvious difference.

Vhost itself becomes a bottleneck. I plan to do more aggressive batching 
like dpdk on top.

Thanks

^ permalink raw reply

* Re: [PATCH v2 iproute2-next 3/6] rdma: Add CM_ID resource tracking information
From: Leon Romanovsky @ 2018-03-27  3:21 UTC (permalink / raw)
  To: Jason Gunthorpe; +Cc: Steve Wise, David Ahern, stephen, netdev, linux-rdma
In-Reply-To: <20180326223033.GK15554@ziepe.ca>

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

On Mon, Mar 26, 2018 at 04:30:33PM -0600, Jason Gunthorpe wrote:
> On Mon, Mar 26, 2018 at 04:34:44PM -0500, Steve Wise wrote:
> >
> > On 3/26/2018 4:15 PM, Jason Gunthorpe wrote:
> > > On Mon, Mar 26, 2018 at 09:30:41AM -0500, Steve Wise wrote:
> > >>
> > >> On 3/26/2018 9:17 AM, David Ahern wrote:
> > >>> On 2/27/18 9:07 AM, Steve Wise wrote:
> > >>>> diff --git a/rdma/rdma.h b/rdma/rdma.h
> > >>>> index 5809f70..e55205b 100644
> > >>>> +++ b/rdma/rdma.h
> > >>>> @@ -18,10 +18,12 @@
> > >>>>  #include <libmnl/libmnl.h>
> > >>>>  #include <rdma/rdma_netlink.h>
> > >>>>  #include <time.h>
> > >>>> +#include <net/if_arp.h>
> > >>>>
> > >>>>  #include "list.h"
> > >>>>  #include "utils.h"
> > >>>>  #include "json_writer.h"
> > >>>> +#include <rdma/rdma_cma.h>
> > >>>>
> > >>> did you forget to add rdma_cma.h? I don't see that file in my repo.
> > >> It is provided by the rdma-core package, upon which rdma tool now
> > >> depends for the rdma_port_space enum.
> > > It is a kernel bug that enum is not in an include/uapi/rdma header
> > >
> > > Fix it there and don't try to use rdma-core headers to get kernel ABI.
> > >
> > > Jason
> >
> > I wish you'd commented on this just a little sooner.  I just resent v3
> > of this series... with rdma_cma.h included. :)
> >
> > How about the restrack/nldev code just translates the port space from
> > enum rdma_port_space to a new ABI enum, say nldev_rdma_port_space, that
> > i add to rdma_netlink.h?  I'd hate to open the can of worms of trying to
> > split rdma_cma.h into uabi and no uabi headers. :(
>
> If port space is already part of the ABI there isn't much reason to
> translate it.
>
> You just need to pick the right header to put it in, since it is a verbs
> define it doesn't belong in the netlink header.

I completely understand Steve's concerns.

I tried to do such thing (expose kernel headers) in first incarnation of
rdmatool with attempt to clean IB/core as well to ensure that we won't expose
anything that is not implemented. It didn't go well.

Thanks

>
> Jason

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply

* Re: [PATCH bpf-next] bpf: sockmap: initialize sg table entries properly
From: John Fastabend @ 2018-03-27  3:15 UTC (permalink / raw)
  To: Prashant Bhole, Daniel Borkmann, Alexei Starovoitov,
	David S . Miller
  Cc: netdev
In-Reply-To: <20180326065443.7880-1-bhole_prashant_q7@lab.ntt.co.jp>

On 03/25/2018 11:54 PM, Prashant Bhole wrote:
> When CONFIG_DEBUG_SG is set, sg->sg_magic is initialized to SG_MAGIC,
> when sg table is initialized using sg_init_table(). Magic is checked
> while navigating the scatterlist. We hit BUG_ON when magic check is
> failed.
> 
> Fixed following things:
> - Initialization of sg table in bpf_tcp_sendpage() was missing,
>   initialized it using sg_init_table()
> 
> - bpf_tcp_sendmsg() initializes sg table using sg_init_table() before
>   entering the loop, but further consumed sg entries are initialized
>   using memset. Fixed it by replacing memset with sg_init_table() in
>   function bpf_tcp_push()
> 
> Signed-off-by: Prashant Bhole <bhole_prashant_q7@lab.ntt.co.jp>
> ---
>  kernel/bpf/sockmap.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/kernel/bpf/sockmap.c b/kernel/bpf/sockmap.c
> index 69c5bccabd22..8a848a99d768 100644
> --- a/kernel/bpf/sockmap.c
> +++ b/kernel/bpf/sockmap.c
> @@ -312,7 +312,7 @@ static int bpf_tcp_push(struct sock *sk, int apply_bytes,
>  			md->sg_start++;
>  			if (md->sg_start == MAX_SKB_FRAGS)
>  				md->sg_start = 0;
> -			memset(sg, 0, sizeof(*sg));
> +			sg_init_table(sg, 1);

Looks OK here.

>  
>  			if (md->sg_start == md->sg_end)
>  				break;
> @@ -763,10 +763,14 @@ static int bpf_tcp_sendpage(struct sock *sk, struct page *page,
>  
>  	lock_sock(sk);
>  
> -	if (psock->cork_bytes)
> +	if (psock->cork_bytes) {
>  		m = psock->cork;
> -	else
> +		sg = &m->sg_data[m->sg_end];
> +	} else {
>  		m = &md;
> +		sg = m->sg_data;
> +		sg_init_table(sg, MAX_SKB_FRAGS);

sg_init_table() does an unnecessary memset() though. We
probably either want a new scatterlist API or just open
code this,

#ifdef CONFIG_DEBUG_SG
{
	unsigned int i;
	for (i = 0; i < nents; i++)
		sgl[i].sg_magic = SG_MAGIC;
}

> +	}
>  
>  	/* Catch case where ring is full and sendpage is stalled. */
>  	if (unlikely(m->sg_end == m->sg_start &&
> @@ -774,7 +778,6 @@ static int bpf_tcp_sendpage(struct sock *sk, struct page *page,
>  		goto out_err;
>  
>  	psock->sg_size += size;
> -	sg = &m->sg_data[m->sg_end];
>  	sg_set_page(sg, page, size, offset);
>  	get_page(page);
>  	m->sg_copy[m->sg_end] = true;
> 

Nice, catch. I probably should audit though code paths
as well and run the test suite with CONFIG_DEBUG_SG. There
might be a couple other spots where I open coded the sg
elements.

Thanks,
John

^ permalink raw reply

* Re: [PATCH 4/4] selftests/bpf: fix compiling errors
From: Du, Changbin @ 2018-03-27  3:06 UTC (permalink / raw)
  To: Alexei Starovoitov
  Cc: Du, Changbin, shuah, linux-kselftest, linux-kernel,
	Daniel Borkmann, netdev
In-Reply-To: <20180327030229.txifuth2qmnjo3hy@ast-mbp>

On Mon, Mar 26, 2018 at 08:02:30PM -0700, Alexei Starovoitov wrote:
> On Tue, Mar 27, 2018 at 10:20:10AM +0800, Du, Changbin wrote:
> > On Mon, Mar 26, 2018 at 07:55:13AM -0700, Alexei Starovoitov wrote:
> > > On Mon, Mar 26, 2018 at 05:23:28PM +0800, changbin.du@intel.com wrote:
> > > > Signed-off-by: Changbin Du <changbin.du@intel.com>
> > > > ---
> > > >  tools/testing/selftests/bpf/Makefile | 5 +++--
> > > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > > > 
> > > > diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
> > > > index 5c43c18..dc0fdc8 100644
> > > > --- a/tools/testing/selftests/bpf/Makefile
> > > > +++ b/tools/testing/selftests/bpf/Makefile
> > > > @@ -10,7 +10,8 @@ ifneq ($(wildcard $(GENHDR)),)
> > > >    GENFLAGS := -DHAVE_GENHDR
> > > >  endif
> > > >  
> > > > -CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include
> > > > +CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) \
> > > > +	  -I../../../include -I../../../../usr/include
> > > >  LDLIBS += -lcap -lelf -lrt -lpthread
> > > >  
> > > >  # Order correspond to 'make run_tests' order
> > > > @@ -62,7 +63,7 @@ else
> > > >    CPU ?= generic
> > > >  endif
> > > >  
> > > > -CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi \
> > > > +CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi -I../../../../usr/include \
> > > >  	      -Wno-compare-distinct-pointer-types
> > > 
> > > Nack.
> > > I suspect that will break the build for everyone else who's doing it in the directory
> > > itself instead of the outer one.
> > >
> > 
> > This one? But I didn't see any problem.
> 
> because the build was lucky and additional path ../../../../usr/include didn't point
> to a valid dir?
I am sorry but I don't understand why you mean *lucky*. Of cause, the path is valid.

> Please test with in-source and out-of-source builds.
> 
agree.

-- 
Thanks,
Changbin Du

^ permalink raw reply

* Re: [PATCH 4/4] selftests/bpf: fix compiling errors
From: Alexei Starovoitov @ 2018-03-27  3:02 UTC (permalink / raw)
  To: Du, Changbin
  Cc: shuah, linux-kselftest, linux-kernel, Daniel Borkmann, netdev
In-Reply-To: <20180327022010.57u6rn73inbkrycn@intel.com>

On Tue, Mar 27, 2018 at 10:20:10AM +0800, Du, Changbin wrote:
> On Mon, Mar 26, 2018 at 07:55:13AM -0700, Alexei Starovoitov wrote:
> > On Mon, Mar 26, 2018 at 05:23:28PM +0800, changbin.du@intel.com wrote:
> > > Signed-off-by: Changbin Du <changbin.du@intel.com>
> > > ---
> > >  tools/testing/selftests/bpf/Makefile | 5 +++--
> > >  1 file changed, 3 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/tools/testing/selftests/bpf/Makefile b/tools/testing/selftests/bpf/Makefile
> > > index 5c43c18..dc0fdc8 100644
> > > --- a/tools/testing/selftests/bpf/Makefile
> > > +++ b/tools/testing/selftests/bpf/Makefile
> > > @@ -10,7 +10,8 @@ ifneq ($(wildcard $(GENHDR)),)
> > >    GENFLAGS := -DHAVE_GENHDR
> > >  endif
> > >  
> > > -CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) -I../../../include
> > > +CFLAGS += -Wall -O2 -I$(APIDIR) -I$(LIBDIR) -I$(GENDIR) $(GENFLAGS) \
> > > +	  -I../../../include -I../../../../usr/include
> > >  LDLIBS += -lcap -lelf -lrt -lpthread
> > >  
> > >  # Order correspond to 'make run_tests' order
> > > @@ -62,7 +63,7 @@ else
> > >    CPU ?= generic
> > >  endif
> > >  
> > > -CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi \
> > > +CLANG_FLAGS = -I. -I./include/uapi -I../../../include/uapi -I../../../../usr/include \
> > >  	      -Wno-compare-distinct-pointer-types
> > 
> > Nack.
> > I suspect that will break the build for everyone else who's doing it in the directory
> > itself instead of the outer one.
> >
> 
> This one? But I didn't see any problem.

because the build was lucky and additional path ../../../../usr/include didn't point
to a valid dir?
Please test with in-source and out-of-source builds.

^ permalink raw reply

* [PATCH v6 bpf-next 09/11] libbpf: add bpf_raw_tracepoint_open helper
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

add bpf_raw_tracepoint_open(const char *name, int prog_fd) api to libbpf

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 tools/include/uapi/linux/bpf.h | 11 +++++++++++
 tools/lib/bpf/bpf.c            | 11 +++++++++++
 tools/lib/bpf/bpf.h            |  1 +
 3 files changed, 23 insertions(+)

diff --git a/tools/include/uapi/linux/bpf.h b/tools/include/uapi/linux/bpf.h
index d245c41213ac..58060bec999d 100644
--- a/tools/include/uapi/linux/bpf.h
+++ b/tools/include/uapi/linux/bpf.h
@@ -94,6 +94,7 @@ enum bpf_cmd {
 	BPF_MAP_GET_FD_BY_ID,
 	BPF_OBJ_GET_INFO_BY_FD,
 	BPF_PROG_QUERY,
+	BPF_RAW_TRACEPOINT_OPEN,
 };
 
 enum bpf_map_type {
@@ -134,6 +135,7 @@ enum bpf_prog_type {
 	BPF_PROG_TYPE_SK_SKB,
 	BPF_PROG_TYPE_CGROUP_DEVICE,
 	BPF_PROG_TYPE_SK_MSG,
+	BPF_PROG_TYPE_RAW_TRACEPOINT,
 };
 
 enum bpf_attach_type {
@@ -344,6 +346,11 @@ union bpf_attr {
 		__aligned_u64	prog_ids;
 		__u32		prog_cnt;
 	} query;
+
+	struct {
+		__u64 name;
+		__u32 prog_fd;
+	} raw_tracepoint;
 } __attribute__((aligned(8)));
 
 /* BPF helper function descriptions:
@@ -1151,4 +1158,8 @@ struct bpf_cgroup_dev_ctx {
 	__u32 minor;
 };
 
+struct bpf_raw_tracepoint_args {
+	__u64 args[0];
+};
+
 #endif /* _UAPI__LINUX_BPF_H__ */
diff --git a/tools/lib/bpf/bpf.c b/tools/lib/bpf/bpf.c
index 592a58a2b681..e0500055f1a6 100644
--- a/tools/lib/bpf/bpf.c
+++ b/tools/lib/bpf/bpf.c
@@ -428,6 +428,17 @@ int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len)
 	return err;
 }
 
+int bpf_raw_tracepoint_open(const char *name, int prog_fd)
+{
+	union bpf_attr attr;
+
+	bzero(&attr, sizeof(attr));
+	attr.raw_tracepoint.name = ptr_to_u64(name);
+	attr.raw_tracepoint.prog_fd = prog_fd;
+
+	return sys_bpf(BPF_RAW_TRACEPOINT_OPEN, &attr, sizeof(attr));
+}
+
 int bpf_set_link_xdp_fd(int ifindex, int fd, __u32 flags)
 {
 	struct sockaddr_nl sa;
diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
index 8d18fb73d7fb..ee59342c6f42 100644
--- a/tools/lib/bpf/bpf.h
+++ b/tools/lib/bpf/bpf.h
@@ -79,4 +79,5 @@ int bpf_map_get_fd_by_id(__u32 id);
 int bpf_obj_get_info_by_fd(int prog_fd, void *info, __u32 *info_len);
 int bpf_prog_query(int target_fd, enum bpf_attach_type type, __u32 query_flags,
 		   __u32 *attach_flags, __u32 *prog_ids, __u32 *prog_cnt);
+int bpf_raw_tracepoint_open(const char *name, int prog_fd);
 #endif
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 03/11] net/mac802154: disambiguate mac80215 vs mac802154 trace events
From: Alexei Starovoitov @ 2018-03-27  2:46 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

two trace events defined with the same name and both unused.
They conflict in allyesconfig build. Rename one of them.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 net/mac802154/trace.h | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/net/mac802154/trace.h b/net/mac802154/trace.h
index 2c8a43d3607f..df855c33daf2 100644
--- a/net/mac802154/trace.h
+++ b/net/mac802154/trace.h
@@ -33,7 +33,7 @@
 
 /* Tracing for driver callbacks */
 
-DECLARE_EVENT_CLASS(local_only_evt,
+DECLARE_EVENT_CLASS(local_only_evt4,
 	TP_PROTO(struct ieee802154_local *local),
 	TP_ARGS(local),
 	TP_STRUCT__entry(
@@ -45,7 +45,7 @@ DECLARE_EVENT_CLASS(local_only_evt,
 	TP_printk(LOCAL_PR_FMT, LOCAL_PR_ARG)
 );
 
-DEFINE_EVENT(local_only_evt, 802154_drv_return_void,
+DEFINE_EVENT(local_only_evt4, 802154_drv_return_void,
 	TP_PROTO(struct ieee802154_local *local),
 	TP_ARGS(local)
 );
@@ -65,12 +65,12 @@ TRACE_EVENT(802154_drv_return_int,
 		  __entry->ret)
 );
 
-DEFINE_EVENT(local_only_evt, 802154_drv_start,
+DEFINE_EVENT(local_only_evt4, 802154_drv_start,
 	TP_PROTO(struct ieee802154_local *local),
 	TP_ARGS(local)
 );
 
-DEFINE_EVENT(local_only_evt, 802154_drv_stop,
+DEFINE_EVENT(local_only_evt4, 802154_drv_stop,
 	TP_PROTO(struct ieee802154_local *local),
 	TP_ARGS(local)
 );
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 02/11] net/mediatek: disambiguate mt76 vs mt7601u trace events
From: Alexei Starovoitov @ 2018-03-27  2:46 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

two trace events defined with the same name and both unused.
They conflict in allyesconfig build. Rename one of them.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 drivers/net/wireless/mediatek/mt7601u/trace.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/wireless/mediatek/mt7601u/trace.h b/drivers/net/wireless/mediatek/mt7601u/trace.h
index 289897300ef0..82c8898b9076 100644
--- a/drivers/net/wireless/mediatek/mt7601u/trace.h
+++ b/drivers/net/wireless/mediatek/mt7601u/trace.h
@@ -34,7 +34,7 @@
 #define REG_PR_FMT	"%04x=%08x"
 #define REG_PR_ARG	__entry->reg, __entry->val
 
-DECLARE_EVENT_CLASS(dev_reg_evt,
+DECLARE_EVENT_CLASS(dev_reg_evtu,
 	TP_PROTO(struct mt7601u_dev *dev, u32 reg, u32 val),
 	TP_ARGS(dev, reg, val),
 	TP_STRUCT__entry(
@@ -51,12 +51,12 @@ DECLARE_EVENT_CLASS(dev_reg_evt,
 	)
 );
 
-DEFINE_EVENT(dev_reg_evt, reg_read,
+DEFINE_EVENT(dev_reg_evtu, reg_read,
 	TP_PROTO(struct mt7601u_dev *dev, u32 reg, u32 val),
 	TP_ARGS(dev, reg, val)
 );
 
-DEFINE_EVENT(dev_reg_evt, reg_write,
+DEFINE_EVENT(dev_reg_evtu, reg_write,
 	TP_PROTO(struct mt7601u_dev *dev, u32 reg, u32 val),
 	TP_ARGS(dev, reg, val)
 );
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 01/11] treewide: remove large struct-pass-by-value from tracepoint arguments
From: Alexei Starovoitov @ 2018-03-27  2:46 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

- fix trace_hfi1_ctxt_info() to pass large struct by reference instead of by value
- convert 'type array[]' tracepoint arguments into 'type *array',
  since compiler will warn that sizeof('type array[]') == sizeof('type *array')
  and later should be used instead

The CAST_TO_U64 macro in the later patch will enforce that tracepoint
arguments can only be integers, pointers, or less than 8 byte structures.
Larger structures should be passed by reference.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 drivers/infiniband/hw/hfi1/file_ops.c    |  2 +-
 drivers/infiniband/hw/hfi1/trace_ctxts.h | 12 ++++++------
 include/trace/events/f2fs.h              |  2 +-
 net/wireless/trace.h                     |  2 +-
 sound/firewire/amdtp-stream-trace.h      |  2 +-
 5 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/infiniband/hw/hfi1/file_ops.c b/drivers/infiniband/hw/hfi1/file_ops.c
index 41fafebe3b0d..da4aa1a95b11 100644
--- a/drivers/infiniband/hw/hfi1/file_ops.c
+++ b/drivers/infiniband/hw/hfi1/file_ops.c
@@ -1153,7 +1153,7 @@ static int get_ctxt_info(struct hfi1_filedata *fd, unsigned long arg, u32 len)
 	cinfo.sdma_ring_size = fd->cq->nentries;
 	cinfo.rcvegr_size = uctxt->egrbufs.rcvtid_size;
 
-	trace_hfi1_ctxt_info(uctxt->dd, uctxt->ctxt, fd->subctxt, cinfo);
+	trace_hfi1_ctxt_info(uctxt->dd, uctxt->ctxt, fd->subctxt, &cinfo);
 	if (copy_to_user((void __user *)arg, &cinfo, len))
 		return -EFAULT;
 
diff --git a/drivers/infiniband/hw/hfi1/trace_ctxts.h b/drivers/infiniband/hw/hfi1/trace_ctxts.h
index 4eb4cc798035..e00c8a7d559c 100644
--- a/drivers/infiniband/hw/hfi1/trace_ctxts.h
+++ b/drivers/infiniband/hw/hfi1/trace_ctxts.h
@@ -106,7 +106,7 @@ TRACE_EVENT(hfi1_uctxtdata,
 TRACE_EVENT(hfi1_ctxt_info,
 	    TP_PROTO(struct hfi1_devdata *dd, unsigned int ctxt,
 		     unsigned int subctxt,
-		     struct hfi1_ctxt_info cinfo),
+		     struct hfi1_ctxt_info *cinfo),
 	    TP_ARGS(dd, ctxt, subctxt, cinfo),
 	    TP_STRUCT__entry(DD_DEV_ENTRY(dd)
 			     __field(unsigned int, ctxt)
@@ -120,11 +120,11 @@ TRACE_EVENT(hfi1_ctxt_info,
 	    TP_fast_assign(DD_DEV_ASSIGN(dd);
 			    __entry->ctxt = ctxt;
 			    __entry->subctxt = subctxt;
-			    __entry->egrtids = cinfo.egrtids;
-			    __entry->rcvhdrq_cnt = cinfo.rcvhdrq_cnt;
-			    __entry->rcvhdrq_size = cinfo.rcvhdrq_entsize;
-			    __entry->sdma_ring_size = cinfo.sdma_ring_size;
-			    __entry->rcvegr_size = cinfo.rcvegr_size;
+			    __entry->egrtids = cinfo->egrtids;
+			    __entry->rcvhdrq_cnt = cinfo->rcvhdrq_cnt;
+			    __entry->rcvhdrq_size = cinfo->rcvhdrq_entsize;
+			    __entry->sdma_ring_size = cinfo->sdma_ring_size;
+			    __entry->rcvegr_size = cinfo->rcvegr_size;
 			    ),
 	    TP_printk("[%s] ctxt %u:%u " CINFO_FMT,
 		      __get_str(dev),
diff --git a/include/trace/events/f2fs.h b/include/trace/events/f2fs.h
index 06c87f9f720c..795698925d20 100644
--- a/include/trace/events/f2fs.h
+++ b/include/trace/events/f2fs.h
@@ -491,7 +491,7 @@ DEFINE_EVENT(f2fs__truncate_node, f2fs_truncate_node,
 
 TRACE_EVENT(f2fs_truncate_partial_nodes,
 
-	TP_PROTO(struct inode *inode, nid_t nid[], int depth, int err),
+	TP_PROTO(struct inode *inode, nid_t *nid, int depth, int err),
 
 	TP_ARGS(inode, nid, depth, err),
 
diff --git a/net/wireless/trace.h b/net/wireless/trace.h
index 5152938b358d..018c81fa72fb 100644
--- a/net/wireless/trace.h
+++ b/net/wireless/trace.h
@@ -3137,7 +3137,7 @@ TRACE_EVENT(rdev_start_radar_detection,
 
 TRACE_EVENT(rdev_set_mcast_rate,
 	TP_PROTO(struct wiphy *wiphy, struct net_device *netdev,
-		 int mcast_rate[NUM_NL80211_BANDS]),
+		 int *mcast_rate),
 	TP_ARGS(wiphy, netdev, mcast_rate),
 	TP_STRUCT__entry(
 		WIPHY_ENTRY
diff --git a/sound/firewire/amdtp-stream-trace.h b/sound/firewire/amdtp-stream-trace.h
index ea0d486652c8..54cdd4ffa9ce 100644
--- a/sound/firewire/amdtp-stream-trace.h
+++ b/sound/firewire/amdtp-stream-trace.h
@@ -14,7 +14,7 @@
 #include <linux/tracepoint.h>
 
 TRACE_EVENT(in_packet,
-	TP_PROTO(const struct amdtp_stream *s, u32 cycles, u32 cip_header[2], unsigned int payload_length, unsigned int index),
+	TP_PROTO(const struct amdtp_stream *s, u32 cycles, u32 *cip_header, unsigned int payload_length, unsigned int index),
 	TP_ARGS(s, cycles, cip_header, payload_length, index),
 	TP_STRUCT__entry(
 		__field(unsigned int, second)
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 07/11] tracepoint: introduce kernel_tracepoint_find_by_name
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

introduce kernel_tracepoint_find_by_name() helper to let bpf core
find tracepoint by name and later attach bpf probe to a tracepoint

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 include/linux/tracepoint.h | 6 ++++++
 kernel/tracepoint.c        | 9 +++++++++
 2 files changed, 15 insertions(+)

diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index c92f4adbc0d7..a00b84473211 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -43,6 +43,12 @@ tracepoint_probe_unregister(struct tracepoint *tp, void *probe, void *data);
 extern void
 for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
 		void *priv);
+#ifdef CONFIG_TRACEPOINTS
+struct tracepoint *kernel_tracepoint_find_by_name(const char *name);
+#else
+static inline struct tracepoint *
+kernel_tracepoint_find_by_name(const char *name) { return NULL; }
+#endif
 
 #ifdef CONFIG_MODULES
 struct tp_module {
diff --git a/kernel/tracepoint.c b/kernel/tracepoint.c
index 671b13457387..e2a9a0391ae2 100644
--- a/kernel/tracepoint.c
+++ b/kernel/tracepoint.c
@@ -528,6 +528,15 @@ void for_each_kernel_tracepoint(void (*fct)(struct tracepoint *tp, void *priv),
 }
 EXPORT_SYMBOL_GPL(for_each_kernel_tracepoint);
 
+struct tracepoint *kernel_tracepoint_find_by_name(const char *name)
+{
+	struct tracepoint * const *tp = __start___tracepoints_ptrs;
+
+	for (; tp < __stop___tracepoints_ptrs; tp++)
+		if (!strcmp((*tp)->name, name))
+			return *tp;
+	return NULL;
+}
 #ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
 
 /* NB: reg/unreg are called while guarded with the tracepoints_mutex */
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 08/11] bpf: introduce BPF_RAW_TRACEPOINT
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

Introduce BPF_PROG_TYPE_RAW_TRACEPOINT bpf program type to access
kernel internal arguments of the tracepoints in their raw form.

>From bpf program point of view the access to the arguments look like:
struct bpf_raw_tracepoint_args {
       __u64 args[0];
};

int bpf_prog(struct bpf_raw_tracepoint_args *ctx)
{
  // program can read args[N] where N depends on tracepoint
  // and statically verified at program load+attach time
}

kprobe+bpf infrastructure allows programs access function arguments.
This feature allows programs access raw tracepoint arguments.

Similar to proposed 'dynamic ftrace events' there are no abi guarantees
to what the tracepoints arguments are and what their meaning is.
The program needs to type cast args properly and use bpf_probe_read()
helper to access struct fields when argument is a pointer.

For every tracepoint __bpf_trace_##call function is prepared.
In assembler it looks like:
(gdb) disassemble __bpf_trace_xdp_exception
Dump of assembler code for function __bpf_trace_xdp_exception:
   0xffffffff81132080 <+0>:     mov    %ecx,%ecx
   0xffffffff81132082 <+2>:     jmpq   0xffffffff811231f0 <bpf_trace_run3>

where

TRACE_EVENT(xdp_exception,
        TP_PROTO(const struct net_device *dev,
                 const struct bpf_prog *xdp, u32 act),

The above assembler snippet is casting 32-bit 'act' field into 'u64'
to pass into bpf_trace_run3(), while 'dev' and 'xdp' args are passed as-is.
All of ~500 of __bpf_trace_*() functions are only 5-10 byte long
and in total this approach adds 7k bytes to .text and 8k bytes
to .rodata since the probe funcs need to appear in kallsyms.
The alternative of having __bpf_trace_##call being global in kallsyms
could have been to keep them static and add another pointer to these
static functions to 'struct trace_event_class' and 'struct trace_event_call',
but keeping them global simplifies implementation and keeps it indepedent
from the tracing side.

Also such approach gives the lowest possible overhead
while calling trace_xdp_exception() from kernel C code and
transitioning into bpf land.
Since tracepoint+bpf are used at speeds of 1M+ events per second
this is very valuable optimization.

Since ftrace and perf side are not involved the new
BPF_RAW_TRACEPOINT_OPEN sys_bpf command is introduced
that returns anon_inode FD of 'bpf-raw-tracepoint' object.

The user space looks like:
// load bpf prog with BPF_PROG_TYPE_RAW_TRACEPOINT type
prog_fd = bpf_prog_load(...);
// receive anon_inode fd for given bpf_raw_tracepoint with prog attached
raw_tp_fd = bpf_raw_tracepoint_open("xdp_exception", prog_fd);

Ctrl-C of tracing daemon or cmdline tool that uses this feature
will automatically detach bpf program, unload it and
unregister tracepoint probe.

On the kernel side for_each_kernel_tracepoint() is used
to find a tracepoint with "xdp_exception" name
(that would be __tracepoint_xdp_exception record)

Then kallsyms_lookup_name() is used to find the addr
of __bpf_trace_xdp_exception() probe function.

And finally tracepoint_probe_register() is used to connect probe
with tracepoint.

Addition of bpf_raw_tracepoint doesn't interfere with ftrace and perf
tracepoint mechanisms. perf_event_open() can be used in parallel
on the same tracepoint.
Multiple bpf_raw_tracepoint_open("xdp_exception", prog_fd) are permitted.
Each with its own bpf program. The kernel will execute
all tracepoint probes and all attached bpf programs.

In the future bpf_raw_tracepoints can be extended with
query/introspection logic.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 include/linux/bpf_types.h    |   1 +
 include/linux/trace_events.h |  37 +++++++++
 include/trace/bpf_probe.h    |  87 ++++++++++++++++++++
 include/trace/define_trace.h |   1 +
 include/uapi/linux/bpf.h     |  11 +++
 kernel/bpf/syscall.c         |  78 ++++++++++++++++++
 kernel/trace/bpf_trace.c     | 188 +++++++++++++++++++++++++++++++++++++++++++
 7 files changed, 403 insertions(+)
 create mode 100644 include/trace/bpf_probe.h

diff --git a/include/linux/bpf_types.h b/include/linux/bpf_types.h
index 5e2e8a49fb21..6d7243bfb0ff 100644
--- a/include/linux/bpf_types.h
+++ b/include/linux/bpf_types.h
@@ -19,6 +19,7 @@ BPF_PROG_TYPE(BPF_PROG_TYPE_SK_MSG, sk_msg)
 BPF_PROG_TYPE(BPF_PROG_TYPE_KPROBE, kprobe)
 BPF_PROG_TYPE(BPF_PROG_TYPE_TRACEPOINT, tracepoint)
 BPF_PROG_TYPE(BPF_PROG_TYPE_PERF_EVENT, perf_event)
+BPF_PROG_TYPE(BPF_PROG_TYPE_RAW_TRACEPOINT, raw_tracepoint)
 #endif
 #ifdef CONFIG_CGROUP_BPF
 BPF_PROG_TYPE(BPF_PROG_TYPE_CGROUP_DEVICE, cg_dev)
diff --git a/include/linux/trace_events.h b/include/linux/trace_events.h
index 8a1442c4e513..e37fcd7505da 100644
--- a/include/linux/trace_events.h
+++ b/include/linux/trace_events.h
@@ -468,6 +468,8 @@ unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx);
 int perf_event_attach_bpf_prog(struct perf_event *event, struct bpf_prog *prog);
 void perf_event_detach_bpf_prog(struct perf_event *event);
 int perf_event_query_prog_array(struct perf_event *event, void __user *info);
+int bpf_probe_register(struct tracepoint *tp, struct bpf_prog *prog);
+int bpf_probe_unregister(struct tracepoint *tp, struct bpf_prog *prog);
 #else
 static inline unsigned int trace_call_bpf(struct trace_event_call *call, void *ctx)
 {
@@ -487,6 +489,14 @@ perf_event_query_prog_array(struct perf_event *event, void __user *info)
 {
 	return -EOPNOTSUPP;
 }
+static inline int bpf_probe_register(struct tracepoint *tp, struct bpf_prog *p)
+{
+	return -EOPNOTSUPP;
+}
+static inline int bpf_probe_unregister(struct tracepoint *tp, struct bpf_prog *p)
+{
+	return -EOPNOTSUPP;
+}
 #endif
 
 enum {
@@ -546,6 +556,33 @@ extern void ftrace_profile_free_filter(struct perf_event *event);
 void perf_trace_buf_update(void *record, u16 type);
 void *perf_trace_buf_alloc(int size, struct pt_regs **regs, int *rctxp);
 
+void bpf_trace_run1(struct bpf_prog *prog, u64 arg1);
+void bpf_trace_run2(struct bpf_prog *prog, u64 arg1, u64 arg2);
+void bpf_trace_run3(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3);
+void bpf_trace_run4(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3, u64 arg4);
+void bpf_trace_run5(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3, u64 arg4, u64 arg5);
+void bpf_trace_run6(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3, u64 arg4, u64 arg5, u64 arg6);
+void bpf_trace_run7(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7);
+void bpf_trace_run8(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
+		    u64 arg8);
+void bpf_trace_run9(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		    u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
+		    u64 arg8, u64 arg9);
+void bpf_trace_run10(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
+		     u64 arg8, u64 arg9, u64 arg10);
+void bpf_trace_run11(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
+		     u64 arg8, u64 arg9, u64 arg10, u64 arg11);
+void bpf_trace_run12(struct bpf_prog *prog, u64 arg1, u64 arg2,
+		     u64 arg3, u64 arg4, u64 arg5, u64 arg6, u64 arg7,
+		     u64 arg8, u64 arg9, u64 arg10, u64 arg11, u64 arg12);
 void perf_trace_run_bpf_submit(void *raw_data, int size, int rctx,
 			       struct trace_event_call *call, u64 count,
 			       struct pt_regs *regs, struct hlist_head *head,
diff --git a/include/trace/bpf_probe.h b/include/trace/bpf_probe.h
new file mode 100644
index 000000000000..d2cc0663e618
--- /dev/null
+++ b/include/trace/bpf_probe.h
@@ -0,0 +1,87 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+
+#undef TRACE_SYSTEM_VAR
+
+#ifdef CONFIG_BPF_EVENTS
+
+#undef __entry
+#define __entry entry
+
+#undef __get_dynamic_array
+#define __get_dynamic_array(field)	\
+		((void *)__entry + (__entry->__data_loc_##field & 0xffff))
+
+#undef __get_dynamic_array_len
+#define __get_dynamic_array_len(field)	\
+		((__entry->__data_loc_##field >> 16) & 0xffff)
+
+#undef __get_str
+#define __get_str(field) ((char *)__get_dynamic_array(field))
+
+#undef __get_bitmask
+#define __get_bitmask(field) (char *)__get_dynamic_array(field)
+
+#undef __perf_count
+#define __perf_count(c)	(c)
+
+#undef __perf_task
+#define __perf_task(t)	(t)
+
+/* cast any integer, pointer, or small struct to u64 */
+#define UINTTYPE(size) \
+	__typeof__(__builtin_choose_expr(size == 1,  (u8)1, \
+		   __builtin_choose_expr(size == 2, (u16)2, \
+		   __builtin_choose_expr(size == 4, (u32)3, \
+		   __builtin_choose_expr(size == 8, (u64)4, \
+					 (void)5)))))
+#define __CAST_TO_U64(x) ({ \
+	typeof(x) __src = (x); \
+	UINTTYPE(sizeof(x)) __dst; \
+	memcpy(&__dst, &__src, sizeof(__dst)); \
+	(u64)__dst; })
+
+#define __CAST1(a,...) __CAST_TO_U64(a)
+#define __CAST2(a,...) __CAST_TO_U64(a), __CAST1(__VA_ARGS__)
+#define __CAST3(a,...) __CAST_TO_U64(a), __CAST2(__VA_ARGS__)
+#define __CAST4(a,...) __CAST_TO_U64(a), __CAST3(__VA_ARGS__)
+#define __CAST5(a,...) __CAST_TO_U64(a), __CAST4(__VA_ARGS__)
+#define __CAST6(a,...) __CAST_TO_U64(a), __CAST5(__VA_ARGS__)
+#define __CAST7(a,...) __CAST_TO_U64(a), __CAST6(__VA_ARGS__)
+#define __CAST8(a,...) __CAST_TO_U64(a), __CAST7(__VA_ARGS__)
+#define __CAST9(a,...) __CAST_TO_U64(a), __CAST8(__VA_ARGS__)
+#define __CAST10(a,...) __CAST_TO_U64(a), __CAST9(__VA_ARGS__)
+#define __CAST11(a,...) __CAST_TO_U64(a), __CAST10(__VA_ARGS__)
+#define __CAST12(a,...) __CAST_TO_U64(a), __CAST11(__VA_ARGS__)
+/* tracepoints with more than 12 arguments will hit build error */
+#define CAST_TO_U64(...) CONCATENATE(__CAST, COUNT_ARGS(__VA_ARGS__))(__VA_ARGS__)
+
+#undef DECLARE_EVENT_CLASS
+#define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print)	\
+/* no 'static' here. The bpf probe functions are global */		\
+notrace void								\
+__bpf_trace_##call(void *__data, proto)					\
+{									\
+	struct bpf_prog *prog = __data;					\
+	\
+	CONCATENATE(bpf_trace_run, COUNT_ARGS(args))(prog, CAST_TO_U64(args));	\
+}
+
+/*
+ * This part is compiled out, it is only here as a build time check
+ * to make sure that if the tracepoint handling changes, the
+ * bpf probe will fail to compile unless it too is updated.
+ */
+#undef DEFINE_EVENT
+#define DEFINE_EVENT(template, call, proto, args)			\
+static inline void bpf_test_probe_##call(void)				\
+{									\
+	check_trace_callback_type_##call(__bpf_trace_##template);	\
+}
+
+
+#undef DEFINE_EVENT_PRINT
+#define DEFINE_EVENT_PRINT(template, name, proto, args, print)	\
+	DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args))
+
+#include TRACE_INCLUDE(TRACE_INCLUDE_FILE)
+#endif /* CONFIG_BPF_EVENTS */
diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h
index 96b22ace9ae7..5f8216bc261f 100644
--- a/include/trace/define_trace.h
+++ b/include/trace/define_trace.h
@@ -95,6 +95,7 @@
 #ifdef TRACEPOINTS_ENABLED
 #include <trace/trace_events.h>
 #include <trace/perf.h>
+#include <trace/bpf_probe.h>
 #endif
 
 #undef TRACE_EVENT
diff --git a/include/uapi/linux/bpf.h b/include/uapi/linux/bpf.h
index 18b7c510c511..1878201c2d77 100644
--- a/include/uapi/linux/bpf.h
+++ b/include/uapi/linux/bpf.h
@@ -94,6 +94,7 @@ enum bpf_cmd {
 	BPF_MAP_GET_FD_BY_ID,
 	BPF_OBJ_GET_INFO_BY_FD,
 	BPF_PROG_QUERY,
+	BPF_RAW_TRACEPOINT_OPEN,
 };
 
 enum bpf_map_type {
@@ -134,6 +135,7 @@ enum bpf_prog_type {
 	BPF_PROG_TYPE_SK_SKB,
 	BPF_PROG_TYPE_CGROUP_DEVICE,
 	BPF_PROG_TYPE_SK_MSG,
+	BPF_PROG_TYPE_RAW_TRACEPOINT,
 };
 
 enum bpf_attach_type {
@@ -344,6 +346,11 @@ union bpf_attr {
 		__aligned_u64	prog_ids;
 		__u32		prog_cnt;
 	} query;
+
+	struct {
+		__u64 name;
+		__u32 prog_fd;
+	} raw_tracepoint;
 } __attribute__((aligned(8)));
 
 /* BPF helper function descriptions:
@@ -1152,4 +1159,8 @@ struct bpf_cgroup_dev_ctx {
 	__u32 minor;
 };
 
+struct bpf_raw_tracepoint_args {
+	__u64 args[0];
+};
+
 #endif /* _UAPI__LINUX_BPF_H__ */
diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
index 3aeb4ea2a93a..7486b450672e 100644
--- a/kernel/bpf/syscall.c
+++ b/kernel/bpf/syscall.c
@@ -1311,6 +1311,81 @@ static int bpf_obj_get(const union bpf_attr *attr)
 				attr->file_flags);
 }
 
+struct bpf_raw_tracepoint {
+	struct tracepoint *tp;
+	struct bpf_prog *prog;
+};
+
+static int bpf_raw_tracepoint_release(struct inode *inode, struct file *filp)
+{
+	struct bpf_raw_tracepoint *raw_tp = filp->private_data;
+
+	if (raw_tp->prog) {
+		bpf_probe_unregister(raw_tp->tp, raw_tp->prog);
+		bpf_prog_put(raw_tp->prog);
+	}
+	kfree(raw_tp);
+	return 0;
+}
+
+static const struct file_operations bpf_raw_tp_fops = {
+	.release	= bpf_raw_tracepoint_release,
+	.read		= bpf_dummy_read,
+	.write		= bpf_dummy_write,
+};
+
+#define BPF_RAW_TRACEPOINT_OPEN_LAST_FIELD raw_tracepoint.prog_fd
+
+static int bpf_raw_tracepoint_open(const union bpf_attr *attr)
+{
+	struct bpf_raw_tracepoint *raw_tp;
+	struct tracepoint *tp;
+	struct bpf_prog *prog;
+	char tp_name[128];
+	int tp_fd, err;
+
+	if (strncpy_from_user(tp_name, u64_to_user_ptr(attr->raw_tracepoint.name),
+			      sizeof(tp_name) - 1) < 0)
+		return -EFAULT;
+	tp_name[sizeof(tp_name) - 1] = 0;
+
+	tp = kernel_tracepoint_find_by_name(tp_name);
+	if (!tp)
+		return -ENOENT;
+
+	raw_tp = kmalloc(sizeof(*raw_tp), GFP_USER | __GFP_ZERO);
+	if (!raw_tp)
+		return -ENOMEM;
+	raw_tp->tp = tp;
+
+	prog = bpf_prog_get_type(attr->raw_tracepoint.prog_fd,
+				 BPF_PROG_TYPE_RAW_TRACEPOINT);
+	if (IS_ERR(prog)) {
+		err = PTR_ERR(prog);
+		goto out_free_tp;
+	}
+
+	err = bpf_probe_register(raw_tp->tp, prog);
+	if (err)
+		goto out_put_prog;
+
+	raw_tp->prog = prog;
+	tp_fd = anon_inode_getfd("bpf-raw-tracepoint", &bpf_raw_tp_fops, raw_tp,
+				 O_CLOEXEC);
+	if (tp_fd < 0) {
+		bpf_probe_unregister(raw_tp->tp, prog);
+		err = tp_fd;
+		goto out_put_prog;
+	}
+	return tp_fd;
+
+out_put_prog:
+	bpf_prog_put(prog);
+out_free_tp:
+	kfree(raw_tp);
+	return err;
+}
+
 #ifdef CONFIG_CGROUP_BPF
 
 #define BPF_PROG_ATTACH_LAST_FIELD attach_flags
@@ -1921,6 +1996,9 @@ SYSCALL_DEFINE3(bpf, int, cmd, union bpf_attr __user *, uattr, unsigned int, siz
 	case BPF_OBJ_GET_INFO_BY_FD:
 		err = bpf_obj_get_info_by_fd(&attr, uattr);
 		break;
+	case BPF_RAW_TRACEPOINT_OPEN:
+		err = bpf_raw_tracepoint_open(&attr);
+		break;
 	default:
 		err = -EINVAL;
 		break;
diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c
index c634e093951f..00e86aa11360 100644
--- a/kernel/trace/bpf_trace.c
+++ b/kernel/trace/bpf_trace.c
@@ -723,6 +723,86 @@ const struct bpf_verifier_ops tracepoint_verifier_ops = {
 const struct bpf_prog_ops tracepoint_prog_ops = {
 };
 
+/*
+ * bpf_raw_tp_regs are separate from bpf_pt_regs used from skb/xdp
+ * to avoid potential recursive reuse issue when/if tracepoints are added
+ * inside bpf_*_event_output and/or bpf_get_stack_id
+ */
+static DEFINE_PER_CPU(struct pt_regs, bpf_raw_tp_regs);
+BPF_CALL_5(bpf_perf_event_output_raw_tp, struct bpf_raw_tracepoint_args *, args,
+	   struct bpf_map *, map, u64, flags, void *, data, u64, size)
+{
+	struct pt_regs *regs = this_cpu_ptr(&bpf_raw_tp_regs);
+
+	perf_fetch_caller_regs(regs);
+	return ____bpf_perf_event_output(regs, map, flags, data, size);
+}
+
+static const struct bpf_func_proto bpf_perf_event_output_proto_raw_tp = {
+	.func		= bpf_perf_event_output_raw_tp,
+	.gpl_only	= true,
+	.ret_type	= RET_INTEGER,
+	.arg1_type	= ARG_PTR_TO_CTX,
+	.arg2_type	= ARG_CONST_MAP_PTR,
+	.arg3_type	= ARG_ANYTHING,
+	.arg4_type	= ARG_PTR_TO_MEM,
+	.arg5_type	= ARG_CONST_SIZE_OR_ZERO,
+};
+
+BPF_CALL_3(bpf_get_stackid_raw_tp, struct bpf_raw_tracepoint_args *, args,
+	   struct bpf_map *, map, u64, flags)
+{
+	struct pt_regs *regs = this_cpu_ptr(&bpf_raw_tp_regs);
+
+	perf_fetch_caller_regs(regs);
+	/* similar to bpf_perf_event_output_tp, but pt_regs fetched differently */
+	return bpf_get_stackid((unsigned long) regs, (unsigned long) map,
+			       flags, 0, 0);
+}
+
+static const struct bpf_func_proto bpf_get_stackid_proto_raw_tp = {
+	.func		= bpf_get_stackid_raw_tp,
+	.gpl_only	= true,
+	.ret_type	= RET_INTEGER,
+	.arg1_type	= ARG_PTR_TO_CTX,
+	.arg2_type	= ARG_CONST_MAP_PTR,
+	.arg3_type	= ARG_ANYTHING,
+};
+
+static const struct bpf_func_proto *raw_tp_prog_func_proto(enum bpf_func_id func_id)
+{
+	switch (func_id) {
+	case BPF_FUNC_perf_event_output:
+		return &bpf_perf_event_output_proto_raw_tp;
+	case BPF_FUNC_get_stackid:
+		return &bpf_get_stackid_proto_raw_tp;
+	default:
+		return tracing_func_proto(func_id);
+	}
+}
+
+static bool raw_tp_prog_is_valid_access(int off, int size,
+					enum bpf_access_type type,
+					struct bpf_insn_access_aux *info)
+{
+	/* largest tracepoint in the kernel has 12 args */
+	if (off < 0 || off >= sizeof(__u64) * 12)
+		return false;
+	if (type != BPF_READ)
+		return false;
+	if (off % size != 0)
+		return false;
+	return true;
+}
+
+const struct bpf_verifier_ops raw_tracepoint_verifier_ops = {
+	.get_func_proto  = raw_tp_prog_func_proto,
+	.is_valid_access = raw_tp_prog_is_valid_access,
+};
+
+const struct bpf_prog_ops raw_tracepoint_prog_ops = {
+};
+
 static bool pe_prog_is_valid_access(int off, int size, enum bpf_access_type type,
 				    struct bpf_insn_access_aux *info)
 {
@@ -896,3 +976,111 @@ int perf_event_query_prog_array(struct perf_event *event, void __user *info)
 
 	return ret;
 }
+
+static __always_inline
+void __bpf_trace_run(struct bpf_prog *prog, u64 *args)
+{
+	rcu_read_lock();
+	preempt_disable();
+	(void) BPF_PROG_RUN(prog, args);
+	preempt_enable();
+	rcu_read_unlock();
+}
+
+#define UNPACK(...)			__VA_ARGS__
+#define REPEAT_1(FN, DL, X, ...)	FN(X)
+#define REPEAT_2(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_1(FN, DL, __VA_ARGS__)
+#define REPEAT_3(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_2(FN, DL, __VA_ARGS__)
+#define REPEAT_4(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_3(FN, DL, __VA_ARGS__)
+#define REPEAT_5(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_4(FN, DL, __VA_ARGS__)
+#define REPEAT_6(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_5(FN, DL, __VA_ARGS__)
+#define REPEAT_7(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_6(FN, DL, __VA_ARGS__)
+#define REPEAT_8(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_7(FN, DL, __VA_ARGS__)
+#define REPEAT_9(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_8(FN, DL, __VA_ARGS__)
+#define REPEAT_10(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_9(FN, DL, __VA_ARGS__)
+#define REPEAT_11(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_10(FN, DL, __VA_ARGS__)
+#define REPEAT_12(FN, DL, X, ...)	FN(X) UNPACK DL REPEAT_11(FN, DL, __VA_ARGS__)
+#define REPEAT(X, FN, DL, ...)		REPEAT_##X(FN, DL, __VA_ARGS__)
+
+#define SARG(X)		u64 arg##X
+#define COPY(X)		args[X] = arg##X
+
+#define __DL_COM	(,)
+#define __DL_SEM	(;)
+
+#define __SEQ_0_11	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11
+
+#define BPF_TRACE_DEFN_x(x)						\
+	void bpf_trace_run##x(struct bpf_prog *prog,			\
+			      REPEAT(x, SARG, __DL_COM, __SEQ_0_11))	\
+	{								\
+		u64 args[x];						\
+		REPEAT(x, COPY, __DL_SEM, __SEQ_0_11);			\
+		__bpf_trace_run(prog, args);				\
+	}								\
+	EXPORT_SYMBOL_GPL(bpf_trace_run##x)
+BPF_TRACE_DEFN_x(1);
+BPF_TRACE_DEFN_x(2);
+BPF_TRACE_DEFN_x(3);
+BPF_TRACE_DEFN_x(4);
+BPF_TRACE_DEFN_x(5);
+BPF_TRACE_DEFN_x(6);
+BPF_TRACE_DEFN_x(7);
+BPF_TRACE_DEFN_x(8);
+BPF_TRACE_DEFN_x(9);
+BPF_TRACE_DEFN_x(10);
+BPF_TRACE_DEFN_x(11);
+BPF_TRACE_DEFN_x(12);
+
+static int __bpf_probe_register(struct tracepoint *tp, struct bpf_prog *prog)
+{
+	unsigned long addr;
+	char buf[128];
+
+	/*
+	 * check that program doesn't access arguments beyond what's
+	 * available in this tracepoint
+	 */
+	if (prog->aux->max_ctx_offset > tp->num_args * sizeof(u64))
+		return -EINVAL;
+
+	snprintf(buf, sizeof(buf), "__bpf_trace_%s", tp->name);
+	addr = kallsyms_lookup_name(buf);
+	if (!addr)
+		return -ENOENT;
+
+	return tracepoint_probe_register(tp, (void *)addr, prog);
+}
+
+int bpf_probe_register(struct tracepoint *tp, struct bpf_prog *prog)
+{
+	int err;
+
+	mutex_lock(&bpf_event_mutex);
+	err = __bpf_probe_register(tp, prog);
+	mutex_unlock(&bpf_event_mutex);
+	return err;
+}
+
+static int __bpf_probe_unregister(struct tracepoint *tp, struct bpf_prog *prog)
+{
+	unsigned long addr;
+	char buf[128];
+
+	snprintf(buf, sizeof(buf), "__bpf_trace_%s", tp->name);
+	addr = kallsyms_lookup_name(buf);
+	if (!addr)
+		return -ENOENT;
+
+	return tracepoint_probe_unregister(tp, (void *)addr, prog);
+}
+
+int bpf_probe_unregister(struct tracepoint *tp, struct bpf_prog *prog)
+{
+	int err;
+
+	mutex_lock(&bpf_event_mutex);
+	err = __bpf_probe_unregister(tp, prog);
+	mutex_unlock(&bpf_event_mutex);
+	return err;
+}
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 10/11] samples/bpf: raw tracepoint test
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

add empty raw_tracepoint bpf program to test overhead similar
to kprobe and traditional tracepoint tests

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 samples/bpf/Makefile                    |  1 +
 samples/bpf/bpf_load.c                  | 14 ++++++++++++++
 samples/bpf/test_overhead_raw_tp_kern.c | 17 +++++++++++++++++
 samples/bpf/test_overhead_user.c        | 12 ++++++++++++
 4 files changed, 44 insertions(+)
 create mode 100644 samples/bpf/test_overhead_raw_tp_kern.c

diff --git a/samples/bpf/Makefile b/samples/bpf/Makefile
index 2c2a587e0942..4d6a6edd4bf6 100644
--- a/samples/bpf/Makefile
+++ b/samples/bpf/Makefile
@@ -119,6 +119,7 @@ always += offwaketime_kern.o
 always += spintest_kern.o
 always += map_perf_test_kern.o
 always += test_overhead_tp_kern.o
+always += test_overhead_raw_tp_kern.o
 always += test_overhead_kprobe_kern.o
 always += parse_varlen.o parse_simple.o parse_ldabs.o
 always += test_cgrp2_tc_kern.o
diff --git a/samples/bpf/bpf_load.c b/samples/bpf/bpf_load.c
index b1a310c3ae89..bebe4188b4b3 100644
--- a/samples/bpf/bpf_load.c
+++ b/samples/bpf/bpf_load.c
@@ -61,6 +61,7 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
 	bool is_kprobe = strncmp(event, "kprobe/", 7) == 0;
 	bool is_kretprobe = strncmp(event, "kretprobe/", 10) == 0;
 	bool is_tracepoint = strncmp(event, "tracepoint/", 11) == 0;
+	bool is_raw_tracepoint = strncmp(event, "raw_tracepoint/", 15) == 0;
 	bool is_xdp = strncmp(event, "xdp", 3) == 0;
 	bool is_perf_event = strncmp(event, "perf_event", 10) == 0;
 	bool is_cgroup_skb = strncmp(event, "cgroup/skb", 10) == 0;
@@ -85,6 +86,8 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
 		prog_type = BPF_PROG_TYPE_KPROBE;
 	} else if (is_tracepoint) {
 		prog_type = BPF_PROG_TYPE_TRACEPOINT;
+	} else if (is_raw_tracepoint) {
+		prog_type = BPF_PROG_TYPE_RAW_TRACEPOINT;
 	} else if (is_xdp) {
 		prog_type = BPF_PROG_TYPE_XDP;
 	} else if (is_perf_event) {
@@ -131,6 +134,16 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
 		return populate_prog_array(event, fd);
 	}
 
+	if (is_raw_tracepoint) {
+		efd = bpf_raw_tracepoint_open(event + 15, fd);
+		if (efd < 0) {
+			printf("tracepoint %s %s\n", event + 15, strerror(errno));
+			return -1;
+		}
+		event_fd[prog_cnt - 1] = efd;
+		return 0;
+	}
+
 	if (is_kprobe || is_kretprobe) {
 		if (is_kprobe)
 			event += 7;
@@ -587,6 +600,7 @@ static int do_load_bpf_file(const char *path, fixup_map_cb fixup_map)
 		if (memcmp(shname, "kprobe/", 7) == 0 ||
 		    memcmp(shname, "kretprobe/", 10) == 0 ||
 		    memcmp(shname, "tracepoint/", 11) == 0 ||
+		    memcmp(shname, "raw_tracepoint/", 15) == 0 ||
 		    memcmp(shname, "xdp", 3) == 0 ||
 		    memcmp(shname, "perf_event", 10) == 0 ||
 		    memcmp(shname, "socket", 6) == 0 ||
diff --git a/samples/bpf/test_overhead_raw_tp_kern.c b/samples/bpf/test_overhead_raw_tp_kern.c
new file mode 100644
index 000000000000..d2af8bc1c805
--- /dev/null
+++ b/samples/bpf/test_overhead_raw_tp_kern.c
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0
+/* Copyright (c) 2018 Facebook */
+#include <uapi/linux/bpf.h>
+#include "bpf_helpers.h"
+
+SEC("raw_tracepoint/task_rename")
+int prog(struct bpf_raw_tracepoint_args *ctx)
+{
+	return 0;
+}
+
+SEC("raw_tracepoint/urandom_read")
+int prog2(struct bpf_raw_tracepoint_args *ctx)
+{
+	return 0;
+}
+char _license[] SEC("license") = "GPL";
diff --git a/samples/bpf/test_overhead_user.c b/samples/bpf/test_overhead_user.c
index d291167fd3c7..e1d35e07a10e 100644
--- a/samples/bpf/test_overhead_user.c
+++ b/samples/bpf/test_overhead_user.c
@@ -158,5 +158,17 @@ int main(int argc, char **argv)
 		unload_progs();
 	}
 
+	if (test_flags & 0xC0) {
+		snprintf(filename, sizeof(filename),
+			 "%s_raw_tp_kern.o", argv[0]);
+		if (load_bpf_file(filename)) {
+			printf("%s", bpf_log_buf);
+			return 1;
+		}
+		printf("w/RAW_TRACEPOINT\n");
+		run_perf_test(num_cpu, test_flags >> 6);
+		unload_progs();
+	}
+
 	return 0;
 }
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 00/11] bpf, tracing: introduce bpf raw tracepoints
From: Alexei Starovoitov @ 2018-03-27  2:46 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api

From: Alexei Starovoitov <ast@kernel.org>

v5->v6:
- avoid changing semantics of for_each_kernel_tracepoint() function, instead
  introduce kernel_tracepoint_find_by_name() helper

v4->v5:
- adopted Daniel's fancy REPEAT macro in bpf_trace.c in patch 8
  
v3->v4:
- adopted Linus's CAST_TO_U64 macro to cast any integer, pointer, or small
  struct to u64. That nicely reduced the size of patch 1

v2->v3:
- with Linus's suggestion introduced generic COUNT_ARGS and CONCATENATE macros
  (or rather moved them from apparmor)
  that cleaned up patches 6 and 8
- added patch 4 to refactor trace_iwlwifi_dev_ucode_error() from 17 args to 4
  Now any tracepoint with >12 args will have build error

v1->v2:
- simplified api by combing bpf_raw_tp_open(name) + bpf_attach(prog_fd) into
  bpf_raw_tp_open(name, prog_fd) as suggested by Daniel.
  That simplifies bpf_detach as well which is now simple close() of fd.
- fixed memory leak in error path which was spotted by Daniel.
- fixed bpf_get_stackid(), bpf_perf_event_output() called from raw tracepoints
- added more tests
- fixed allyesconfig build caught by buildbot

v1:
This patch set is a different way to address the pressing need to access
task_struct pointers in sched tracepoints from bpf programs.

The first approach simply added these pointers to sched tracepoints:
https://lkml.org/lkml/2017/12/14/753
which Peter nacked.
Few options were discussed and eventually the discussion converged on
doing bpf specific tracepoint_probe_register() probe functions.
Details here:
https://lkml.org/lkml/2017/12/20/929

Patch 1 is kernel wide cleanup of pass-struct-by-value into
pass-struct-by-reference into tracepoints.

Patches 2 and 3 are minor cleanups to address allyesconfig build

Patch 4 refactor trace_iwlwifi_dev_ucode_error from 17 to 4 args

Patch 5 introduces COUNT_ARGS macro

Patch 6 minor prep work to expose number of arguments passed
into tracepoints.

Patch 7 kernel_tracepoint_find_by_name() helper

Patch 8 introduces BPF_RAW_TRACEPOINT api.
the auto-cleanup and multiple concurrent users are must have
features of tracing api. For bpf raw tracepoints it looks like:
  // load bpf prog with BPF_PROG_TYPE_RAW_TRACEPOINT type
  prog_fd = bpf_prog_load(...);

  // receive anon_inode fd for given bpf_raw_tracepoint
  // and attach bpf program to it
  raw_tp_fd = bpf_raw_tracepoint_open("xdp_exception", prog_fd);

Ctrl-C of tracing daemon or cmdline tool will automatically
detach bpf program, unload it and unregister tracepoint probe.
More details in patch 8.

Patch 9 - trivial support in libbpf
Patches 10, 11 - user space tests

samples/bpf/test_overhead performance on 1 cpu:

tracepoint    base  kprobe+bpf tracepoint+bpf raw_tracepoint+bpf
task_rename   1.1M   769K        947K            1.0M
urandom_read  789K   697K        750K            755K

Alexei Starovoitov (11):
  treewide: remove large struct-pass-by-value from tracepoint arguments
  net/mediatek: disambiguate mt76 vs mt7601u trace events
  net/mac802154: disambiguate mac80215 vs mac802154 trace events
  net/wireless/iwlwifi: fix iwlwifi_dev_ucode_error tracepoint
  macro: introduce COUNT_ARGS() macro
  tracepoint: compute num_args at build time
  tracepoint: introduce kernel_tracepoint_find_by_name
  bpf: introduce BPF_RAW_TRACEPOINT
  libbpf: add bpf_raw_tracepoint_open helper
  samples/bpf: raw tracepoint test
  selftests/bpf: test for bpf_get_stackid() from raw tracepoints

 drivers/infiniband/hw/hfi1/file_ops.c              |   2 +-
 drivers/infiniband/hw/hfi1/trace_ctxts.h           |  12 +-
 drivers/net/wireless/intel/iwlwifi/dvm/main.c      |   7 +-
 .../wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h  |  39 ++---
 drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c  |   1 +
 drivers/net/wireless/intel/iwlwifi/mvm/utils.c     |   7 +-
 drivers/net/wireless/mediatek/mt7601u/trace.h      |   6 +-
 include/linux/bpf_types.h                          |   1 +
 include/linux/kernel.h                             |   7 +
 include/linux/trace_events.h                       |  37 ++++
 include/linux/tracepoint-defs.h                    |   1 +
 include/linux/tracepoint.h                         |  18 +-
 include/trace/bpf_probe.h                          |  87 ++++++++++
 include/trace/define_trace.h                       |  15 +-
 include/trace/events/f2fs.h                        |   2 +-
 include/uapi/linux/bpf.h                           |  11 ++
 kernel/bpf/syscall.c                               |  78 +++++++++
 kernel/trace/bpf_trace.c                           | 188 +++++++++++++++++++++
 kernel/tracepoint.c                                |   9 +
 net/mac802154/trace.h                              |   8 +-
 net/wireless/trace.h                               |   2 +-
 samples/bpf/Makefile                               |   1 +
 samples/bpf/bpf_load.c                             |  14 ++
 samples/bpf/test_overhead_raw_tp_kern.c            |  17 ++
 samples/bpf/test_overhead_user.c                   |  12 ++
 security/apparmor/include/path.h                   |   7 +-
 sound/firewire/amdtp-stream-trace.h                |   2 +-
 tools/include/uapi/linux/bpf.h                     |  11 ++
 tools/lib/bpf/bpf.c                                |  11 ++
 tools/lib/bpf/bpf.h                                |   1 +
 tools/testing/selftests/bpf/test_progs.c           |  91 +++++++---
 31 files changed, 615 insertions(+), 90 deletions(-)
 create mode 100644 include/trace/bpf_probe.h
 create mode 100644 samples/bpf/test_overhead_raw_tp_kern.c

-- 
2.9.5

^ permalink raw reply

* [PATCH v6 bpf-next 05/11] macro: introduce COUNT_ARGS() macro
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

move COUNT_ARGS() macro from apparmor to generic header and extend it
to count till twelve.

COUNT() was an alternative name for this logic, but it's used for
different purpose in many other places.

Similarly for CONCATENATE() macro.

Suggested-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 include/linux/kernel.h           | 7 +++++++
 security/apparmor/include/path.h | 7 +------
 2 files changed, 8 insertions(+), 6 deletions(-)

diff --git a/include/linux/kernel.h b/include/linux/kernel.h
index 3fd291503576..293fa0677fba 100644
--- a/include/linux/kernel.h
+++ b/include/linux/kernel.h
@@ -919,6 +919,13 @@ static inline void ftrace_dump(enum ftrace_dump_mode oops_dump_mode) { }
 #define swap(a, b) \
 	do { typeof(a) __tmp = (a); (a) = (b); (b) = __tmp; } while (0)
 
+/* This counts to 12. Any more, it will return 13th argument. */
+#define __COUNT_ARGS(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _n, X...) _n
+#define COUNT_ARGS(X...) __COUNT_ARGS(, ##X, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
+
+#define __CONCAT(a, b) a ## b
+#define CONCATENATE(a, b) __CONCAT(a, b)
+
 /**
  * container_of - cast a member of a structure out to the containing structure
  * @ptr:	the pointer to the member.
diff --git a/security/apparmor/include/path.h b/security/apparmor/include/path.h
index 05fb3305671e..e042b994f2b8 100644
--- a/security/apparmor/include/path.h
+++ b/security/apparmor/include/path.h
@@ -43,15 +43,10 @@ struct aa_buffers {
 
 DECLARE_PER_CPU(struct aa_buffers, aa_buffers);
 
-#define COUNT_ARGS(X...) COUNT_ARGS_HELPER(, ##X, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
-#define COUNT_ARGS_HELPER(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, n, X...) n
-#define CONCAT(X, Y) X ## Y
-#define CONCAT_AFTER(X, Y) CONCAT(X, Y)
-
 #define ASSIGN(FN, X, N) ((X) = FN(N))
 #define EVAL1(FN, X) ASSIGN(FN, X, 0) /*X = FN(0)*/
 #define EVAL2(FN, X, Y...) do { ASSIGN(FN, X, 1);  EVAL1(FN, Y); } while (0)
-#define EVAL(FN, X...) CONCAT_AFTER(EVAL, COUNT_ARGS(X))(FN, X)
+#define EVAL(FN, X...) CONCATENATE(EVAL, COUNT_ARGS(X))(FN, X)
 
 #define for_each_cpu_buffer(I) for ((I) = 0; (I) < MAX_PATH_BUFFERS; (I)++)
 
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 06/11] tracepoint: compute num_args at build time
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

compute number of arguments passed into tracepoint
at compile time and store it as part of 'struct tracepoint'.
The number is necessary to check safety of bpf program access that
is coming in subsequent patch.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 include/linux/tracepoint-defs.h |  1 +
 include/linux/tracepoint.h      | 12 ++++++------
 include/trace/define_trace.h    | 14 +++++++-------
 3 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/include/linux/tracepoint-defs.h b/include/linux/tracepoint-defs.h
index 64ed7064f1fa..39a283c61c51 100644
--- a/include/linux/tracepoint-defs.h
+++ b/include/linux/tracepoint-defs.h
@@ -33,6 +33,7 @@ struct tracepoint {
 	int (*regfunc)(void);
 	void (*unregfunc)(void);
 	struct tracepoint_func __rcu *funcs;
+	u32 num_args;
 };
 
 #endif
diff --git a/include/linux/tracepoint.h b/include/linux/tracepoint.h
index c94f466d57ef..c92f4adbc0d7 100644
--- a/include/linux/tracepoint.h
+++ b/include/linux/tracepoint.h
@@ -230,18 +230,18 @@ extern void syscall_unregfunc(void);
  * structures, so we create an array of pointers that will be used for iteration
  * on the tracepoints.
  */
-#define DEFINE_TRACE_FN(name, reg, unreg)				 \
+#define DEFINE_TRACE_FN(name, reg, unreg, num_args)			 \
 	static const char __tpstrtab_##name[]				 \
 	__attribute__((section("__tracepoints_strings"))) = #name;	 \
 	struct tracepoint __tracepoint_##name				 \
 	__attribute__((section("__tracepoints"))) =			 \
-		{ __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL };\
+		{ __tpstrtab_##name, STATIC_KEY_INIT_FALSE, reg, unreg, NULL, num_args };\
 	static struct tracepoint * const __tracepoint_ptr_##name __used	 \
 	__attribute__((section("__tracepoints_ptrs"))) =		 \
 		&__tracepoint_##name;
 
-#define DEFINE_TRACE(name)						\
-	DEFINE_TRACE_FN(name, NULL, NULL);
+#define DEFINE_TRACE(name, num_args)					\
+	DEFINE_TRACE_FN(name, NULL, NULL, num_args);
 
 #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)				\
 	EXPORT_SYMBOL_GPL(__tracepoint_##name)
@@ -275,8 +275,8 @@ extern void syscall_unregfunc(void);
 		return false;						\
 	}
 
-#define DEFINE_TRACE_FN(name, reg, unreg)
-#define DEFINE_TRACE(name)
+#define DEFINE_TRACE_FN(name, reg, unreg, num_args)
+#define DEFINE_TRACE(name, num_args)
 #define EXPORT_TRACEPOINT_SYMBOL_GPL(name)
 #define EXPORT_TRACEPOINT_SYMBOL(name)
 
diff --git a/include/trace/define_trace.h b/include/trace/define_trace.h
index d9e3d4aa3f6e..96b22ace9ae7 100644
--- a/include/trace/define_trace.h
+++ b/include/trace/define_trace.h
@@ -25,7 +25,7 @@
 
 #undef TRACE_EVENT
 #define TRACE_EVENT(name, proto, args, tstruct, assign, print)	\
-	DEFINE_TRACE(name)
+	DEFINE_TRACE(name, COUNT_ARGS(args))
 
 #undef TRACE_EVENT_CONDITION
 #define TRACE_EVENT_CONDITION(name, proto, args, cond, tstruct, assign, print) \
@@ -39,24 +39,24 @@
 #undef TRACE_EVENT_FN
 #define TRACE_EVENT_FN(name, proto, args, tstruct,		\
 		assign, print, reg, unreg)			\
-	DEFINE_TRACE_FN(name, reg, unreg)
+	DEFINE_TRACE_FN(name, reg, unreg, COUNT_ARGS(args))
 
 #undef TRACE_EVENT_FN_COND
 #define TRACE_EVENT_FN_COND(name, proto, args, cond, tstruct,		\
 		assign, print, reg, unreg)			\
-	DEFINE_TRACE_FN(name, reg, unreg)
+	DEFINE_TRACE_FN(name, reg, unreg, COUNT_ARGS(args))
 
 #undef DEFINE_EVENT
 #define DEFINE_EVENT(template, name, proto, args) \
-	DEFINE_TRACE(name)
+	DEFINE_TRACE(name, COUNT_ARGS(args))
 
 #undef DEFINE_EVENT_FN
 #define DEFINE_EVENT_FN(template, name, proto, args, reg, unreg) \
-	DEFINE_TRACE_FN(name, reg, unreg)
+	DEFINE_TRACE_FN(name, reg, unreg, COUNT_ARGS(args))
 
 #undef DEFINE_EVENT_PRINT
 #define DEFINE_EVENT_PRINT(template, name, proto, args, print)	\
-	DEFINE_TRACE(name)
+	DEFINE_TRACE(name, COUNT_ARGS(args))
 
 #undef DEFINE_EVENT_CONDITION
 #define DEFINE_EVENT_CONDITION(template, name, proto, args, cond) \
@@ -64,7 +64,7 @@
 
 #undef DECLARE_TRACE
 #define DECLARE_TRACE(name, proto, args)	\
-	DEFINE_TRACE(name)
+	DEFINE_TRACE(name, COUNT_ARGS(args))
 
 #undef TRACE_INCLUDE
 #undef __TRACE_INCLUDE
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 04/11] net/wireless/iwlwifi: fix iwlwifi_dev_ucode_error tracepoint
From: Alexei Starovoitov @ 2018-03-27  2:46 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

fix iwlwifi_dev_ucode_error tracepoint to pass pointer to a table
instead of all 17 arguments by value.
dvm/main.c and mvm/utils.c have 'struct iwl_error_event_table'
defined with very similar yet subtly different fields and offsets.
tracepoint is still common and using definition of 'struct iwl_error_event_table'
from dvm/commands.h while copying fields.
Long term this tracepoint probably should be split into two.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 drivers/net/wireless/intel/iwlwifi/dvm/main.c      |  7 +---
 .../wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h  | 39 ++++++++++------------
 drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c  |  1 +
 drivers/net/wireless/intel/iwlwifi/mvm/utils.c     |  7 +---
 4 files changed, 21 insertions(+), 33 deletions(-)

diff --git a/drivers/net/wireless/intel/iwlwifi/dvm/main.c b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
index d11d72615de2..e68254e12764 100644
--- a/drivers/net/wireless/intel/iwlwifi/dvm/main.c
+++ b/drivers/net/wireless/intel/iwlwifi/dvm/main.c
@@ -1651,12 +1651,7 @@ static void iwl_dump_nic_error_log(struct iwl_priv *priv)
 			priv->status, table.valid);
 	}
 
-	trace_iwlwifi_dev_ucode_error(trans->dev, table.error_id, table.tsf_low,
-				      table.data1, table.data2, table.line,
-				      table.blink2, table.ilink1, table.ilink2,
-				      table.bcon_time, table.gp1, table.gp2,
-				      table.gp3, table.ucode_ver, table.hw_ver,
-				      0, table.brd_ver);
+	trace_iwlwifi_dev_ucode_error(trans->dev, &table, 0, table.brd_ver);
 	IWL_ERR(priv, "0x%08X | %-28s\n", table.error_id,
 		desc_lookup(table.error_id));
 	IWL_ERR(priv, "0x%08X | uPc\n", table.pc);
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h
index 9518a82f44c2..27e3e4e96aa2 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace-iwlwifi.h
@@ -126,14 +126,11 @@ TRACE_EVENT(iwlwifi_dev_tx,
 		  __entry->framelen, __entry->skbaddr)
 );
 
+struct iwl_error_event_table;
 TRACE_EVENT(iwlwifi_dev_ucode_error,
-	TP_PROTO(const struct device *dev, u32 desc, u32 tsf_low,
-		 u32 data1, u32 data2, u32 line, u32 blink2, u32 ilink1,
-		 u32 ilink2, u32 bcon_time, u32 gp1, u32 gp2, u32 rev_type,
-		 u32 major, u32 minor, u32 hw_ver, u32 brd_ver),
-	TP_ARGS(dev, desc, tsf_low, data1, data2, line,
-		 blink2, ilink1, ilink2, bcon_time, gp1, gp2,
-		 rev_type, major, minor, hw_ver, brd_ver),
+	TP_PROTO(const struct device *dev, const struct iwl_error_event_table *table,
+		 u32 hw_ver, u32 brd_ver),
+	TP_ARGS(dev, table, hw_ver, brd_ver),
 	TP_STRUCT__entry(
 		DEV_ENTRY
 		__field(u32, desc)
@@ -155,20 +152,20 @@ TRACE_EVENT(iwlwifi_dev_ucode_error,
 	),
 	TP_fast_assign(
 		DEV_ASSIGN;
-		__entry->desc = desc;
-		__entry->tsf_low = tsf_low;
-		__entry->data1 = data1;
-		__entry->data2 = data2;
-		__entry->line = line;
-		__entry->blink2 = blink2;
-		__entry->ilink1 = ilink1;
-		__entry->ilink2 = ilink2;
-		__entry->bcon_time = bcon_time;
-		__entry->gp1 = gp1;
-		__entry->gp2 = gp2;
-		__entry->rev_type = rev_type;
-		__entry->major = major;
-		__entry->minor = minor;
+		__entry->desc = table->error_id;
+		__entry->tsf_low = table->tsf_low;
+		__entry->data1 = table->data1;
+		__entry->data2 = table->data2;
+		__entry->line = table->line;
+		__entry->blink2 = table->blink2;
+		__entry->ilink1 = table->ilink1;
+		__entry->ilink2 = table->ilink2;
+		__entry->bcon_time = table->bcon_time;
+		__entry->gp1 = table->gp1;
+		__entry->gp2 = table->gp2;
+		__entry->rev_type = table->gp3;
+		__entry->major = table->ucode_ver;
+		__entry->minor = table->hw_ver;
 		__entry->hw_ver = hw_ver;
 		__entry->brd_ver = brd_ver;
 	),
diff --git a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c
index 50510fb6ab8c..6aa719865a58 100644
--- a/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c
+++ b/drivers/net/wireless/intel/iwlwifi/iwl-devtrace.c
@@ -30,6 +30,7 @@
 #ifndef __CHECKER__
 #include "iwl-trans.h"
 
+#include "dvm/commands.h"
 #define CREATE_TRACE_POINTS
 #include "iwl-devtrace.h"
 
diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
index d65e1db7c097..5442ead876eb 100644
--- a/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
+++ b/drivers/net/wireless/intel/iwlwifi/mvm/utils.c
@@ -549,12 +549,7 @@ static void iwl_mvm_dump_lmac_error_log(struct iwl_mvm *mvm, u32 base)
 
 	IWL_ERR(mvm, "Loaded firmware version: %s\n", mvm->fw->fw_version);
 
-	trace_iwlwifi_dev_ucode_error(trans->dev, table.error_id, table.tsf_low,
-				      table.data1, table.data2, table.data3,
-				      table.blink2, table.ilink1,
-				      table.ilink2, table.bcon_time, table.gp1,
-				      table.gp2, table.fw_rev_type, table.major,
-				      table.minor, table.hw_ver, table.brd_ver);
+	trace_iwlwifi_dev_ucode_error(trans->dev, &table, table.hw_ver, table.brd_ver);
 	IWL_ERR(mvm, "0x%08X | %-28s\n", table.error_id,
 		desc_lookup(table.error_id));
 	IWL_ERR(mvm, "0x%08X | trm_hw_status0\n", table.trm_hw_status0);
-- 
2.9.5

^ permalink raw reply related

* [PATCH v6 bpf-next 11/11] selftests/bpf: test for bpf_get_stackid() from raw tracepoints
From: Alexei Starovoitov @ 2018-03-27  2:47 UTC (permalink / raw)
  To: davem; +Cc: daniel, torvalds, peterz, rostedt, netdev, kernel-team, linux-api
In-Reply-To: <20180327024706.2064725-1-ast@fb.com>

From: Alexei Starovoitov <ast@kernel.org>

similar to traditional traceopint test add bpf_get_stackid() test
from raw tracepoints
and reduce verbosity of existing stackmap test

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
---
 tools/testing/selftests/bpf/test_progs.c | 91 ++++++++++++++++++++++++--------
 1 file changed, 70 insertions(+), 21 deletions(-)

diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
index e9df48b306df..faadbe233966 100644
--- a/tools/testing/selftests/bpf/test_progs.c
+++ b/tools/testing/selftests/bpf/test_progs.c
@@ -877,7 +877,7 @@ static void test_stacktrace_map()
 
 	err = bpf_prog_load(file, BPF_PROG_TYPE_TRACEPOINT, &obj, &prog_fd);
 	if (CHECK(err, "prog_load", "err %d errno %d\n", err, errno))
-		goto out;
+		return;
 
 	/* Get the ID for the sched/sched_switch tracepoint */
 	snprintf(buf, sizeof(buf),
@@ -888,8 +888,7 @@ static void test_stacktrace_map()
 
 	bytes = read(efd, buf, sizeof(buf));
 	close(efd);
-	if (CHECK(bytes <= 0 || bytes >= sizeof(buf),
-		  "read", "bytes %d errno %d\n", bytes, errno))
+	if (bytes <= 0 || bytes >= sizeof(buf))
 		goto close_prog;
 
 	/* Open the perf event and attach bpf progrram */
@@ -906,29 +905,24 @@ static void test_stacktrace_map()
 		goto close_prog;
 
 	err = ioctl(pmu_fd, PERF_EVENT_IOC_ENABLE, 0);
-	if (CHECK(err, "perf_event_ioc_enable", "err %d errno %d\n",
-		  err, errno))
-		goto close_pmu;
+	if (err)
+		goto disable_pmu;
 
 	err = ioctl(pmu_fd, PERF_EVENT_IOC_SET_BPF, prog_fd);
-	if (CHECK(err, "perf_event_ioc_set_bpf", "err %d errno %d\n",
-		  err, errno))
+	if (err)
 		goto disable_pmu;
 
 	/* find map fds */
 	control_map_fd = bpf_find_map(__func__, obj, "control_map");
-	if (CHECK(control_map_fd < 0, "bpf_find_map control_map",
-		  "err %d errno %d\n", err, errno))
+	if (control_map_fd < 0)
 		goto disable_pmu;
 
 	stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
-	if (CHECK(stackid_hmap_fd < 0, "bpf_find_map stackid_hmap",
-		  "err %d errno %d\n", err, errno))
+	if (stackid_hmap_fd < 0)
 		goto disable_pmu;
 
 	stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
-	if (CHECK(stackmap_fd < 0, "bpf_find_map stackmap", "err %d errno %d\n",
-		  err, errno))
+	if (stackmap_fd < 0)
 		goto disable_pmu;
 
 	/* give some time for bpf program run */
@@ -945,24 +939,78 @@ static void test_stacktrace_map()
 	err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
 	if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
 		  "err %d errno %d\n", err, errno))
-		goto disable_pmu;
+		goto disable_pmu_noerr;
 
 	err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
 	if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
 		  "err %d errno %d\n", err, errno))
-		; /* fall through */
+		goto disable_pmu_noerr;
 
+	goto disable_pmu_noerr;
 disable_pmu:
+	error_cnt++;
+disable_pmu_noerr:
 	ioctl(pmu_fd, PERF_EVENT_IOC_DISABLE);
-
-close_pmu:
 	close(pmu_fd);
-
 close_prog:
 	bpf_object__close(obj);
+}
 
-out:
-	return;
+static void test_stacktrace_map_raw_tp()
+{
+	int control_map_fd, stackid_hmap_fd, stackmap_fd;
+	const char *file = "./test_stacktrace_map.o";
+	int efd, err, prog_fd;
+	__u32 key, val, duration = 0;
+	struct bpf_object *obj;
+
+	err = bpf_prog_load(file, BPF_PROG_TYPE_RAW_TRACEPOINT, &obj, &prog_fd);
+	if (CHECK(err, "prog_load raw tp", "err %d errno %d\n", err, errno))
+		return;
+
+	efd = bpf_raw_tracepoint_open("sched_switch", prog_fd);
+	if (CHECK(efd < 0, "raw_tp_open", "err %d errno %d\n", efd, errno))
+		goto close_prog;
+
+	/* find map fds */
+	control_map_fd = bpf_find_map(__func__, obj, "control_map");
+	if (control_map_fd < 0)
+		goto close_prog;
+
+	stackid_hmap_fd = bpf_find_map(__func__, obj, "stackid_hmap");
+	if (stackid_hmap_fd < 0)
+		goto close_prog;
+
+	stackmap_fd = bpf_find_map(__func__, obj, "stackmap");
+	if (stackmap_fd < 0)
+		goto close_prog;
+
+	/* give some time for bpf program run */
+	sleep(1);
+
+	/* disable stack trace collection */
+	key = 0;
+	val = 1;
+	bpf_map_update_elem(control_map_fd, &key, &val, 0);
+
+	/* for every element in stackid_hmap, we can find a corresponding one
+	 * in stackmap, and vise versa.
+	 */
+	err = compare_map_keys(stackid_hmap_fd, stackmap_fd);
+	if (CHECK(err, "compare_map_keys stackid_hmap vs. stackmap",
+		  "err %d errno %d\n", err, errno))
+		goto close_prog;
+
+	err = compare_map_keys(stackmap_fd, stackid_hmap_fd);
+	if (CHECK(err, "compare_map_keys stackmap vs. stackid_hmap",
+		  "err %d errno %d\n", err, errno))
+		goto close_prog;
+
+	goto close_prog_noerr;
+close_prog:
+	error_cnt++;
+close_prog_noerr:
+	bpf_object__close(obj);
 }
 
 static int extract_build_id(char *build_id, size_t size)
@@ -1138,6 +1186,7 @@ int main(void)
 	test_tp_attach_query();
 	test_stacktrace_map();
 	test_stacktrace_build_id();
+	test_stacktrace_map_raw_tp();
 
 	printf("Summary: %d PASSED, %d FAILED\n", pass_cnt, error_cnt);
 	return error_cnt ? EXIT_FAILURE : EXIT_SUCCESS;
-- 
2.9.5

^ permalink raw reply related


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox