Re: [PATCH net v3] net: libwx: protect ring accesses with RCU

kernel test robot <[email protected]>
Newsgroups dev.linux.lists.oe-kbuild-all,org.kernel.vger.netdev
Message-ID <[email protected]>
Hi Mengyuan,

kernel test robot noticed the following build warnings:

[auto build test WARNING on net/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Mengyuan-Lou/net-libwx-protect-ring-accesses-with-RCU/20260824-183606
base:   net/main
patch link:    https://lore.kernel.org/r/20260824103606.303-1-mengyuanlou%40net-swift.com
patch subject: [PATCH net v3] net: libwx: protect ring accesses with RCU
config: csky-randconfig-r113-20260826 (https://download.01.org/0day-ci/archive/20260828/[email protected]/config)
compiler: csky-linux-gcc (GCC) 15.2.0
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260828/[email protected]/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <[email protected]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email protected]/

sparse warnings: (new ones prefixed by >>)
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:1717:17: sparse: sparse: incorrect type in assignment (different address spaces) @@     expected struct wx_ring *tx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:1717:17: sparse:     expected struct wx_ring *tx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:1717:17: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2662:45: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *rx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2662:45: sparse:     expected struct wx_ring *rx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2662:45: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2704:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *rx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2704:49: sparse:     expected struct wx_ring *rx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2704:49: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2778:45: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *tx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2778:45: sparse:     expected struct wx_ring *tx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2778:45: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2826:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *tx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2826:49: sparse:     expected struct wx_ring *tx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2826:49: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2936:56: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *rx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2936:56: sparse:     expected struct wx_ring *rx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2936:56: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2948:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *rx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2948:49: sparse:     expected struct wx_ring *rx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2948:49: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3039:56: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *tx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3039:56: sparse:     expected struct wx_ring *tx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3039:56: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3051:49: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *tx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3051:49: sparse:     expected struct wx_ring *tx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3051:49: sparse:     got struct wx_ring [noderef] __rcu *
>> drivers/net/ethernet/wangxun/libwx/wx_lib.c:3327:58: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const *from @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3327:58: sparse:     expected void const *from
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3327:58: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3343:57: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *tx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3343:57: sparse:     expected struct wx_ring *tx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3343:57: sparse:     got struct wx_ring [noderef] __rcu *
>> drivers/net/ethernet/wangxun/libwx/wx_lib.c:3345:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *to @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3345:43: sparse:     expected void *to
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3345:43: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3355:58: sparse: sparse: incorrect type in argument 2 (different address spaces) @@     expected void const *from @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3355:58: sparse:     expected void const *from
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3355:58: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3371:57: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct wx_ring *rx_ring @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3371:57: sparse:     expected struct wx_ring *rx_ring
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3371:57: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3372:43: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected void *to @@     got struct wx_ring [noderef] __rcu * @@
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3372:43: sparse:     expected void *to
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:3372:43: sparse:     got struct wx_ring [noderef] __rcu *
   drivers/net/ethernet/wangxun/libwx/wx_lib.c: note: in included file (through include/linux/if_ether.h, include/linux/etherdevice.h):
   include/linux/skbuff.h:2904:28: sparse: sparse: unsigned value that used to be signed checked against zero?
   include/linux/skbuff.h:2904:28: sparse: signed value source
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2061:36: sparse: sparse: dereference of noderef expression
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2068:36: sparse: sparse: dereference of noderef expression
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2075:36: sparse: sparse: dereference of noderef expression
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2080:36: sparse: sparse: dereference of noderef expression
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2101:28: sparse: sparse: dereference of noderef expression
   drivers/net/ethernet/wangxun/libwx/wx_lib.c:2104:28: sparse: sparse: dereference of noderef expression

vim +3327 drivers/net/ethernet/wangxun/libwx/wx_lib.c

3b05aa997c4914 Jiawen Wu    2025-04-21  3314  
0ce45ae881fd90 Mengyuan Lou 2026-07-10  3315  int wx_set_ring(struct wx *wx, u32 new_tx_count,
883b5984a5d290 Jiawen Wu    2024-01-03  3316  		u32 new_rx_count, struct wx_ring *temp_ring)
883b5984a5d290 Jiawen Wu    2024-01-03  3317  {
883b5984a5d290 Jiawen Wu    2024-01-03  3318  	int i, err = 0;
883b5984a5d290 Jiawen Wu    2024-01-03  3319  
883b5984a5d290 Jiawen Wu    2024-01-03  3320  	/* Setup new Tx resources and free the old Tx resources in that order.
883b5984a5d290 Jiawen Wu    2024-01-03  3321  	 * We can then assign the new resources to the rings via a memcpy.
883b5984a5d290 Jiawen Wu    2024-01-03  3322  	 * The advantage to this approach is that we are guaranteed to still
883b5984a5d290 Jiawen Wu    2024-01-03  3323  	 * have resources even in the case of an allocation failure.
883b5984a5d290 Jiawen Wu    2024-01-03  3324  	 */
883b5984a5d290 Jiawen Wu    2024-01-03  3325  	if (new_tx_count != wx->tx_ring_count) {
883b5984a5d290 Jiawen Wu    2024-01-03  3326  		for (i = 0; i < wx->num_tx_queues; i++) {
883b5984a5d290 Jiawen Wu    2024-01-03 @3327  			memcpy(&temp_ring[i], wx->tx_ring[i],
883b5984a5d290 Jiawen Wu    2024-01-03  3328  			       sizeof(struct wx_ring));
883b5984a5d290 Jiawen Wu    2024-01-03  3329  
883b5984a5d290 Jiawen Wu    2024-01-03  3330  			temp_ring[i].count = new_tx_count;
883b5984a5d290 Jiawen Wu    2024-01-03  3331  			err = wx_setup_tx_resources(&temp_ring[i]);
883b5984a5d290 Jiawen Wu    2024-01-03  3332  			if (err) {
883b5984a5d290 Jiawen Wu    2024-01-03  3333  				wx_err(wx, "setup new tx resources failed, keep using the old config\n");
883b5984a5d290 Jiawen Wu    2024-01-03  3334  				while (i) {
883b5984a5d290 Jiawen Wu    2024-01-03  3335  					i--;
883b5984a5d290 Jiawen Wu    2024-01-03  3336  					wx_free_tx_resources(&temp_ring[i]);
883b5984a5d290 Jiawen Wu    2024-01-03  3337  				}
0ce45ae881fd90 Mengyuan Lou 2026-07-10  3338  				return err;
883b5984a5d290 Jiawen Wu    2024-01-03  3339  			}
883b5984a5d290 Jiawen Wu    2024-01-03  3340  		}
883b5984a5d290 Jiawen Wu    2024-01-03  3341  
883b5984a5d290 Jiawen Wu    2024-01-03  3342  		for (i = 0; i < wx->num_tx_queues; i++) {
883b5984a5d290 Jiawen Wu    2024-01-03  3343  			wx_free_tx_resources(wx->tx_ring[i]);
883b5984a5d290 Jiawen Wu    2024-01-03  3344  
883b5984a5d290 Jiawen Wu    2024-01-03 @3345  			memcpy(wx->tx_ring[i], &temp_ring[i],
883b5984a5d290 Jiawen Wu    2024-01-03  3346  			       sizeof(struct wx_ring));
883b5984a5d290 Jiawen Wu    2024-01-03  3347  		}
883b5984a5d290 Jiawen Wu    2024-01-03  3348  
883b5984a5d290 Jiawen Wu    2024-01-03  3349  		wx->tx_ring_count = new_tx_count;
883b5984a5d290 Jiawen Wu    2024-01-03  3350  	}
883b5984a5d290 Jiawen Wu    2024-01-03  3351  
883b5984a5d290 Jiawen Wu    2024-01-03  3352  	/* Repeat the process for the Rx rings if needed */
883b5984a5d290 Jiawen Wu    2024-01-03  3353  	if (new_rx_count != wx->rx_ring_count) {
883b5984a5d290 Jiawen Wu    2024-01-03  3354  		for (i = 0; i < wx->num_rx_queues; i++) {
883b5984a5d290 Jiawen Wu    2024-01-03  3355  			memcpy(&temp_ring[i], wx->rx_ring[i],
883b5984a5d290 Jiawen Wu    2024-01-03  3356  			       sizeof(struct wx_ring));
883b5984a5d290 Jiawen Wu    2024-01-03  3357  
883b5984a5d290 Jiawen Wu    2024-01-03  3358  			temp_ring[i].count = new_rx_count;
883b5984a5d290 Jiawen Wu    2024-01-03  3359  			err = wx_setup_rx_resources(&temp_ring[i]);
883b5984a5d290 Jiawen Wu    2024-01-03  3360  			if (err) {
883b5984a5d290 Jiawen Wu    2024-01-03  3361  				wx_err(wx, "setup new rx resources failed, keep using the old config\n");
883b5984a5d290 Jiawen Wu    2024-01-03  3362  				while (i) {
883b5984a5d290 Jiawen Wu    2024-01-03  3363  					i--;
883b5984a5d290 Jiawen Wu    2024-01-03  3364  					wx_free_rx_resources(&temp_ring[i]);
883b5984a5d290 Jiawen Wu    2024-01-03  3365  				}
0ce45ae881fd90 Mengyuan Lou 2026-07-10  3366  				return err;
883b5984a5d290 Jiawen Wu    2024-01-03  3367  			}
883b5984a5d290 Jiawen Wu    2024-01-03  3368  		}
883b5984a5d290 Jiawen Wu    2024-01-03  3369  
883b5984a5d290 Jiawen Wu    2024-01-03  3370  		for (i = 0; i < wx->num_rx_queues; i++) {
883b5984a5d290 Jiawen Wu    2024-01-03  3371  			wx_free_rx_resources(wx->rx_ring[i]);
883b5984a5d290 Jiawen Wu    2024-01-03  3372  			memcpy(wx->rx_ring[i], &temp_ring[i],
883b5984a5d290 Jiawen Wu    2024-01-03  3373  			       sizeof(struct wx_ring));
883b5984a5d290 Jiawen Wu    2024-01-03  3374  		}
883b5984a5d290 Jiawen Wu    2024-01-03  3375  
883b5984a5d290 Jiawen Wu    2024-01-03  3376  		wx->rx_ring_count = new_rx_count;
883b5984a5d290 Jiawen Wu    2024-01-03  3377  	}
0ce45ae881fd90 Mengyuan Lou 2026-07-10  3378  	return 0;
883b5984a5d290 Jiawen Wu    2024-01-03  3379  }
883b5984a5d290 Jiawen Wu    2024-01-03  3380  EXPORT_SYMBOL(wx_set_ring);
883b5984a5d290 Jiawen Wu    2024-01-03  3381  

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.