04 Dec, 2015

1 commit

  • Each openvswitch tunnel vport (vxlan,gre,geneve) holds a reference
    to the underlying tunnel device, but never released it when such
    device is deleted.
    Deleting the underlying device via the ip tool cause the kernel to
    hangup in the netdev_wait_allrefs() loop.
    This commit ensure that on device unregistration dp_detach_port_notify()
    is called for all vports that hold the device reference, properly
    releasing it.

    Fixes: 614732eaa12d ("openvswitch: Use regular VXLAN net_device device")
    Fixes: b2acd1dc3949 ("openvswitch: Use regular GRE net_device instead of vport")
    Fixes: 6b001e682e90 ("openvswitch: Use Geneve device.")
    Signed-off-by: Paolo Abeni
    Acked-by: Flavio Leitner
    Acked-by: Pravin B Shelar
    Signed-off-by: David S. Miller

    Paolo Abeni
     

22 Jul, 2015

1 commit

  • This is the first step in representing all OVS vports as regular
    struct net_devices. Move the net_device pointer into the vport
    structure itself to get rid of struct vport_netdev.

    Signed-off-by: Thomas Graf
    Signed-off-by: Pravin B Shelar
    Signed-off-by: David S. Miller

    Thomas Graf
     

20 Nov, 2013

3 commits

  • Register generic netlink multicast groups as an array with
    the family and give them contiguous group IDs. Then instead
    of passing the global group ID to the various functions that
    send messages, pass the ID relative to the family - for most
    families that's just 0 because the only have one group.

    This avoids the list_head and ID in each group, adding a new
    field for the mcast group ID offset to the family.

    At the same time, this allows us to prevent abusing groups
    again like the quota and dropmon code did, since we can now
    check that a family only uses a group it owns.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • This doesn't really change anything, but prepares for the
    next patch that will change the APIs to pass the group ID
    within the family, rather than the global group ID.

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     
  • Add a static inline to generic netlink to wrap netlink_set_err()
    to make it easier to use here - use it in openvswitch (the only
    generic netlink user of netlink_set_err()).

    Signed-off-by: Johannes Berg
    Signed-off-by: David S. Miller

    Johannes Berg
     

17 Oct, 2013

1 commit

  • The combination of two commits:
    commit 8e4e1713e4
    ("openvswitch: Simplify datapath locking.")
    commit 2537b4dd0a
    ("openvswitch:: link upper device for port devices")

    introduced a bug where upper_dev wasn't unlinked upon
    netdev_unregister notification

    The following steps:

    modprobe openvswitch
    ovs-dpctl add-dp test
    ip tuntap add dev tap1 mode tap
    ovs-dpctl add-if test tap1
    ip tuntap del dev tap1 mode tap

    are causing multiple warnings:

    [ 62.747557] gre: GRE over IPv4 demultiplexor driver
    [ 62.749579] openvswitch: Open vSwitch switching datapath
    [ 62.755087] device test entered promiscuous mode
    [ 62.765911] device tap1 entered promiscuous mode
    [ 62.766033] IPv6: ADDRCONF(NETDEV_UP): tap1: link is not ready
    [ 62.769017] ------------[ cut here ]------------
    [ 62.769022] WARNING: CPU: 1 PID: 3267 at net/core/dev.c:5501 rollback_registered_many+0x20f/0x240()
    [ 62.769023] Modules linked in: openvswitch gre vxlan ip_tunnel libcrc32c ip6table_filter ip6_tables ebtable_nat ebtables nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_CHECKSUM iptable_mangle ipt_REJECT xt_tcpudp iptable_filter ip_tables x_tables bridge stp llc vhost_net macvtap macvlan vhost kvm_intel kvm dm_crypt iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi hid_generic mxm_wmi eeepc_wmi asus_wmi sparse_keymap dm_multipath psmouse serio_raw usbhid hid parport_pc ppdev firewire_ohci lpc_ich firewire_core e1000e crc_itu_t binfmt_misc igb dca ptp pps_core mac_hid wmi lp parport i2o_config i2o_block video
    [ 62.769051] CPU: 1 PID: 3267 Comm: ip Not tainted 3.12.0-rc3+ #60
    [ 62.769052] Hardware name: System manufacturer System Product Name/P8Z77 WS, BIOS 3007 07/26/2012
    [ 62.769053] 0000000000000009 ffff8807f25cbd28 ffffffff8175e575 0000000000000006
    [ 62.769055] 0000000000000000 ffff8807f25cbd68 ffffffff8105314c ffff8807f25cbd58
    [ 62.769057] ffff8807f2634000 ffff8807f25cbdc8 ffff8807f25cbd88 ffff8807f25cbdc8
    [ 62.769059] Call Trace:
    [ 62.769062] [] dump_stack+0x55/0x76
    [ 62.769065] [] warn_slowpath_common+0x8c/0xc0
    [ 62.769067] [] warn_slowpath_null+0x1a/0x20
    [ 62.769069] [] rollback_registered_many+0x20f/0x240
    [ 62.769071] [] rollback_registered+0x31/0x40
    [ 62.769073] [] unregister_netdevice_queue+0x58/0x90
    [ 62.769075] [] __tun_detach+0x140/0x340
    [ 62.769077] [] tun_chr_close+0x36/0x60
    [ 62.769080] [] __fput+0xff/0x260
    [ 62.769082] [] ____fput+0xe/0x10
    [ 62.769084] [] task_work_run+0xb5/0xe0
    [ 62.769087] [] do_notify_resume+0x59/0x80
    [ 62.769089] [] ? trace_hardirqs_on_thunk+0x3a/0x3f
    [ 62.769091] [] int_signal+0x12/0x17
    [ 62.769093] ---[ end trace 838756c62e156ffb ]---
    [ 62.769481] ------------[ cut here ]------------
    [ 62.769485] WARNING: CPU: 1 PID: 92 at fs/sysfs/inode.c:325 sysfs_hash_and_remove+0xa9/0xb0()
    [ 62.769486] sysfs: can not remove 'master', no directory
    [ 62.769486] Modules linked in: openvswitch gre vxlan ip_tunnel libcrc32c ip6table_filter ip6_tables ebtable_nat ebtables nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_CHECKSUM iptable_mangle ipt_REJECT xt_tcpudp iptable_filter ip_tables x_tables bridge stp llc vhost_net macvtap macvlan vhost kvm_intel kvm dm_crypt iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi hid_generic mxm_wmi eeepc_wmi asus_wmi sparse_keymap dm_multipath psmouse serio_raw usbhid hid parport_pc ppdev firewire_ohci lpc_ich firewire_core e1000e crc_itu_t binfmt_misc igb dca ptp pps_core mac_hid wmi lp parport i2o_config i2o_block video
    [ 62.769514] CPU: 1 PID: 92 Comm: kworker/1:2 Tainted: G W 3.12.0-rc3+ #60
    [ 62.769515] Hardware name: System manufacturer System Product Name/P8Z77 WS, BIOS 3007 07/26/2012
    [ 62.769518] Workqueue: events ovs_dp_notify_wq [openvswitch]
    [ 62.769519] 0000000000000009 ffff880807ad3ac8 ffffffff8175e575 0000000000000006
    [ 62.769521] ffff880807ad3b18 ffff880807ad3b08 ffffffff8105314c ffff880807ad3b28
    [ 62.769523] 0000000000000000 ffffffff81a87a1f ffff8807f2634000 ffff880037038500
    [ 62.769525] Call Trace:
    [ 62.769528] [] dump_stack+0x55/0x76
    [ 62.769529] [] warn_slowpath_common+0x8c/0xc0
    [ 62.769531] [] warn_slowpath_fmt+0x46/0x50
    [ 62.769533] [] sysfs_hash_and_remove+0xa9/0xb0
    [ 62.769535] [] sysfs_remove_link+0x26/0x30
    [ 62.769538] [] __netdev_adjacent_dev_remove+0xf7/0x150
    [ 62.769540] [] __netdev_adjacent_dev_unlink_lists+0x27/0x50
    [ 62.769542] [] __netdev_adjacent_dev_unlink_neighbour+0x3a/0x50
    [ 62.769544] [] netdev_upper_dev_unlink+0x3d/0x140
    [ 62.769548] [] netdev_destroy+0x4b/0x80 [openvswitch]
    [ 62.769550] [] ovs_vport_del+0x46/0x60 [openvswitch]
    [ 62.769552] [] ovs_dp_detach_port+0x44/0x60 [openvswitch]
    [ 62.769555] [] ovs_dp_notify_wq+0xb4/0x150 [openvswitch]
    [ 62.769557] [] process_one_work+0x1d8/0x6a0
    [ 62.769559] [] ? process_one_work+0x178/0x6a0
    [ 62.769562] [] worker_thread+0x11b/0x370
    [ 62.769564] [] ? rescuer_thread+0x350/0x350
    [ 62.769566] [] kthread+0xea/0xf0
    [ 62.769568] [] ? flush_kthread_worker+0x150/0x150
    [ 62.769570] [] ret_from_fork+0x7c/0xb0
    [ 62.769572] [] ? flush_kthread_worker+0x150/0x150
    [ 62.769573] ---[ end trace 838756c62e156ffc ]---
    [ 62.769574] ------------[ cut here ]------------
    [ 62.769576] WARNING: CPU: 1 PID: 92 at fs/sysfs/inode.c:325 sysfs_hash_and_remove+0xa9/0xb0()
    [ 62.769577] sysfs: can not remove 'upper_test', no directory
    [ 62.769577] Modules linked in: openvswitch gre vxlan ip_tunnel libcrc32c ip6table_filter ip6_tables ebtable_nat ebtables nf_conntrack_ipv4 nf_defrag_ipv4 xt_state nf_conntrack xt_CHECKSUM iptable_mangle ipt_REJECT xt_tcpudp iptable_filter ip_tables x_tables bridge stp llc vhost_net macvtap macvlan vhost kvm_intel kvm dm_crypt iscsi_tcp libiscsi_tcp libiscsi scsi_transport_iscsi hid_generic mxm_wmi eeepc_wmi asus_wmi sparse_keymap dm_multipath psmouse serio_raw usbhid hid parport_pc ppdev firewire_ohci lpc_ich firewire_core e1000e crc_itu_t binfmt_misc igb dca ptp pps_core mac_hid wmi lp parport i2o_config i2o_block video
    [ 62.769603] CPU: 1 PID: 92 Comm: kworker/1:2 Tainted: G W 3.12.0-rc3+ #60
    [ 62.769604] Hardware name: System manufacturer System Product Name/P8Z77 WS, BIOS 3007 07/26/2012
    [ 62.769606] Workqueue: events ovs_dp_notify_wq [openvswitch]
    [ 62.769607] 0000000000000009 ffff880807ad3ac8 ffffffff8175e575 0000000000000006
    [ 62.769609] ffff880807ad3b18 ffff880807ad3b08 ffffffff8105314c ffff880807ad3b58
    [ 62.769611] 0000000000000000 ffff880807ad3bd9 ffff8807f2634000 ffff880037038500
    [ 62.769613] Call Trace:
    [ 62.769615] [] dump_stack+0x55/0x76
    [ 62.769617] [] warn_slowpath_common+0x8c/0xc0
    [ 62.769619] [] warn_slowpath_fmt+0x46/0x50
    [ 62.769621] [] sysfs_hash_and_remove+0xa9/0xb0
    [ 62.769622] [] sysfs_remove_link+0x26/0x30
    [ 62.769624] [] __netdev_adjacent_dev_remove+0x122/0x150
    [ 62.769627] [] __netdev_adjacent_dev_unlink_lists+0x27/0x50
    [ 62.769629] [] __netdev_adjacent_dev_unlink_neighbour+0x3a/0x50
    [ 62.769631] [] netdev_upper_dev_unlink+0x3d/0x140
    [ 62.769633] [] netdev_destroy+0x4b/0x80 [openvswitch]
    [ 62.769636] [] ovs_vport_del+0x46/0x60 [openvswitch]
    [ 62.769638] [] ovs_dp_detach_port+0x44/0x60 [openvswitch]
    [ 62.769640] [] ovs_dp_notify_wq+0xb4/0x150 [openvswitch]
    [ 62.769642] [] process_one_work+0x1d8/0x6a0
    [ 62.769644] [] ? process_one_work+0x178/0x6a0
    [ 62.769646] [] worker_thread+0x11b/0x370
    [ 62.769648] [] ? rescuer_thread+0x350/0x350
    [ 62.769650] [] kthread+0xea/0xf0
    [ 62.769652] [] ? flush_kthread_worker+0x150/0x150
    [ 62.769654] [] ret_from_fork+0x7c/0xb0
    [ 62.769656] [] ? flush_kthread_worker+0x150/0x150
    [ 62.769657] ---[ end trace 838756c62e156ffd ]---
    [ 62.769724] device tap1 left promiscuous mode

    This patch also affects moving devices between net namespaces.

    OVS used to ignore netns move notifications which caused problems.
    Like:
    ovs-dpctl add-if test tap1
    ip link set tap1 netns 3512
    and then removing tap1 inside the namespace will cause hang on missing dev_put.

    With this patch OVS will detach dev upon receiving netns move event.

    Signed-off-by: Alexei Starovoitov
    Signed-off-by: Jesse Gross

    Alexei Starovoitov
     

29 May, 2013

1 commit

  • So far, only net_device * could be passed along with netdevice notifier
    event. This patch provides a possibility to pass custom structure
    able to provide info that event listener needs to know.

    Signed-off-by: Jiri Pirko

    v2->v3: fix typo on simeth
    shortened dev_getter
    shortened notifier_info struct name
    v1->v2: fix notifier_call parameter in call_netdevice_notifier()
    Signed-off-by: David S. Miller

    Jiri Pirko
     

16 Apr, 2013

1 commit

  • Currently OVS uses combination of genl and rtnl lock to protect
    datapath state. This was done due to networking stack locking.
    But this has complicated locking and there are few lock ordering
    issues with new tunneling protocols.
    Following patch simplifies locking by introducing new ovs mutex
    and now this lock is used to protect entire ovs state.

    Signed-off-by: Pravin B Shelar
    Signed-off-by: Jesse Gross

    Pravin B Shelar
     

23 Aug, 2012

1 commit

  • Following patch adds support for network namespace to openvswitch.
    Since it must release devices when namespaces are destroyed, a
    side effect of this patch is that the module no longer keeps a
    refcount but instead cleans up any state when it is unloaded.

    Signed-off-by: Pravin B Shelar
    Signed-off-by: Jesse Gross

    Pravin B Shelar
     

04 May, 2012

1 commit


04 Dec, 2011

1 commit

  • Open vSwitch is a multilayer Ethernet switch targeted at virtualized
    environments. In addition to supporting a variety of features
    expected in a traditional hardware switch, it enables fine-grained
    programmatic extension and flow-based control of the network.
    This control is useful in a wide variety of applications but is
    particularly important in multi-server virtualization deployments,
    which are often characterized by highly dynamic endpoints and the need
    to maintain logical abstractions for multiple tenants.

    The Open vSwitch datapath provides an in-kernel fast path for packet
    forwarding. It is complemented by a userspace daemon, ovs-vswitchd,
    which is able to accept configuration from a variety of sources and
    translate it into packet processing rules.

    See http://openvswitch.org for more information and userspace
    utilities.

    Signed-off-by: Jesse Gross

    Jesse Gross