Hi Sriram, Thank you for the patch! Perhaps something to improve: [auto build test WARNING on 35610745d71df567297bb40c5e4263cda38dddd5] url: https://github.com/intel-lab-lkp/linux/commits/Sriram-R/mac80211-Mesh-Fast-xmit-support/20220801-150754 base: 35610745d71df567297bb40c5e4263cda38dddd5 config: microblaze-randconfig-s033-20220803 (https://download.01.org/0day-ci/archive/20220803/202208031727.gD3OOS6X-lkp@xxxxxxxxx/config) compiler: microblaze-linux-gcc (GCC) 12.1.0 reproduce: wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # apt-get install sparse # sparse version: v0.6.4-39-gce1a6720-dirty # https://github.com/intel-lab-lkp/linux/commit/0818e073d360fa23c2a1e61f49d67a7b3e99a4e6 git remote add linux-review https://github.com/intel-lab-lkp/linux git fetch --no-tags linux-review Sriram-R/mac80211-Mesh-Fast-xmit-support/20220801-150754 git checkout 0818e073d360fa23c2a1e61f49d67a7b3e99a4e6 # save the config file mkdir build_dir && cp config build_dir/.config COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' O=build_dir ARCH=microblaze SHELL=/bin/bash net/mac80211/ If you fix the issue, kindly add following tag where applicable Reported-by: kernel test robot <lkp@xxxxxxxxx> sparse warnings: (new ones prefixed by >>) >> net/mac80211/mesh_pathtbl.c:464:17: sparse: sparse: incompatible types in comparison expression (different address spaces): >> net/mac80211/mesh_pathtbl.c:464:17: sparse: struct mesh_path [noderef] __rcu * >> net/mac80211/mesh_pathtbl.c:464:17: sparse: struct mesh_path * net/mac80211/mesh_pathtbl.c:471:18: sparse: sparse: incompatible types in comparison expression (different address spaces): net/mac80211/mesh_pathtbl.c:471:18: sparse: struct mesh_path [noderef] __rcu * net/mac80211/mesh_pathtbl.c:471:18: sparse: struct mesh_path * net/mac80211/mesh_pathtbl.c:509:25: sparse: sparse: incompatible types in comparison expression (different address spaces): >> net/mac80211/mesh_pathtbl.c:509:25: sparse: struct ieee80211_key [noderef] __rcu * >> net/mac80211/mesh_pathtbl.c:509:25: sparse: struct ieee80211_key * net/mac80211/mesh_pathtbl.c:656:9: sparse: sparse: incompatible types in comparison expression (different address spaces): net/mac80211/mesh_pathtbl.c:656:9: sparse: struct mesh_path [noderef] __rcu * net/mac80211/mesh_pathtbl.c:656:9: sparse: struct mesh_path * net/mac80211/mesh_pathtbl.c:657:9: sparse: sparse: incompatible types in comparison expression (different address spaces): net/mac80211/mesh_pathtbl.c:657:9: sparse: struct mesh_path [noderef] __rcu * net/mac80211/mesh_pathtbl.c:657:9: sparse: struct mesh_path * net/mac80211/mesh_pathtbl.c:658:9: sparse: sparse: incompatible types in comparison expression (different address spaces): net/mac80211/mesh_pathtbl.c:658:9: sparse: struct ieee80211_key [noderef] __rcu * net/mac80211/mesh_pathtbl.c:658:9: sparse: struct ieee80211_key * net/mac80211/mesh_pathtbl.c:757:31: sparse: sparse: incompatible types in comparison expression (different address spaces): net/mac80211/mesh_pathtbl.c:757:31: sparse: struct mesh_path [noderef] __rcu * net/mac80211/mesh_pathtbl.c:757:31: sparse: struct mesh_path * vim +464 net/mac80211/mesh_pathtbl.c 434 435 struct mhdr_cache_entry *mesh_fill_cached_hdr(struct ieee80211_sub_if_data *sdata, 436 struct sk_buff *skb) 437 { 438 struct mesh_hdr_cache *cache; 439 struct mhdr_cache_entry *entry; 440 struct mesh_path *mpath, *mppath; 441 struct ieee80211s_hdr *meshhdr; 442 struct ieee80211_hdr *hdr; 443 struct sta_info *new_nhop; 444 struct ieee80211_key *key; 445 struct ethhdr *eth; 446 u8 sa[ETH_ALEN]; 447 448 u8 tid; 449 450 cache = &sdata->u.mesh.hdr_cache; 451 452 if (!cache->enabled) 453 return NULL; 454 455 entry = rhashtable_lookup(&cache->rhead, skb->data, 456 mesh_hdr_rht_params); 457 if (!entry) 458 return NULL; 459 460 /* Avoid extra work in this path */ 461 if (skb_headroom(skb) < (entry->hdrlen - ETH_HLEN + 2)) 462 return NULL; 463 > 464 mpath = rcu_dereference(entry->mpath); 465 if (!mpath) 466 return NULL; 467 468 /* This check is with assumption that only 6addr frames are 469 * supported currently for caching 470 */ 471 mppath = rcu_dereference(entry->mppath); 472 if (!mppath) 473 return NULL; 474 475 if (!(mpath->flags & MESH_PATH_ACTIVE)) 476 return NULL; 477 478 if (mpath_expired(mpath)) 479 return NULL; 480 481 /* If the skb is shared we need to obtain our own copy */ 482 if (skb_shared(skb)) { 483 struct sk_buff *tmp_skb = skb; 484 485 skb = skb_clone(skb, GFP_ATOMIC); 486 kfree_skb(tmp_skb); 487 488 if (!skb) 489 return NULL; 490 } 491 492 /* In case there was a path refresh and update after we last used 493 * update the next hop addr. 494 */ 495 spin_lock_bh(&mpath->state_lock); 496 if (entry->path_change_count != mpath->path_change_count) { 497 new_nhop = rcu_dereference(mpath->next_hop); 498 if (!new_nhop) { 499 spin_unlock_bh(&mpath->state_lock); 500 return NULL; 501 } 502 memcpy(&entry->hdr[4], new_nhop->sta.addr, ETH_ALEN); 503 504 /* update key. pn_offs will be same */ 505 if (entry->key) { 506 key = rcu_access_pointer(new_nhop->ptk[new_nhop->ptk_idx]); 507 if (!key) 508 key = rcu_access_pointer(sdata->default_unicast_key); > 509 rcu_assign_pointer(entry->key, key); 510 } 511 entry->path_change_count = mpath->path_change_count; 512 } 513 spin_unlock_bh(&mpath->state_lock); 514 515 /* backup eth SA to copy as eaddr2/SA in the mesh header */ 516 eth = (struct ethhdr *)skb->data; 517 ether_addr_copy(sa, eth->h_source); 518 519 /* Pull DA:SA */ 520 skb_pull(skb, ETH_ALEN * 2); 521 522 memcpy(skb_push(skb, entry->hdrlen), entry->hdr, entry->hdrlen); 523 524 meshhdr = (struct ieee80211s_hdr *)(skb->data + entry->machdr_len); 525 hdr = (struct ieee80211_hdr *)skb->data; 526 527 /* Update mutables */ 528 tid = skb->priority & IEEE80211_QOS_CTL_TAG1D_MASK; 529 *ieee80211_get_qos_ctl(hdr) = tid; 530 531 put_unaligned(cpu_to_le32(sdata->u.mesh.mesh_seqnum), &meshhdr->seqnum); 532 sdata->u.mesh.mesh_seqnum++; 533 534 memcpy(meshhdr->eaddr2, sa, ETH_ALEN); 535 meshhdr->ttl = sdata->u.mesh.mshcfg.dot11MeshTTL; 536 537 if (mpath->flags & (MESH_PATH_REQ_QUEUED | MESH_PATH_FIXED)) 538 goto out; 539 540 /* Refresh the path, in case there is a change in nexthop after refresh 541 * hdr will be updated on next lookup 542 */ 543 if (time_after(jiffies, 544 mpath->exp_time - 545 msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) && 546 !(mpath->flags & MESH_PATH_RESOLVING) && 547 !(mpath->flags & MESH_PATH_FIXED)) { 548 mesh_queue_preq(mpath, PREQ_Q_F_START | PREQ_Q_F_REFRESH); 549 } 550 551 out: 552 mppath->exp_time = jiffies; 553 entry->timestamp = jiffies; 554 555 return entry; 556 } 557 -- 0-DAY CI Kernel Test Service https://01.org/lkp