lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <CAMArcTWuycr9PMtx-UvjKA=PxvX0VY6whrVweowq03aqoQ163Q@mail.gmail.com>
Date:   Fri, 6 Sep 2019 00:21:54 +0900
From:   Taehee Yoo <ap420073@...il.com>
To:     Jay Vosburgh <jay.vosburgh@...onical.com>
Cc:     David Miller <davem@...emloft.net>,
        Netdev <netdev@...r.kernel.org>, vfalico@...il.com,
        Andy Gospodarek <andy@...yhouse.net>,
        Jiří Pírko <jiri@...nulli.us>,
        sd@...asysnail.net, Roopa Prabhu <roopa@...ulusnetworks.com>,
        saeedm@...lanox.com, manishc@...vell.com, rahulv@...vell.com,
        kys@...rosoft.com, haiyangz@...rosoft.com, sthemmin@...rosoft.com,
        sashal@...nel.org, hare@...e.de, varun@...lsio.com,
        ubraun@...ux.ibm.com, kgraul@...ux.ibm.com
Subject: Re: [PATCH net 03/11] bonding: split IFF_BONDING into IFF_BONDING and IFF_BONDING_SLAVE

On Thu, 5 Sep 2019 at 04:22, Jay Vosburgh <jay.vosburgh@...onical.com> wrote:
>

Hi Jay,
Thank you for the review!

> Taehee Yoo <ap420073@...il.com> wrote:
>
> >The IFF_BONDING means bonding master or bonding slave device.
> >
> >->ndo_add_slave() sets IFF_BONDING flag and ->ndo_del_slave() removes
> >IFF_BONDING flag.
> >This routine makes a problem in the nesting bonding structure.
> >
> >bond1<--bond2
> >
> >Both bond0 and bond1 are bonding device and these should keep having
> >IFF_BONDING flag until they are removed.
> >But bond1 would lose IFF_BONDING at ->ndo_del_slave because that routine
> >can not check whether the slave device is the bonding type or not.
> >So that this patch splits the IFF_BONDING into theIFF_BONDING and
> >the IFF_BONDING_SLAVE. The IFF_BONDING is bonding master flag and
> >IFF_BONDING_SLAVE is bonding slave flag.
> >
> >Test commands:
> >    ip link add bond0 type bond
> >    ip link add bond1 type bond
> >    ip link set bond1 master bond0
> >    ip link set bond1 nomaster
> >    ip link del bond1 type bond
> >    ip link add bond1 type bond
> >
> >Splat looks like:
> >[  149.201107] proc_dir_entry 'bonding/bond1' already registered
> >[  149.208013] WARNING: CPU: 1 PID: 1308 at fs/proc/generic.c:361 proc_register+0x2a9/0x3e0
> >[  149.208866] Modules linked in: bonding veth openvswitch nsh nf_conncount nf_nat nf_conntrack nf_defrag_ipv4 ip_tables6
> >[  149.208866] CPU: 1 PID: 1308 Comm: ip Not tainted 5.3.0-rc7+ #322
> >[  149.208866] RIP: 0010:proc_register+0x2a9/0x3e0
> >[  149.208866] Code: 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 39 01 00 00 48 8b 04 24 48 89 ea 48 c7 c7 a0 a0 13 89 48 8b b0 0
> >[  149.208866] RSP: 0018:ffff88810df9f098 EFLAGS: 00010286
> >[  149.208866] RAX: dffffc0000000008 RBX: ffff8880b5d3aa50 RCX: ffffffff87cdec92
> >[  149.208866] RDX: 0000000000000001 RSI: 0000000000000008 RDI: ffff888116bf6a8c
> >[  149.208866] RBP: ffff8880b5d3acd3 R08: ffffed1022d7ff71 R09: ffffed1022d7ff71
> >[  149.208866] R10: 0000000000000001 R11: ffffed1022d7ff70 R12: ffff8880b5d3abe8
> >[  149.208866] R13: ffff8880b5d3acd2 R14: dffffc0000000000 R15: ffffed1016ba759a
> >[  149.208866] FS:  00007f4bd1f650c0(0000) GS:ffff888116a00000(0000) knlGS:0000000000000000
> >[  149.208866] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> >[  149.208866] CR2: 000055e7ca686118 CR3: 0000000106fd4000 CR4: 00000000001006e0
> >[  149.208866] Call Trace:
> >[  149.208866]  proc_create_seq_private+0xb3/0xf0
> >[  149.208866]  bond_create_proc_entry+0x1b3/0x3f0 [bonding]
> >[  149.208866]  bond_netdev_event+0x433/0x970 [bonding]
> >[  149.208866]  ? __module_text_address+0x13/0x140
> >[  149.208866]  notifier_call_chain+0x90/0x160
> >[  149.208866]  register_netdevice+0x9b3/0xd70
> >[  149.208866]  ? alloc_netdev_mqs+0x854/0xc10
> >[  149.208866]  ? netdev_change_features+0xa0/0xa0
> >[  149.208866]  ? rtnl_create_link+0x2ed/0xad0
> >[  149.208866]  bond_newlink+0x2a/0x60 [bonding]
> >[  149.208866]  __rtnl_newlink+0xb75/0x1180
> >[  ... ]
> >
> >Fixes: 0b680e753724 ("[PATCH] bonding: Add priv_flag to avoid event mishandling")
>
>         I'm not sure this Fixes is technically correct, as I don't think
> nesting bonds has induced an oops since 2006.  I don't think nesting
> bonds really does anything useful, but it's been allowed for years (but
> has been broken on and off all that time) so I'm a bit leery of simply
> disallowing nesting of bonds for fear it would break something already
> in use.
>
>         In any event, it would be desirable if this fix could be changed
> to not need a new priv_flag, as this patch would consume the last free
> bit in netdev_priv_flags.  A bond master device that is also a slave
> should have IFF_MASTER set in dev->flags, which could be tested at
> removal time to avoid clearing IFF_BONDING.
>

I have been testing another way that doesn't add a new flag and that
just checks IFF_MASTER and IFF_BONDING when an interface is being deleted.
I think it is simple and works well. so I will send a v2 patch after
some more tests.
Thank you!


>         -J
>
> >Signed-off-by: Taehee Yoo <ap420073@...il.com>
> >---
> > drivers/net/bonding/bond_main.c                     | 13 +++++--------
> > .../net/ethernet/qlogic/netxen/netxen_nic_main.c    |  2 +-
> > drivers/net/hyperv/netvsc_drv.c                     |  3 +--
> > drivers/scsi/fcoe/fcoe.c                            |  2 +-
> > drivers/target/iscsi/cxgbit/cxgbit_cm.c             |  2 +-
> > include/linux/netdevice.h                           |  9 ++++++---
> > 6 files changed, 15 insertions(+), 16 deletions(-)
> >
> >diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
> >index 931d9d935686..abd008c31c9a 100644
> >--- a/drivers/net/bonding/bond_main.c
> >+++ b/drivers/net/bonding/bond_main.c
> >@@ -1560,7 +1560,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
> >               goto err_restore_mac;
> >       }
> >
> >-      slave_dev->priv_flags |= IFF_BONDING;
> >+      slave_dev->priv_flags |= IFF_BONDING_SLAVE;
> >       /* initialize slave stats */
> >       dev_get_stats(new_slave->dev, &new_slave->slave_stats);
> >
> >@@ -1816,7 +1816,7 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev,
> >       slave_disable_netpoll(new_slave);
> >
> > err_close:
> >-      slave_dev->priv_flags &= ~IFF_BONDING;
> >+      slave_dev->priv_flags &= ~IFF_BONDING_SLAVE;
> >       dev_close(slave_dev);
> >
> > err_restore_mac:
> >@@ -2017,7 +2017,7 @@ static int __bond_release_one(struct net_device *bond_dev,
> >       else
> >               dev_set_mtu(slave_dev, slave->original_mtu);
> >
> >-      slave_dev->priv_flags &= ~IFF_BONDING;
> >+      slave_dev->priv_flags &= ~IFF_BONDING_SLAVE;
> >
> >       bond_free_slave(slave);
> >
> >@@ -3221,10 +3221,7 @@ static int bond_netdev_event(struct notifier_block *this,
> >       netdev_dbg(event_dev, "%s received %s\n",
> >                  __func__, netdev_cmd_to_name(event));
> >
> >-      if (!(event_dev->priv_flags & IFF_BONDING))
> >-              return NOTIFY_DONE;
> >-
> >-      if (event_dev->flags & IFF_MASTER) {
> >+      if (netif_is_bond_master(event_dev)) {
> >               int ret;
> >
> >               ret = bond_master_netdev_event(event, event_dev);
> >@@ -3232,7 +3229,7 @@ static int bond_netdev_event(struct notifier_block *this,
> >                       return ret;
> >       }
> >
> >-      if (event_dev->flags & IFF_SLAVE)
> >+      if (netif_is_bond_slave(event_dev))
> >               return bond_slave_netdev_event(event, event_dev);
> >
> >       return NOTIFY_DONE;
> >diff --git a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
> >index 58e2eaf77014..5e0389ba1f13 100644
> >--- a/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
> >+++ b/drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
> >@@ -3340,7 +3340,7 @@ static void netxen_config_master(struct net_device *dev, unsigned long event)
> >        * released and is dev_close()ed in bond_release()
> >        * just before IFF_BONDING is stripped.
> >        */
> >-      if (!master && dev->priv_flags & IFF_BONDING)
> >+      if (!master && netif_is_bond_slave(dev))
> >               netxen_free_ip_list(adapter, true);
> > }
> >
> >diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
> >index e8fce6d715ef..6831202d9bcb 100644
> >--- a/drivers/net/hyperv/netvsc_drv.c
> >+++ b/drivers/net/hyperv/netvsc_drv.c
> >@@ -2439,8 +2439,7 @@ static int netvsc_netdev_event(struct notifier_block *this,
> >               return NOTIFY_DONE;
> >
> >       /* Avoid Bonding master dev with same MAC registering as VF */
> >-      if ((event_dev->priv_flags & IFF_BONDING) &&
> >-          (event_dev->flags & IFF_MASTER))
> >+      if (netif_is_bond_master(event_dev))
> >               return NOTIFY_DONE;
> >
> >       switch (event) {
> >diff --git a/drivers/scsi/fcoe/fcoe.c b/drivers/scsi/fcoe/fcoe.c
> >index 00dd47bcbb1e..750a6540eb9d 100644
> >--- a/drivers/scsi/fcoe/fcoe.c
> >+++ b/drivers/scsi/fcoe/fcoe.c
> >@@ -307,7 +307,7 @@ static int fcoe_interface_setup(struct fcoe_interface *fcoe,
> >       }
> >
> >       /* Do not support for bonding device */
> >-      if (netdev->priv_flags & IFF_BONDING && netdev->flags & IFF_MASTER) {
> >+      if (netif_is_bond_master(netdev)) {
> >               FCOE_NETDEV_DBG(netdev, "Bonded interfaces not supported\n");
> >               return -EOPNOTSUPP;
> >       }
> >diff --git a/drivers/target/iscsi/cxgbit/cxgbit_cm.c b/drivers/target/iscsi/cxgbit/cxgbit_cm.c
> >index c70caf4ea490..16c8cae333b2 100644
> >--- a/drivers/target/iscsi/cxgbit/cxgbit_cm.c
> >+++ b/drivers/target/iscsi/cxgbit/cxgbit_cm.c
> >@@ -247,7 +247,7 @@ struct cxgbit_device *cxgbit_find_device(struct net_device *ndev, u8 *port_id)
> >
> > static struct net_device *cxgbit_get_real_dev(struct net_device *ndev)
> > {
> >-      if (ndev->priv_flags & IFF_BONDING) {
> >+      if (netif_is_bond_master(ndev) || netif_is_bond_slave(ndev)) {
> >               pr_err("Bond devices are not supported. Interface:%s\n",
> >                      ndev->name);
> >               return NULL;
> >diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
> >index 5bb5756129af..a2c47f43e54b 100644
> >--- a/include/linux/netdevice.h
> >+++ b/include/linux/netdevice.h
> >@@ -1441,7 +1441,7 @@ struct net_device_ops {
> >  *
> >  * @IFF_802_1Q_VLAN: 802.1Q VLAN device
> >  * @IFF_EBRIDGE: Ethernet bridging device
> >- * @IFF_BONDING: bonding master or slave
> >+ * @IFF_BONDING: bonding master
> >  * @IFF_ISATAP: ISATAP interface (RFC4214)
> >  * @IFF_WAN_HDLC: WAN HDLC device
> >  * @IFF_XMIT_DST_RELEASE: dev_hard_start_xmit() is allowed to
> >@@ -1474,6 +1474,7 @@ struct net_device_ops {
> >  * @IFF_FAILOVER_SLAVE: device is lower dev of a failover master device
> >  * @IFF_L3MDEV_RX_HANDLER: only invoke the rx handler of L3 master device
> >  * @IFF_LIVE_RENAME_OK: rename is allowed while device is up and running
> >+ * @IFF_BONDING_SLAVE: bonding slave
> >  */
> > enum netdev_priv_flags {
> >       IFF_802_1Q_VLAN                 = 1<<0,
> >@@ -1507,6 +1508,7 @@ enum netdev_priv_flags {
> >       IFF_FAILOVER_SLAVE              = 1<<28,
> >       IFF_L3MDEV_RX_HANDLER           = 1<<29,
> >       IFF_LIVE_RENAME_OK              = 1<<30,
> >+      IFF_BONDING_SLAVE               = 1<<31,
> > };
> >
> > #define IFF_802_1Q_VLAN                       IFF_802_1Q_VLAN
> >@@ -1539,6 +1541,7 @@ enum netdev_priv_flags {
> > #define IFF_FAILOVER_SLAVE            IFF_FAILOVER_SLAVE
> > #define IFF_L3MDEV_RX_HANDLER         IFF_L3MDEV_RX_HANDLER
> > #define IFF_LIVE_RENAME_OK            IFF_LIVE_RENAME_OK
> >+#define IFF_BONDING_SLAVE             IFF_BONDING_SLAVE
> >
> > /**
> >  *    struct net_device - The DEVICE structure.
> >@@ -4569,12 +4572,12 @@ static inline bool netif_is_macvlan_port(const struct net_device *dev)
> >
> > static inline bool netif_is_bond_master(const struct net_device *dev)
> > {
> >-      return dev->flags & IFF_MASTER && dev->priv_flags & IFF_BONDING;
> >+      return dev->priv_flags & IFF_BONDING;
> > }
> >
> > static inline bool netif_is_bond_slave(const struct net_device *dev)
> > {
> >-      return dev->flags & IFF_SLAVE && dev->priv_flags & IFF_BONDING;
> >+      return dev->priv_flags & IFF_BONDING_SLAVE;
> > }
> >
> > static inline bool netif_supports_nofcs(struct net_device *dev)
> >--
> >2.17.1
> >
>
> ---
>         -Jay Vosburgh, jay.vosburgh@...onical.com

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ