tree:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next.git 
master
head:   de7de576eca204de9a38e2f6dafe6b7c1ddc85c1
commit: f25da51fdc381ca2863248c7060b3662632f0872 [1745/1753] ieee802154: hwsim: 
add replacement for fakelb
reproduce:
        # apt-get install sparse
        git checkout f25da51fdc381ca2863248c7060b3662632f0872
        make ARCH=x86_64 allmodconfig
        make C=1 CF=-D__CHECK_ENDIAN__


sparse warnings: (new ones prefixed by >>)

>> drivers/net/ieee802154/mac802154_hwsim.c:39:14: sparse: incorrect type in 
>> initializer (different address spaces) @@    expected struct list_head *next 
>> @@    got struct list_head struct list_head *next @@
   drivers/net/ieee802154/mac802154_hwsim.c:39:14:    expected struct list_head 
*next
   drivers/net/ieee802154/mac802154_hwsim.c:39:14:    got struct list_head 
[noderef] <asn:4>*<noident>
>> drivers/net/ieee802154/mac802154_hwsim.c:39:14: sparse: incorrect type in 
>> initializer (different address spaces) @@    expected struct list_head *prev 
>> @@    got struct list_head struct list_head *prev @@
   drivers/net/ieee802154/mac802154_hwsim.c:39:14:    expected struct list_head 
*prev
   drivers/net/ieee802154/mac802154_hwsim.c:39:14:    got struct list_head 
[noderef] <asn:4>*<noident>
>> drivers/net/ieee802154/mac802154_hwsim.c:799:18: sparse: incorrect type in 
>> assignment (different address spaces) @@    expected struct hwsim_pib 
>> [noderef] <asn:4>*pib @@    got  hwsim_pib [noderef] <asn:4>*pib @@
   drivers/net/ieee802154/mac802154_hwsim.c:799:18:    expected struct 
hwsim_pib [noderef] <asn:4>*pib
   drivers/net/ieee802154/mac802154_hwsim.c:799:18:    got struct hwsim_pib 
*[assigned] pib
>> drivers/net/ieee802154/mac802154_hwsim.c:801:25: sparse: incorrect type in 
>> argument 1 (different modifiers) @@    expected struct list_head *list @@    
>> got struct lisstruct list_head *list @@
   drivers/net/ieee802154/mac802154_hwsim.c:801:25:    expected struct 
list_head *list
   drivers/net/ieee802154/mac802154_hwsim.c:801:25:    got struct list_head 
[noderef] *<noident>
>> drivers/net/ieee802154/mac802154_hwsim.c:835:9: sparse: incorrect type in 
>> argument 1 (different address spaces) @@    expected struct callback_head 
>> *head @@    got struct callback_hstruct callback_head *head @@
   drivers/net/ieee802154/mac802154_hwsim.c:835:9:    expected struct 
callback_head *head
   drivers/net/ieee802154/mac802154_hwsim.c:835:9:    got struct callback_head 
[noderef] <asn:4>*<noident>
>> drivers/net/ieee802154/mac802154_hwsim.c:113:17: sparse: incorrect type in 
>> assignment (different address spaces) @@    expected struct hwsim_pib 
>> *pib_old @@    got struct hwsim_pib struct hwsim_pib *pib_old @@
   drivers/net/ieee802154/mac802154_hwsim.c:113:17:    expected struct 
hwsim_pib *pib_old
   drivers/net/ieee802154/mac802154_hwsim.c:113:17:    got struct hwsim_pib 
[noderef] <asn:4>*pib
>> drivers/net/ieee802154/mac802154_hwsim.c:130:9: sparse: incompatible types 
>> in comparison expression (different modifiers)
>> drivers/net/ieee802154/mac802154_hwsim.c:144:33: sparse: incompatible types 
>> in comparison expression (different address spaces)
>> drivers/net/ieee802154/mac802154_hwsim.c:161:40: sparse: incorrect type in 
>> argument 2 (different address spaces) @@    expected struct list_head *head 
>> @@    got struct list_head struct list_head *head @@
   drivers/net/ieee802154/mac802154_hwsim.c:161:40:    expected struct 
list_head *head
   drivers/net/ieee802154/mac802154_hwsim.c:161:40:    got struct list_head 
[noderef] <asn:4>*<noident>
>> drivers/net/ieee802154/mac802154_hwsim.c:232:25: sparse: incorrect type in 
>> argument 1 (different modifiers) @@    expected struct list_head const *head 
>> @@    got strustruct list_head const *head @@
   drivers/net/ieee802154/mac802154_hwsim.c:232:25:    expected struct 
list_head const *head
   drivers/net/ieee802154/mac802154_hwsim.c:232:25:    got struct list_head 
[noderef] *<noident>
   drivers/net/ieee802154/mac802154_hwsim.c:243:9: sparse: incompatible types 
in comparison expression (different modifiers)
   drivers/net/ieee802154/mac802154_hwsim.c:260:25: sparse: incompatible types 
in comparison expression (different address spaces)
   drivers/net/ieee802154/mac802154_hwsim.c:460:9: sparse: incompatible types 
in comparison expression (different modifiers)
   drivers/net/ieee802154/mac802154_hwsim.c:515:9: sparse: incompatible types 
in comparison expression (different modifiers)
   drivers/net/ieee802154/mac802154_hwsim.c:573:9: sparse: incompatible types 
in comparison expression (different modifiers)
   drivers/net/ieee802154/mac802154_hwsim.c:695:17: sparse: incompatible types 
in comparison expression (different modifiers)
>> drivers/net/ieee802154/mac802154_hwsim.c:717:41: sparse: incorrect type in 
>> argument 2 (different modifiers) @@    expected struct list_head *head @@    
>> got struct lisstruct list_head *head @@
   drivers/net/ieee802154/mac802154_hwsim.c:717:41:    expected struct 
list_head *head
   drivers/net/ieee802154/mac802154_hwsim.c:717:41:    got struct list_head 
[noderef] *<noident>
   drivers/net/ieee802154/mac802154_hwsim.c:725:41: sparse: incorrect type in 
argument 2 (different modifiers) @@    expected struct list_head *head @@    
got struct lisstruct list_head *head @@
   drivers/net/ieee802154/mac802154_hwsim.c:725:41:    expected struct 
list_head *head
   drivers/net/ieee802154/mac802154_hwsim.c:725:41:    got struct list_head 
[noderef] *<noident>

vim +39 drivers/net/ieee802154/mac802154_hwsim.c

    38  
  > 39  static __rcu LIST_HEAD(hwsim_ifup_phys);
    40  
    41  static struct platform_device *mac802154hwsim_dev;
    42  
    43  /* MAC802154_HWSIM netlink family */
    44  static struct genl_family hwsim_genl_family;
    45  
    46  static int hwsim_radio_idx;
    47  
    48  enum hwsim_multicast_groups {
    49          HWSIM_MCGRP_CONFIG,
    50  };
    51  
    52  static const struct genl_multicast_group hwsim_mcgrps[] = {
    53          [HWSIM_MCGRP_CONFIG] = { .name = "config", },
    54  };
    55  
    56  struct hwsim_pib {
    57          u8 page;
    58          u8 channel;
    59  
    60          struct rcu_head rcu;
    61  };
    62  
    63  struct hwsim_edge_info {
    64          u8 lqi;
    65  
    66          struct rcu_head rcu;
    67  };
    68  
    69  struct hwsim_edge {
    70          struct hwsim_phy *endpoint;
    71          struct hwsim_edge_info *info;
    72  
    73          struct list_head list;
    74          struct rcu_head rcu;
    75  };
    76  
    77  struct hwsim_phy {
    78          struct ieee802154_hw *hw;
    79          u32 idx;
    80  
    81          struct hwsim_pib __rcu *pib;
    82  
    83          bool suspended;
    84          struct list_head __rcu edges;
    85  
    86          struct list_head list;
    87          struct list_head list_ifup;
    88  };
    89  
    90  static int hwsim_add_one(struct genl_info *info, struct device *dev,
    91                           bool init);
    92  static void hwsim_del(struct hwsim_phy *phy);
    93  
    94  static int hwsim_hw_ed(struct ieee802154_hw *hw, u8 *level)
    95  {
    96          *level = 0xbe;
    97  
    98          return 0;
    99  }
   100  
   101  static int hwsim_hw_channel(struct ieee802154_hw *hw, u8 page, u8 
channel)
   102  {
   103          struct hwsim_phy *phy = hw->priv;
   104          struct hwsim_pib *pib, *pib_old;
   105  
   106          pib = kzalloc(sizeof(*pib), GFP_KERNEL);
   107          if (!pib)
   108                  return -ENOMEM;
   109  
   110          pib->page = page;
   111          pib->channel = channel;
   112  
 > 113          pib_old = phy->pib;
   114          rcu_assign_pointer(phy->pib, pib);
   115          kfree_rcu(pib_old, rcu);
   116          return 0;
   117  }
   118  
   119  static int hwsim_hw_xmit(struct ieee802154_hw *hw, struct sk_buff *skb)
   120  {
   121          struct hwsim_phy *current_phy = hw->priv;
   122          struct hwsim_pib *current_pib, *endpoint_pib;
   123          struct hwsim_edge_info *einfo;
   124          struct hwsim_edge *e;
   125  
   126          WARN_ON(current_phy->suspended);
   127  
   128          rcu_read_lock();
   129          current_pib = rcu_dereference(current_phy->pib);
 > 130          list_for_each_entry_rcu(e, &current_phy->edges, list) {
   131                  /* Can be changed later in rx_irqsafe, but this is only 
a
   132                   * performance tweak. Received radio should drop the 
frame
   133                   * in mac802154 stack anyway... so we don't need to be
   134                   * 100% of locking here to check on suspended
   135                   */
   136                  if (e->endpoint->suspended)
   137                          continue;
   138  
   139                  endpoint_pib = rcu_dereference(e->endpoint->pib);
   140                  if (current_pib->page == endpoint_pib->page &&
   141                      current_pib->channel == endpoint_pib->channel) {
   142                          struct sk_buff *newskb = pskb_copy(skb, 
GFP_ATOMIC);
   143  
 > 144                          einfo = rcu_dereference(e->info);
   145                          if (newskb)
   146                                  ieee802154_rx_irqsafe(e->endpoint->hw, 
newskb,
   147                                                        einfo->lqi);
   148                  }
   149          }
   150          rcu_read_unlock();
   151  
   152          ieee802154_xmit_complete(hw, skb, false);
   153          return 0;
   154  }
   155  
   156  static int hwsim_hw_start(struct ieee802154_hw *hw)
   157  {
   158          struct hwsim_phy *phy = hw->priv;
   159  
   160          phy->suspended = false;
 > 161          list_add_rcu(&phy->list_ifup, &hwsim_ifup_phys);
   162          synchronize_rcu();
   163  
   164          return 0;
   165  }
   166  
   167  static void hwsim_hw_stop(struct ieee802154_hw *hw)
   168  {
   169          struct hwsim_phy *phy = hw->priv;
   170  
   171          phy->suspended = true;
   172          list_del_rcu(&phy->list_ifup);
   173          synchronize_rcu();
   174  }
   175  
   176  static int
   177  hwsim_set_promiscuous_mode(struct ieee802154_hw *hw, const bool on)
   178  {
   179          return 0;
   180  }
   181  
   182  static const struct ieee802154_ops hwsim_ops = {
   183          .owner = THIS_MODULE,
   184          .xmit_async = hwsim_hw_xmit,
   185          .ed = hwsim_hw_ed,
   186          .set_channel = hwsim_hw_channel,
   187          .start = hwsim_hw_start,
   188          .stop = hwsim_hw_stop,
   189          .set_promiscuous_mode = hwsim_set_promiscuous_mode,
   190  };
   191  
   192  static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info 
*info)
   193  {
   194          return hwsim_add_one(info, &mac802154hwsim_dev->dev, false);
   195  }
   196  
   197  static int hwsim_del_radio_nl(struct sk_buff *msg, struct genl_info 
*info)
   198  {
   199          struct hwsim_phy *phy, *tmp;
   200          s64 idx = -1;
   201  
   202          if (!info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID])
   203                  return -EINVAL;
   204  
   205          idx = nla_get_u32(info->attrs[MAC802154_HWSIM_ATTR_RADIO_ID]);
   206  
   207          mutex_lock(&hwsim_phys_lock);
   208          list_for_each_entry_safe(phy, tmp, &hwsim_phys, list) {
   209                  if (idx == phy->idx) {
   210                          hwsim_del(phy);
   211                          mutex_unlock(&hwsim_phys_lock);
   212                          return 0;
   213                  }
   214          }
   215          mutex_unlock(&hwsim_phys_lock);
   216  
   217          return -ENODEV;
   218  }
   219  
   220  static int append_radio_msg(struct sk_buff *skb, struct hwsim_phy *phy)
   221  {
   222          struct nlattr *nl_edges, *nl_edge;
   223          struct hwsim_edge_info *einfo;
   224          struct hwsim_edge *e;
   225          int ret;
   226  
   227          ret = nla_put_u32(skb, MAC802154_HWSIM_ATTR_RADIO_ID, phy->idx);
   228          if (ret < 0)
   229                  return ret;
   230  
   231          rcu_read_lock();
 > 232          if (list_empty(&phy->edges)) {
   233                  rcu_read_unlock();
   234                  return 0;
   235          }
   236  
   237          nl_edges = nla_nest_start(skb, 
MAC802154_HWSIM_ATTR_RADIO_EDGES);
   238          if (!nl_edges) {
   239                  rcu_read_unlock();
   240                  return -ENOBUFS;
   241          }
   242  
   243          list_for_each_entry_rcu(e, &phy->edges, list) {
   244                  nl_edge = nla_nest_start(skb, 
MAC802154_HWSIM_ATTR_RADIO_EDGE);
   245                  if (!nl_edge) {
   246                          rcu_read_unlock();
   247                          nla_nest_cancel(skb, nl_edges);
   248                          return -ENOBUFS;
   249                  }
   250  
   251                  ret = nla_put_u32(skb, 
MAC802154_HWSIM_EDGE_ATTR_ENDPOINT_ID,
   252                                    e->endpoint->idx);
   253                  if (ret < 0) {
   254                          rcu_read_unlock();
   255                          nla_nest_cancel(skb, nl_edge);
   256                          nla_nest_cancel(skb, nl_edges);
   257                          return ret;
   258                  }
   259  
   260                  einfo = rcu_dereference(e->info);
   261                  ret = nla_put_u8(skb, MAC802154_HWSIM_EDGE_ATTR_LQI,
   262                                   einfo->lqi);
   263                  if (ret < 0) {
   264                          rcu_read_unlock();
   265                          nla_nest_cancel(skb, nl_edge);
   266                          nla_nest_cancel(skb, nl_edges);
   267                          return ret;
   268                  }
   269  
   270                  nla_nest_end(skb, nl_edge);
   271          }
   272          rcu_read_unlock();
   273  
   274          nla_nest_end(skb, nl_edges);
   275  
   276          return 0;
   277  }
   278  

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

Reply via email to