All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Yang Yingliang <yangyingliang@huawei.com>,
	linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	bridge@lists.linux-foundation.org
Cc: kbuild-all@lists.01.org, roopa@nvidia.com, nikolay@nvidia.com,
	davem@davemloft.net, kuba@kernel.org
Subject: Re: [PATCH net] net: bridge: fix memleak in br_add_if()
Date: Mon, 9 Aug 2021 13:02:24 +0800	[thread overview]
Message-ID: <202108091245.BRAtXYRh-lkp@intel.com> (raw)
In-Reply-To: <20210809030135.2445844-1-yangyingliang@huawei.com>

[-- Attachment #1: Type: text/plain, Size: 7948 bytes --]

Hi Yang,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net/master]

url:    https://github.com/0day-ci/linux/commits/Yang-Yingliang/net-bridge-fix-memleak-in-br_add_if/20210809-105706
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git 3125f26c514826077f2a4490b75e9b1c7a644c42
config: parisc-randconfig-r013-20210809 (attached as .config)
compiler: hppa-linux-gcc (GCC) 10.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/1c7f031037ef82751f6ec66247c59d87c301b732
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Yang-Yingliang/net-bridge-fix-memleak-in-br_add_if/20210809-105706
        git checkout 1c7f031037ef82751f6ec66247c59d87c301b732
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross O=build_dir ARCH=parisc SHELL=/bin/bash net/bridge/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   net/bridge/br_if.c: In function 'br_add_if':
>> net/bridge/br_if.c:619:16: error: 'struct net_bridge_port' has no member named 'mcast_stats'
     619 |   free_percpu(p->mcast_stats);
         |                ^~
   net/bridge/br_if.c:733:15: error: 'struct net_bridge_port' has no member named 'mcast_stats'
     733 |  free_percpu(p->mcast_stats);
         |               ^~


vim +619 net/bridge/br_if.c

   557	
   558	/* called with RTNL */
   559	int br_add_if(struct net_bridge *br, struct net_device *dev,
   560		      struct netlink_ext_ack *extack)
   561	{
   562		struct net_bridge_port *p;
   563		int err = 0;
   564		unsigned br_hr, dev_hr;
   565		bool changed_addr, fdb_synced = false;
   566	
   567		/* Don't allow bridging non-ethernet like devices. */
   568		if ((dev->flags & IFF_LOOPBACK) ||
   569		    dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN ||
   570		    !is_valid_ether_addr(dev->dev_addr))
   571			return -EINVAL;
   572	
   573		/* Also don't allow bridging of net devices that are DSA masters, since
   574		 * the bridge layer rx_handler prevents the DSA fake ethertype handler
   575		 * to be invoked, so we don't get the chance to strip off and parse the
   576		 * DSA switch tag protocol header (the bridge layer just returns
   577		 * RX_HANDLER_CONSUMED, stopping RX processing for these frames).
   578		 * The only case where that would not be an issue is when bridging can
   579		 * already be offloaded, such as when the DSA master is itself a DSA
   580		 * or plain switchdev port, and is bridged only with other ports from
   581		 * the same hardware device.
   582		 */
   583		if (netdev_uses_dsa(dev)) {
   584			list_for_each_entry(p, &br->port_list, list) {
   585				if (!netdev_port_same_parent_id(dev, p->dev)) {
   586					NL_SET_ERR_MSG(extack,
   587						       "Cannot do software bridging with a DSA master");
   588					return -EINVAL;
   589				}
   590			}
   591		}
   592	
   593		/* No bridging of bridges */
   594		if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit) {
   595			NL_SET_ERR_MSG(extack,
   596				       "Can not enslave a bridge to a bridge");
   597			return -ELOOP;
   598		}
   599	
   600		/* Device has master upper dev */
   601		if (netdev_master_upper_dev_get(dev))
   602			return -EBUSY;
   603	
   604		/* No bridging devices that dislike that (e.g. wireless) */
   605		if (dev->priv_flags & IFF_DONT_BRIDGE) {
   606			NL_SET_ERR_MSG(extack,
   607				       "Device does not allow enslaving to a bridge");
   608			return -EOPNOTSUPP;
   609		}
   610	
   611		p = new_nbp(br, dev);
   612		if (IS_ERR(p))
   613			return PTR_ERR(p);
   614	
   615		call_netdevice_notifiers(NETDEV_JOIN, dev);
   616	
   617		err = dev_set_allmulti(dev, 1);
   618		if (err) {
 > 619			free_percpu(p->mcast_stats);
   620			kfree(p);	/* kobject not yet init'd, manually free */
   621			goto err1;
   622		}
   623	
   624		err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
   625					   SYSFS_BRIDGE_PORT_ATTR);
   626		if (err)
   627			goto err2;
   628	
   629		err = br_sysfs_addif(p);
   630		if (err)
   631			goto err2;
   632	
   633		err = br_netpoll_enable(p);
   634		if (err)
   635			goto err3;
   636	
   637		err = netdev_rx_handler_register(dev, br_get_rx_handler(dev), p);
   638		if (err)
   639			goto err4;
   640	
   641		dev->priv_flags |= IFF_BRIDGE_PORT;
   642	
   643		err = netdev_master_upper_dev_link(dev, br->dev, NULL, NULL, extack);
   644		if (err)
   645			goto err5;
   646	
   647		err = nbp_switchdev_mark_set(p);
   648		if (err)
   649			goto err6;
   650	
   651		dev_disable_lro(dev);
   652	
   653		list_add_rcu(&p->list, &br->port_list);
   654	
   655		nbp_update_port_count(br);
   656		if (!br_promisc_port(p) && (p->dev->priv_flags & IFF_UNICAST_FLT)) {
   657			/* When updating the port count we also update all ports'
   658			 * promiscuous mode.
   659			 * A port leaving promiscuous mode normally gets the bridge's
   660			 * fdb synced to the unicast filter (if supported), however,
   661			 * `br_port_clear_promisc` does not distinguish between
   662			 * non-promiscuous ports and *new* ports, so we need to
   663			 * sync explicitly here.
   664			 */
   665			fdb_synced = br_fdb_sync_static(br, p) == 0;
   666			if (!fdb_synced)
   667				netdev_err(dev, "failed to sync bridge static fdb addresses to this port\n");
   668		}
   669	
   670		netdev_update_features(br->dev);
   671	
   672		br_hr = br->dev->needed_headroom;
   673		dev_hr = netdev_get_fwd_headroom(dev);
   674		if (br_hr < dev_hr)
   675			update_headroom(br, dev_hr);
   676		else
   677			netdev_set_rx_headroom(dev, br_hr);
   678	
   679		if (br_fdb_insert(br, p, dev->dev_addr, 0))
   680			netdev_err(dev, "failed insert local address bridge forwarding table\n");
   681	
   682		if (br->dev->addr_assign_type != NET_ADDR_SET) {
   683			/* Ask for permission to use this MAC address now, even if we
   684			 * don't end up choosing it below.
   685			 */
   686			err = dev_pre_changeaddr_notify(br->dev, dev->dev_addr, extack);
   687			if (err)
   688				goto err7;
   689		}
   690	
   691		err = nbp_vlan_init(p, extack);
   692		if (err) {
   693			netdev_err(dev, "failed to initialize vlan filtering on this port\n");
   694			goto err7;
   695		}
   696	
   697		spin_lock_bh(&br->lock);
   698		changed_addr = br_stp_recalculate_bridge_id(br);
   699	
   700		if (netif_running(dev) && netif_oper_up(dev) &&
   701		    (br->dev->flags & IFF_UP))
   702			br_stp_enable_port(p);
   703		spin_unlock_bh(&br->lock);
   704	
   705		br_ifinfo_notify(RTM_NEWLINK, NULL, p);
   706	
   707		if (changed_addr)
   708			call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev);
   709	
   710		br_mtu_auto_adjust(br);
   711		br_set_gso_limits(br);
   712	
   713		kobject_uevent(&p->kobj, KOBJ_ADD);
   714	
   715		return 0;
   716	
   717	err7:
   718		if (fdb_synced)
   719			br_fdb_unsync_static(br, p);
   720		list_del_rcu(&p->list);
   721		br_fdb_delete_by_port(br, p, 0, 1);
   722		nbp_update_port_count(br);
   723	err6:
   724		netdev_upper_dev_unlink(dev, br->dev);
   725	err5:
   726		dev->priv_flags &= ~IFF_BRIDGE_PORT;
   727		netdev_rx_handler_unregister(dev);
   728	err4:
   729		br_netpoll_disable(p);
   730	err3:
   731		sysfs_remove_link(br->ifobj, p->dev->name);
   732	err2:
   733		free_percpu(p->mcast_stats);
   734		kobject_put(&p->kobj);
   735		dev_set_allmulti(dev, -1);
   736	err1:
   737		dev_put(dev);
   738		return err;
   739	}
   740	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 30268 bytes --]

WARNING: multiple messages have this Message-ID (diff)
From: kernel test robot <lkp@intel.com>
To: kbuild-all@lists.01.org
Subject: Re: [PATCH net] net: bridge: fix memleak in br_add_if()
Date: Mon, 09 Aug 2021 13:02:24 +0800	[thread overview]
Message-ID: <202108091245.BRAtXYRh-lkp@intel.com> (raw)
In-Reply-To: <20210809030135.2445844-1-yangyingliang@huawei.com>

[-- Attachment #1: Type: text/plain, Size: 8175 bytes --]

Hi Yang,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on net/master]

url:    https://github.com/0day-ci/linux/commits/Yang-Yingliang/net-bridge-fix-memleak-in-br_add_if/20210809-105706
base:   https://git.kernel.org/pub/scm/linux/kernel/git/davem/net.git 3125f26c514826077f2a4490b75e9b1c7a644c42
config: parisc-randconfig-r013-20210809 (attached as .config)
compiler: hppa-linux-gcc (GCC) 10.3.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/1c7f031037ef82751f6ec66247c59d87c301b732
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Yang-Yingliang/net-bridge-fix-memleak-in-br_add_if/20210809-105706
        git checkout 1c7f031037ef82751f6ec66247c59d87c301b732
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross O=build_dir ARCH=parisc SHELL=/bin/bash net/bridge/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   net/bridge/br_if.c: In function 'br_add_if':
>> net/bridge/br_if.c:619:16: error: 'struct net_bridge_port' has no member named 'mcast_stats'
     619 |   free_percpu(p->mcast_stats);
         |                ^~
   net/bridge/br_if.c:733:15: error: 'struct net_bridge_port' has no member named 'mcast_stats'
     733 |  free_percpu(p->mcast_stats);
         |               ^~


vim +619 net/bridge/br_if.c

   557	
   558	/* called with RTNL */
   559	int br_add_if(struct net_bridge *br, struct net_device *dev,
   560		      struct netlink_ext_ack *extack)
   561	{
   562		struct net_bridge_port *p;
   563		int err = 0;
   564		unsigned br_hr, dev_hr;
   565		bool changed_addr, fdb_synced = false;
   566	
   567		/* Don't allow bridging non-ethernet like devices. */
   568		if ((dev->flags & IFF_LOOPBACK) ||
   569		    dev->type != ARPHRD_ETHER || dev->addr_len != ETH_ALEN ||
   570		    !is_valid_ether_addr(dev->dev_addr))
   571			return -EINVAL;
   572	
   573		/* Also don't allow bridging of net devices that are DSA masters, since
   574		 * the bridge layer rx_handler prevents the DSA fake ethertype handler
   575		 * to be invoked, so we don't get the chance to strip off and parse the
   576		 * DSA switch tag protocol header (the bridge layer just returns
   577		 * RX_HANDLER_CONSUMED, stopping RX processing for these frames).
   578		 * The only case where that would not be an issue is when bridging can
   579		 * already be offloaded, such as when the DSA master is itself a DSA
   580		 * or plain switchdev port, and is bridged only with other ports from
   581		 * the same hardware device.
   582		 */
   583		if (netdev_uses_dsa(dev)) {
   584			list_for_each_entry(p, &br->port_list, list) {
   585				if (!netdev_port_same_parent_id(dev, p->dev)) {
   586					NL_SET_ERR_MSG(extack,
   587						       "Cannot do software bridging with a DSA master");
   588					return -EINVAL;
   589				}
   590			}
   591		}
   592	
   593		/* No bridging of bridges */
   594		if (dev->netdev_ops->ndo_start_xmit == br_dev_xmit) {
   595			NL_SET_ERR_MSG(extack,
   596				       "Can not enslave a bridge to a bridge");
   597			return -ELOOP;
   598		}
   599	
   600		/* Device has master upper dev */
   601		if (netdev_master_upper_dev_get(dev))
   602			return -EBUSY;
   603	
   604		/* No bridging devices that dislike that (e.g. wireless) */
   605		if (dev->priv_flags & IFF_DONT_BRIDGE) {
   606			NL_SET_ERR_MSG(extack,
   607				       "Device does not allow enslaving to a bridge");
   608			return -EOPNOTSUPP;
   609		}
   610	
   611		p = new_nbp(br, dev);
   612		if (IS_ERR(p))
   613			return PTR_ERR(p);
   614	
   615		call_netdevice_notifiers(NETDEV_JOIN, dev);
   616	
   617		err = dev_set_allmulti(dev, 1);
   618		if (err) {
 > 619			free_percpu(p->mcast_stats);
   620			kfree(p);	/* kobject not yet init'd, manually free */
   621			goto err1;
   622		}
   623	
   624		err = kobject_init_and_add(&p->kobj, &brport_ktype, &(dev->dev.kobj),
   625					   SYSFS_BRIDGE_PORT_ATTR);
   626		if (err)
   627			goto err2;
   628	
   629		err = br_sysfs_addif(p);
   630		if (err)
   631			goto err2;
   632	
   633		err = br_netpoll_enable(p);
   634		if (err)
   635			goto err3;
   636	
   637		err = netdev_rx_handler_register(dev, br_get_rx_handler(dev), p);
   638		if (err)
   639			goto err4;
   640	
   641		dev->priv_flags |= IFF_BRIDGE_PORT;
   642	
   643		err = netdev_master_upper_dev_link(dev, br->dev, NULL, NULL, extack);
   644		if (err)
   645			goto err5;
   646	
   647		err = nbp_switchdev_mark_set(p);
   648		if (err)
   649			goto err6;
   650	
   651		dev_disable_lro(dev);
   652	
   653		list_add_rcu(&p->list, &br->port_list);
   654	
   655		nbp_update_port_count(br);
   656		if (!br_promisc_port(p) && (p->dev->priv_flags & IFF_UNICAST_FLT)) {
   657			/* When updating the port count we also update all ports'
   658			 * promiscuous mode.
   659			 * A port leaving promiscuous mode normally gets the bridge's
   660			 * fdb synced to the unicast filter (if supported), however,
   661			 * `br_port_clear_promisc` does not distinguish between
   662			 * non-promiscuous ports and *new* ports, so we need to
   663			 * sync explicitly here.
   664			 */
   665			fdb_synced = br_fdb_sync_static(br, p) == 0;
   666			if (!fdb_synced)
   667				netdev_err(dev, "failed to sync bridge static fdb addresses to this port\n");
   668		}
   669	
   670		netdev_update_features(br->dev);
   671	
   672		br_hr = br->dev->needed_headroom;
   673		dev_hr = netdev_get_fwd_headroom(dev);
   674		if (br_hr < dev_hr)
   675			update_headroom(br, dev_hr);
   676		else
   677			netdev_set_rx_headroom(dev, br_hr);
   678	
   679		if (br_fdb_insert(br, p, dev->dev_addr, 0))
   680			netdev_err(dev, "failed insert local address bridge forwarding table\n");
   681	
   682		if (br->dev->addr_assign_type != NET_ADDR_SET) {
   683			/* Ask for permission to use this MAC address now, even if we
   684			 * don't end up choosing it below.
   685			 */
   686			err = dev_pre_changeaddr_notify(br->dev, dev->dev_addr, extack);
   687			if (err)
   688				goto err7;
   689		}
   690	
   691		err = nbp_vlan_init(p, extack);
   692		if (err) {
   693			netdev_err(dev, "failed to initialize vlan filtering on this port\n");
   694			goto err7;
   695		}
   696	
   697		spin_lock_bh(&br->lock);
   698		changed_addr = br_stp_recalculate_bridge_id(br);
   699	
   700		if (netif_running(dev) && netif_oper_up(dev) &&
   701		    (br->dev->flags & IFF_UP))
   702			br_stp_enable_port(p);
   703		spin_unlock_bh(&br->lock);
   704	
   705		br_ifinfo_notify(RTM_NEWLINK, NULL, p);
   706	
   707		if (changed_addr)
   708			call_netdevice_notifiers(NETDEV_CHANGEADDR, br->dev);
   709	
   710		br_mtu_auto_adjust(br);
   711		br_set_gso_limits(br);
   712	
   713		kobject_uevent(&p->kobj, KOBJ_ADD);
   714	
   715		return 0;
   716	
   717	err7:
   718		if (fdb_synced)
   719			br_fdb_unsync_static(br, p);
   720		list_del_rcu(&p->list);
   721		br_fdb_delete_by_port(br, p, 0, 1);
   722		nbp_update_port_count(br);
   723	err6:
   724		netdev_upper_dev_unlink(dev, br->dev);
   725	err5:
   726		dev->priv_flags &= ~IFF_BRIDGE_PORT;
   727		netdev_rx_handler_unregister(dev);
   728	err4:
   729		br_netpoll_disable(p);
   730	err3:
   731		sysfs_remove_link(br->ifobj, p->dev->name);
   732	err2:
   733		free_percpu(p->mcast_stats);
   734		kobject_put(&p->kobj);
   735		dev_set_allmulti(dev, -1);
   736	err1:
   737		dev_put(dev);
   738		return err;
   739	}
   740	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org

[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30268 bytes --]

  reply	other threads:[~2021-08-09  5:03 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-09  3:01 [PATCH net] net: bridge: fix memleak in br_add_if() Yang Yingliang
2021-08-09  3:01 ` [Bridge] " Yang Yingliang
2021-08-09  5:02 ` kernel test robot [this message]
2021-08-09  5:02   ` kernel test robot
2021-08-09  9:53 ` kernel test robot
2021-08-09  9:53   ` kernel test robot

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202108091245.BRAtXYRh-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=bridge@lists.linux-foundation.org \
    --cc=davem@davemloft.net \
    --cc=kbuild-all@lists.01.org \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nikolay@nvidia.com \
    --cc=roopa@nvidia.com \
    --cc=yangyingliang@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.