tree:   https://git.kernel.org/pub/scm/linux/kernel/git/pablo/nf-next.git 
nexpr-wip
head:   79fecc65dbc173c5c12e0fa33997e4b8cae10d41
commit: 3593c74388e4faafa88c04cbb8e0a6792d4600eb [38/41] netfilter: 
nft_counter: support for atomic dump and reset
config: i386-randconfig-s1-201636 (attached as .config)
compiler: gcc-6 (Debian 6.1.1-9) 6.1.1 20160705
reproduce:
        git checkout 3593c74388e4faafa88c04cbb8e0a6792d4600eb
        # save the attached .config to linux build tree
        make ARCH=i386 

All warnings (new ones prefixed by >>):

   In file included from arch/x86/include/asm/atomic.h:7:0,
                    from include/linux/atomic.h:4,
                    from arch/x86/include/asm/thread_info.h:53,
                    from include/linux/thread_info.h:54,
                    from arch/x86/include/asm/preempt.h:6,
                    from include/linux/preempt.h:59,
                    from include/linux/spinlock.h:50,
                    from include/linux/seqlock.h:35,
                    from include/linux/time.h:5,
                    from include/linux/stat.h:18,
                    from include/linux/module.h:10,
                    from net/netfilter/nft_counter.c:13:
   net/netfilter/nft_counter.c: In function 'nft_counter_fetch':
   arch/x86/include/asm/cmpxchg.h:66:4: error: call to '__xchg_wrong_size' 
declared with attribute error: Bad argument size for xchg
       __ ## op ## _wrong_size();   \
       ^~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/cmpxchg.h:77:22: note: in expansion of macro '__xchg_op'
    #define xchg(ptr, v) __xchg_op((ptr), (v), xchg, "")
                         ^~~~~~~~~
>> net/netfilter/nft_counter.c:67:16: note: in expansion of macro 'xchg'
        packets += xchg(&cpu_stats->counter.packets, 0);
                   ^~~~
   arch/x86/include/asm/cmpxchg.h:66:4: error: call to '__xchg_wrong_size' 
declared with attribute error: Bad argument size for xchg
       __ ## op ## _wrong_size();   \
       ^~~~~~~~~~~~~~~~~~~~~~~~~
   arch/x86/include/asm/cmpxchg.h:77:22: note: in expansion of macro '__xchg_op'
    #define xchg(ptr, v) __xchg_op((ptr), (v), xchg, "")
                         ^~~~~~~~~
   net/netfilter/nft_counter.c:68:14: note: in expansion of macro 'xchg'
        bytes += xchg(&cpu_stats->counter.bytes, 0);
                 ^~~~

vim +/xchg +67 net/netfilter/nft_counter.c

     7   *
     8   * Development of this code funded by Astaro AG (http://www.astaro.com/)
     9   */
    10  
    11  #include <linux/kernel.h>
    12  #include <linux/init.h>
  > 13  #include <linux/module.h>
    14  #include <linux/seqlock.h>
    15  #include <linux/netlink.h>
    16  #include <linux/netfilter.h>
    17  #include <linux/netfilter/nf_tables.h>
    18  #include <net/netfilter/nf_tables.h>
    19  
    20  struct nft_counter {
    21          u64             bytes;
    22          u64             packets;
    23  };
    24  
    25  struct nft_counter_percpu {
    26          struct nft_counter      counter;
    27          struct u64_stats_sync   syncp;
    28  };
    29  
    30  struct nft_counter_percpu_priv {
    31          struct nft_counter_percpu __percpu *counter;
    32  };
    33  
    34  static void nft_counter_eval(const struct nft_expr *expr,
    35                               struct nft_regs *regs,
    36                               const struct nft_pktinfo *pkt)
    37  {
    38          struct nft_counter_percpu_priv *priv = nft_expr_priv(expr);
    39          struct nft_counter_percpu *this_cpu;
    40  
    41          local_bh_disable();
    42          this_cpu = this_cpu_ptr(priv->counter);
    43          u64_stats_update_begin(&this_cpu->syncp);
    44          this_cpu->counter.bytes += pkt->skb->len;
    45          this_cpu->counter.packets++;
    46          u64_stats_update_end(&this_cpu->syncp);
    47          local_bh_enable();
    48  }
    49  
    50  static void nft_counter_fetch(struct nft_counter_percpu __percpu 
*counter,
    51                                struct nft_counter *total, bool reset)
    52  {
    53          struct nft_counter_percpu *cpu_stats;
    54          u64 bytes, packets;
    55          unsigned int seq;
    56          int cpu;
    57  
    58          memset(total, 0, sizeof(*total));
    59          for_each_possible_cpu(cpu) {
    60                  if (reset)
    61                          bytes = packets = 0;
    62  
    63                  cpu_stats = per_cpu_ptr(counter, cpu);
    64                  do {
    65                          seq     = 
u64_stats_fetch_begin_irq(&cpu_stats->syncp);
    66                          if (reset) {
  > 67                                  packets += 
xchg(&cpu_stats->counter.packets, 0);
    68                                  bytes   += 
xchg(&cpu_stats->counter.bytes, 0);
    69                          } else {
    70                                  bytes   = cpu_stats->counter.bytes;

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

Attachment: .config.gz
Description: Binary data

Reply via email to