[<prev] [next>] [day] [month] [year] [list]
Message-ID: <a9ef6ddb-7f90-4cf3-b720-fedf1f5e4810@stanley.mountain>
Date: Mon, 3 Mar 2025 10:15:43 +0300
From: Dan Carpenter <dan.carpenter@...aro.org>
To: oe-kbuild@...ts.linux.dev, Charles Han <hanchunchao@...pur.com>
Cc: lkp@...el.com, oe-kbuild-all@...ts.linux.dev,
linux-kernel@...r.kernel.org, Felix Fietkau <nbd@....name>
Subject: drivers/net/wireless/mediatek/mt76/mt7925/main.c:2005
mt7925_change_vif_links() warn: inconsistent returns '&dev->mt76.mutex'.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master
head: 7eb172143d5508b4da468ed59ee857c6e5e01da6
commit: 5cd0bd815c8a48862a296df9b30e0ea0da14acd3 wifi: mt76: mt7925: fix NULL deref check in mt7925_change_vif_links
config: i386-randconfig-141-20250303 (https://download.01.org/0day-ci/archive/20250303/202503031055.3ZRqxhAl-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
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 <lkp@...el.com>
| Reported-by: Dan Carpenter <dan.carpenter@...aro.org>
| Closes: https://lore.kernel.org/r/202503031055.3ZRqxhAl-lkp@intel.com/
New smatch warnings:
drivers/net/wireless/mediatek/mt76/mt7925/main.c:2005 mt7925_change_vif_links() warn: inconsistent returns '&dev->mt76.mutex'.
vim +2005 drivers/net/wireless/mediatek/mt76/mt7925/main.c
69acd6d910b0c83 Sean Wang 2024-07-06 1901 static int
69acd6d910b0c83 Sean Wang 2024-07-06 1902 mt7925_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
69acd6d910b0c83 Sean Wang 2024-07-06 1903 u16 old_links, u16 new_links,
69acd6d910b0c83 Sean Wang 2024-07-06 1904 struct ieee80211_bss_conf *old[IEEE80211_MLD_MAX_NUM_LINKS])
69acd6d910b0c83 Sean Wang 2024-07-06 1905 {
69acd6d910b0c83 Sean Wang 2024-07-06 1906 struct mt792x_bss_conf *mconfs[IEEE80211_MLD_MAX_NUM_LINKS] = {}, *mconf;
69acd6d910b0c83 Sean Wang 2024-07-06 1907 struct mt792x_link_sta *mlinks[IEEE80211_MLD_MAX_NUM_LINKS] = {}, *mlink;
69acd6d910b0c83 Sean Wang 2024-07-06 1908 struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
69acd6d910b0c83 Sean Wang 2024-07-06 1909 unsigned long add = new_links & ~old_links;
69acd6d910b0c83 Sean Wang 2024-07-06 1910 unsigned long rem = old_links & ~new_links;
69acd6d910b0c83 Sean Wang 2024-07-06 1911 struct mt792x_dev *dev = mt792x_hw_dev(hw);
69acd6d910b0c83 Sean Wang 2024-07-06 1912 struct mt792x_phy *phy = mt792x_hw_phy(hw);
69acd6d910b0c83 Sean Wang 2024-07-06 1913 struct ieee80211_bss_conf *link_conf;
69acd6d910b0c83 Sean Wang 2024-07-06 1914 unsigned int link_id;
69acd6d910b0c83 Sean Wang 2024-07-06 1915 int err;
69acd6d910b0c83 Sean Wang 2024-07-06 1916
69acd6d910b0c83 Sean Wang 2024-07-06 1917 if (old_links == new_links)
69acd6d910b0c83 Sean Wang 2024-07-06 1918 return 0;
69acd6d910b0c83 Sean Wang 2024-07-06 1919
69acd6d910b0c83 Sean Wang 2024-07-06 1920 mt792x_mutex_acquire(dev);
^^^^^^^^^^^^^^^^^^^^^^^^^^
Locked.
69acd6d910b0c83 Sean Wang 2024-07-06 1921
69acd6d910b0c83 Sean Wang 2024-07-06 1922 for_each_set_bit(link_id, &rem, IEEE80211_MLD_MAX_NUM_LINKS) {
69acd6d910b0c83 Sean Wang 2024-07-06 1923 mconf = mt792x_vif_to_link(mvif, link_id);
69acd6d910b0c83 Sean Wang 2024-07-06 1924 mlink = mt792x_sta_to_link(&mvif->sta, link_id);
69acd6d910b0c83 Sean Wang 2024-07-06 1925
69acd6d910b0c83 Sean Wang 2024-07-06 1926 if (!mconf || !mlink)
69acd6d910b0c83 Sean Wang 2024-07-06 1927 continue;
69acd6d910b0c83 Sean Wang 2024-07-06 1928
69acd6d910b0c83 Sean Wang 2024-07-06 1929 if (mconf != &mvif->bss_conf) {
69acd6d910b0c83 Sean Wang 2024-07-06 1930 mt792x_mac_link_bss_remove(dev, mconf, mlink);
69acd6d910b0c83 Sean Wang 2024-07-06 1931 devm_kfree(dev->mt76.dev, mconf);
69acd6d910b0c83 Sean Wang 2024-07-06 1932 devm_kfree(dev->mt76.dev, mlink);
69acd6d910b0c83 Sean Wang 2024-07-06 1933 }
69acd6d910b0c83 Sean Wang 2024-07-06 1934
69acd6d910b0c83 Sean Wang 2024-07-06 1935 rcu_assign_pointer(mvif->link_conf[link_id], NULL);
69acd6d910b0c83 Sean Wang 2024-07-06 1936 rcu_assign_pointer(mvif->sta.link[link_id], NULL);
69acd6d910b0c83 Sean Wang 2024-07-06 1937 }
69acd6d910b0c83 Sean Wang 2024-07-06 1938
69acd6d910b0c83 Sean Wang 2024-07-06 1939 for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
69acd6d910b0c83 Sean Wang 2024-07-06 1940 if (!old_links) {
9f89f05bef1a573 Sean Wang 2024-07-06 1941 mvif->deflink_id = link_id;
69acd6d910b0c83 Sean Wang 2024-07-06 1942 mconf = &mvif->bss_conf;
69acd6d910b0c83 Sean Wang 2024-07-06 1943 mlink = &mvif->sta.deflink;
69acd6d910b0c83 Sean Wang 2024-07-06 1944 } else {
69acd6d910b0c83 Sean Wang 2024-07-06 1945 mconf = devm_kzalloc(dev->mt76.dev, sizeof(*mconf),
69acd6d910b0c83 Sean Wang 2024-07-06 1946 GFP_KERNEL);
69acd6d910b0c83 Sean Wang 2024-07-06 1947 mlink = devm_kzalloc(dev->mt76.dev, sizeof(*mlink),
69acd6d910b0c83 Sean Wang 2024-07-06 1948 GFP_KERNEL);
5cd0bd815c8a488 Charles Han 2024-10-25 1949 if (!mconf || !mlink)
5cd0bd815c8a488 Charles Han 2024-10-25 1950 return -ENOMEM;
Call mt792x_mutex_release(dev) before returning.
69acd6d910b0c83 Sean Wang 2024-07-06 1951 }
69acd6d910b0c83 Sean Wang 2024-07-06 1952
69acd6d910b0c83 Sean Wang 2024-07-06 1953 mconfs[link_id] = mconf;
69acd6d910b0c83 Sean Wang 2024-07-06 1954 mlinks[link_id] = mlink;
69acd6d910b0c83 Sean Wang 2024-07-06 1955 mconf->link_id = link_id;
69acd6d910b0c83 Sean Wang 2024-07-06 1956 mconf->vif = mvif;
69acd6d910b0c83 Sean Wang 2024-07-06 1957 mlink->wcid.link_id = link_id;
4f0f33d2747f207 Sean Wang 2024-07-06 1958 mlink->wcid.link_valid = !!vif->valid_links;
b1d21403c0cfe71 Sean Wang 2024-07-06 1959 mlink->wcid.def_wcid = &mvif->sta.deflink.wcid;
69acd6d910b0c83 Sean Wang 2024-07-06 1960 }
69acd6d910b0c83 Sean Wang 2024-07-06 1961
69acd6d910b0c83 Sean Wang 2024-07-06 1962 if (hweight16(mvif->valid_links) == 0)
69acd6d910b0c83 Sean Wang 2024-07-06 1963 mt792x_mac_link_bss_remove(dev, &mvif->bss_conf,
69acd6d910b0c83 Sean Wang 2024-07-06 1964 &mvif->sta.deflink);
69acd6d910b0c83 Sean Wang 2024-07-06 1965
69acd6d910b0c83 Sean Wang 2024-07-06 1966 for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
69acd6d910b0c83 Sean Wang 2024-07-06 1967 mconf = mconfs[link_id];
69acd6d910b0c83 Sean Wang 2024-07-06 1968 mlink = mlinks[link_id];
69acd6d910b0c83 Sean Wang 2024-07-06 1969 link_conf = mt792x_vif_to_bss_conf(vif, link_id);
69acd6d910b0c83 Sean Wang 2024-07-06 1970
69acd6d910b0c83 Sean Wang 2024-07-06 1971 rcu_assign_pointer(mvif->link_conf[link_id], mconf);
69acd6d910b0c83 Sean Wang 2024-07-06 1972 rcu_assign_pointer(mvif->sta.link[link_id], mlink);
69acd6d910b0c83 Sean Wang 2024-07-06 1973
69acd6d910b0c83 Sean Wang 2024-07-06 1974 err = mt7925_mac_link_bss_add(dev, link_conf, mlink);
69acd6d910b0c83 Sean Wang 2024-07-06 1975 if (err < 0)
69acd6d910b0c83 Sean Wang 2024-07-06 1976 goto free;
69acd6d910b0c83 Sean Wang 2024-07-06 1977
69acd6d910b0c83 Sean Wang 2024-07-06 1978 if (mconf != &mvif->bss_conf) {
69acd6d910b0c83 Sean Wang 2024-07-06 1979 err = mt7925_set_mlo_roc(phy, &mvif->bss_conf,
69acd6d910b0c83 Sean Wang 2024-07-06 1980 vif->active_links);
69acd6d910b0c83 Sean Wang 2024-07-06 1981 if (err < 0)
69acd6d910b0c83 Sean Wang 2024-07-06 1982 goto free;
69acd6d910b0c83 Sean Wang 2024-07-06 1983 }
69acd6d910b0c83 Sean Wang 2024-07-06 1984 }
69acd6d910b0c83 Sean Wang 2024-07-06 1985
69acd6d910b0c83 Sean Wang 2024-07-06 1986 mvif->valid_links = new_links;
69acd6d910b0c83 Sean Wang 2024-07-06 1987
69acd6d910b0c83 Sean Wang 2024-07-06 1988 mt792x_mutex_release(dev);
69acd6d910b0c83 Sean Wang 2024-07-06 1989
69acd6d910b0c83 Sean Wang 2024-07-06 1990 return 0;
69acd6d910b0c83 Sean Wang 2024-07-06 1991
69acd6d910b0c83 Sean Wang 2024-07-06 1992 free:
69acd6d910b0c83 Sean Wang 2024-07-06 1993 for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
69acd6d910b0c83 Sean Wang 2024-07-06 1994 rcu_assign_pointer(mvif->link_conf[link_id], NULL);
69acd6d910b0c83 Sean Wang 2024-07-06 1995 rcu_assign_pointer(mvif->sta.link[link_id], NULL);
69acd6d910b0c83 Sean Wang 2024-07-06 1996
69acd6d910b0c83 Sean Wang 2024-07-06 1997 if (mconf != &mvif->bss_conf)
69acd6d910b0c83 Sean Wang 2024-07-06 1998 devm_kfree(dev->mt76.dev, mconfs[link_id]);
69acd6d910b0c83 Sean Wang 2024-07-06 1999 if (mlink != &mvif->sta.deflink)
69acd6d910b0c83 Sean Wang 2024-07-06 2000 devm_kfree(dev->mt76.dev, mlinks[link_id]);
69acd6d910b0c83 Sean Wang 2024-07-06 2001 }
69acd6d910b0c83 Sean Wang 2024-07-06 2002
69acd6d910b0c83 Sean Wang 2024-07-06 2003 mt792x_mutex_release(dev);
69acd6d910b0c83 Sean Wang 2024-07-06 2004
69acd6d910b0c83 Sean Wang 2024-07-06 @2005 return err;
69acd6d910b0c83 Sean Wang 2024-07-06 2006 }
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
Powered by blists - more mailing lists