Hi Vlad,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on net/master]
[also build test WARNING on v4.17-rc5 next-20180514]
[cannot apply to net-next/master]
[if your patch is applied to the wrong git tree, please drop us a note to help 
improve the system]

url:    
https://github.com/0day-ci/linux/commits/Vlad-Buslov/Modify-action-API-for-implementing-lockless-actions/20180515-025420
reproduce:
        # apt-get install sparse
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> net/sched/act_api.c:71:15: sparse: incorrect type in initializer (different 
>> address spaces) @@    expected struct tc_cookie [noderef] <asn:4>*__ret @@   
>>  got [noderef] <asn:4>*__ret @@
   net/sched/act_api.c:71:15:    expected struct tc_cookie [noderef] 
<asn:4>*__ret
   net/sched/act_api.c:71:15:    got struct tc_cookie *new_cookie
>> net/sched/act_api.c:71:13: sparse: incorrect type in assignment (different 
>> address spaces) @@    expected struct tc_cookie *old @@    got struct 
>> tc_cookie [noderef] <struct tc_cookie *old @@
   net/sched/act_api.c:71:13:    expected struct tc_cookie *old
   net/sched/act_api.c:71:13:    got struct tc_cookie [noderef] 
<asn:4>*[assigned] __ret
>> net/sched/act_api.c:132:48: sparse: dereference of noderef expression

vim +71 net/sched/act_api.c

    65  
    66  static void tcf_set_action_cookie(struct tc_cookie __rcu **old_cookie,
    67                                    struct tc_cookie *new_cookie)
    68  {
    69          struct tc_cookie *old;
    70  
  > 71          old = xchg(old_cookie, new_cookie);
    72          if (old)
    73                  call_rcu(&old->rcu, tcf_free_cookie_rcu);
    74  }
    75  
    76  /* XXX: For standalone actions, we don't need a RCU grace period 
either, because
    77   * actions are always connected to filters and filters are already 
destroyed in
    78   * RCU callbacks, so after a RCU grace period actions are already 
disconnected
    79   * from filters. Readers later can not find us.
    80   */
    81  static void free_tcf(struct tc_action *p)
    82  {
    83          free_percpu(p->cpu_bstats);
    84          free_percpu(p->cpu_qstats);
    85  
    86          tcf_set_action_cookie(&p->act_cookie, NULL);
    87          if (p->goto_chain)
    88                  tcf_action_goto_chain_fini(p);
    89  
    90          kfree(p);
    91  }
    92  
    93  static void tcf_idr_remove(struct tcf_idrinfo *idrinfo, struct 
tc_action *p)
    94  {
    95          spin_lock_bh(&idrinfo->lock);
    96          idr_remove(&idrinfo->action_idr, p->tcfa_index);
    97          spin_unlock_bh(&idrinfo->lock);
    98          gen_kill_estimator(&p->tcfa_rate_est);
    99          free_tcf(p);
   100  }
   101  
   102  int __tcf_idr_release(struct tc_action *p, bool bind, bool strict)
   103  {
   104          int ret = 0;
   105  
   106          ASSERT_RTNL();
   107  
   108          if (p) {
   109                  if (bind)
   110                          p->tcfa_bindcnt--;
   111                  else if (strict && p->tcfa_bindcnt > 0)
   112                          return -EPERM;
   113  
   114                  p->tcfa_refcnt--;
   115                  if (p->tcfa_bindcnt <= 0 && p->tcfa_refcnt <= 0) {
   116                          if (p->ops->cleanup)
   117                                  p->ops->cleanup(p);
   118                          tcf_idr_remove(p->idrinfo, p);
   119                          ret = ACT_P_DELETED;
   120                  }
   121          }
   122  
   123          return ret;
   124  }
   125  EXPORT_SYMBOL(__tcf_idr_release);
   126  
   127  static size_t tcf_action_shared_attrs_size(const struct tc_action *act)
   128  {
   129          u32 cookie_len = 0;
   130  
   131          if (act->act_cookie)
 > 132                  cookie_len = nla_total_size(act->act_cookie->len);
   133  
   134          return  nla_total_size(0) /* action number nested */
   135                  + nla_total_size(IFNAMSIZ) /* TCA_ACT_KIND */
   136                  + cookie_len /* TCA_ACT_COOKIE */
   137                  + nla_total_size(0) /* TCA_ACT_STATS nested */
   138                  /* TCA_STATS_BASIC */
   139                  + nla_total_size_64bit(sizeof(struct gnet_stats_basic))
   140                  /* TCA_STATS_QUEUE */
   141                  + nla_total_size_64bit(sizeof(struct gnet_stats_queue))
   142                  + nla_total_size(0) /* TCA_OPTIONS nested */
   143                  + nla_total_size(sizeof(struct tcf_t)); /* TCA_GACT_TM 
*/
   144  }
   145  

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

Reply via email to