Subject: Re: [PATCH net-next v1] net: openvswitch: decouple flow_table from ovs_mutex

From: kernel test robot <[email-masked]>
Date: Tue, 17 Mar 2026 21:30:00 +0800

Hi Adrian,

kernel test robot noticed the following build warnings:

[auto build test WARNING on net-next/main]

url:    https://github.com/intel-lab-lkp/linux/commits/Adrian-Moreno/net-openvswitch-decouple-flow_table-from-ovs_mutex/20260314-152511
base:   net-next/main
patch link:    https://lore.kernel.org/r/20260313173114.1220551-1-amorenoz%40redhat.com
patch subject: [PATCH net-next v1] net: openvswitch: decouple flow_table from ovs_mutex
config: arm-randconfig-r132-20260317 (https://download.01.org/0day-ci/archive/20260317/[email-masked]/config)
compiler: clang version 23.0.0git (https://github.com/llvm/llvm-project f46a5153850c1303d687233d4adf699b01041da8)
sparse: v0.6.5-rc1
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260317/[email-masked]/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-masked]>
| Closes: https://lore.kernel.org/oe-kbuild-all/[email-masked]/

sparse warnings: (new ones prefixed by >>)
>> net/openvswitch/datapath.c:2016:28: sparse: sparse: incorrect type in argument 1 (different address spaces) @@     expected struct flow_table *table @@     got struct flow_table [noderef] __rcu *table @@
   net/openvswitch/datapath.c:2016:28: sparse:     expected struct flow_table *table
   net/openvswitch/datapath.c:2016:28: sparse:     got struct flow_table [noderef] __rcu *table

vim +2016 net/openvswitch/datapath.c

  1913	
  1914	static int ovs_dp_cmd_new(struct sk_buff *skb, struct genl_info *info)
  1915	{
  1916		struct nlattr **a = info->attrs;
  1917		struct flow_table *table;
  1918		struct vport_parms parms;
  1919		struct sk_buff *reply;
  1920		struct datapath *dp;
  1921		struct vport *vport;
  1922		struct ovs_net *ovs_net;
  1923		int err;
  1924	
  1925		err = -EINVAL;
  1926		if (!a[OVS_DP_ATTR_NAME] || !a[OVS_DP_ATTR_UPCALL_PID])
  1927			goto err;
  1928	
  1929		reply = ovs_dp_cmd_alloc_info();
  1930		if (!reply)
  1931			return -ENOMEM;
  1932	
  1933		err = -ENOMEM;
  1934		dp = kzalloc_obj(*dp);
  1935		if (dp == NULL)
  1936			goto err_destroy_reply;
  1937	
  1938		ovs_dp_set_net(dp, sock_net(skb->sk));
  1939	
  1940		/* Allocate table. */
  1941		table = ovs_flow_tbl_alloc();
  1942		if (IS_ERR(table)) {
  1943			err = PTR_ERR(table);
  1944			goto err_destroy_dp;
  1945		}
  1946		rcu_assign_pointer(dp->table, table);
  1947	
  1948		err = ovs_dp_stats_init(dp);
  1949		if (err)
  1950			goto err_destroy_table;
  1951	
  1952		err = ovs_dp_vport_init(dp);
  1953		if (err)
  1954			goto err_destroy_stats;
  1955	
  1956		err = ovs_meters_init(dp);
  1957		if (err)
  1958			goto err_destroy_ports;
  1959	
  1960		/* Set up our datapath device. */
  1961		parms.name = nla_data(a[OVS_DP_ATTR_NAME]);
  1962		parms.type = OVS_VPORT_TYPE_INTERNAL;
  1963		parms.options = NULL;
  1964		parms.dp = dp;
  1965		parms.port_no = OVSP_LOCAL;
  1966		parms.upcall_portids = a[OVS_DP_ATTR_UPCALL_PID];
  1967		parms.desired_ifindex = nla_get_s32_default(a[OVS_DP_ATTR_IFINDEX], 0);
  1968	
  1969		/* So far only local changes have been made, now need the lock. */
  1970		ovs_lock();
  1971	
  1972		err = ovs_dp_change(dp, a);
  1973		if (err)
  1974			goto err_unlock_and_destroy_meters;
  1975	
  1976		vport = new_vport(&parms);
  1977		if (IS_ERR(vport)) {
  1978			err = PTR_ERR(vport);
  1979			if (err == -EBUSY)
  1980				err = -EEXIST;
  1981	
  1982			if (err == -EEXIST) {
  1983				/* An outdated user space instance that does not understand
  1984				 * the concept of user_features has attempted to create a new
  1985				 * datapath and is likely to reuse it. Drop all user features.
  1986				 */
  1987				if (info->genlhdr->version < OVS_DP_VER_FEATURES)
  1988					ovs_dp_reset_user_features(skb, info);
  1989			}
  1990	
  1991			goto err_destroy_portids;
  1992		}
  1993	
  1994		err = ovs_dp_cmd_fill_info(dp, reply, info->snd_portid,
  1995					   info->snd_seq, 0, OVS_DP_CMD_NEW);
  1996		BUG_ON(err < 0);
  1997	
  1998		ovs_net = net_generic(ovs_dp_get_net(dp), ovs_net_id);
  1999		list_add_tail_rcu(&dp->list_node, &ovs_net->dps);
  2000	
  2001		ovs_unlock();
  2002	
  2003		ovs_notify(&dp_datapath_genl_family, reply, info);
  2004		return 0;
  2005	
  2006	err_destroy_portids:
  2007		kfree(rcu_dereference_raw(dp->upcall_portids));
  2008	err_unlock_and_destroy_meters:
  2009		ovs_unlock();
  2010		ovs_meters_exit(dp);
  2011	err_destroy_ports:
  2012		kfree(dp->ports);
  2013	err_destroy_stats:
  2014		free_percpu(dp->stats_percpu);
  2015	err_destroy_table:
> 2016		ovs_flow_tbl_put(dp->table);
  2017	err_destroy_dp:
  2018		kfree(dp);
  2019	err_destroy_reply:
  2020		kfree_skb(reply);
  2021	err:
  2022		return err;
  2023	}
  2024	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki