16 Apr, 2014

1 commit

  • In the dst->output() path for ipv4, the code assumes the skb it has to
    transmit is attached to an inet socket, specifically via
    ip_mc_output() : The sk_mc_loop() test triggers a WARN_ON() when the
    provider of the packet is an AF_PACKET socket.

    The dst->output() method gets an additional 'struct sock *sk'
    parameter. This needs a cascade of changes so that this parameter can
    be propagated from vxlan to final consumer.

    Fixes: 8f646c922d55 ("vxlan: keep original skb ownership")
    Reported-by: lucien xin
    Signed-off-by: Eric Dumazet
    Signed-off-by: David S. Miller

    Eric Dumazet
     

30 Mar, 2014

1 commit


29 Mar, 2014

1 commit

  • There are two problematic situations.

    A deadlock can happen when is_percpu is false because it can get
    interrupted while holding the spinlock. Then it executes
    ovs_flow_stats_update() in softirq context which tries to get
    the same lock.

    The second sitation is that when is_percpu is true, the code
    correctly disables BH but only for the local CPU, so the
    following can happen when locking the remote CPU without
    disabling BH:

    CPU#0 CPU#1
    ovs_flow_stats_get()
    stats_read()
    +->spin_lock remote CPU#1 ovs_flow_stats_get()
    | stats_read()
    | ... +--> spin_lock remote CPU#0
    | |
    | ovs_flow_stats_update() | ...
    | spin_lock local CPU#0

    =================================
    [ INFO: inconsistent lock state ]
    3.14.0-rc8-00007-g632b06a #1 Tainted: G I
    ---------------------------------
    inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
    swapper/0/0 [HC0[0]:SC1[5]:HE1:SE0] takes:
    (&(&cpu_stats->lock)->rlock){+.?...}, at: [] ovs_flow_stats_update+0x51/0xd0 [openvswitch]
    {SOFTIRQ-ON-W} state was registered at:
    [] __lock_acquire+0x68f/0x1c40
    [] lock_acquire+0xa2/0x1d0
    [] _raw_spin_lock+0x3e/0x80
    [] ovs_flow_stats_get+0xc4/0x1e0 [openvswitch]
    [] ovs_flow_cmd_fill_info+0x185/0x360 [openvswitch]
    [] ovs_flow_cmd_build_info.constprop.27+0x55/0x90 [openvswitch]
    [] ovs_flow_cmd_new_or_set+0x4dd/0x570 [openvswitch]
    [] genl_family_rcv_msg+0x1cd/0x3f0
    [] genl_rcv_msg+0x8e/0xd0
    [] netlink_rcv_skb+0xa9/0xc0
    [] genl_rcv+0x28/0x40
    [] netlink_unicast+0x100/0x1e0
    [] netlink_sendmsg+0x347/0x770
    [] sock_sendmsg+0x9c/0xe0
    [] ___sys_sendmsg+0x3a9/0x3c0
    [] __sys_sendmsg+0x51/0x90
    [] SyS_sendmsg+0x12/0x20
    [] system_call_fastpath+0x16/0x1b
    irq event stamp: 1740726
    hardirqs last enabled at (1740726): [] ip6_finish_output2+0x4f0/0x840
    hardirqs last disabled at (1740725): [] ip6_finish_output2+0x4ab/0x840
    softirqs last enabled at (1740674): [] _local_bh_enable+0x22/0x50
    softirqs last disabled at (1740675): [] irq_exit+0xc5/0xd0

    other info that might help us debug this:
    Possible unsafe locking scenario:

    CPU0
    ----
    lock(&(&cpu_stats->lock)->rlock);

    lock(&(&cpu_stats->lock)->rlock);

    *** DEADLOCK ***

    5 locks held by swapper/0/0:
    #0: (((&ifa->dad_timer))){+.-...}, at: [] call_timer_fn+0x5/0x320
    #1: (rcu_read_lock){.+.+..}, at: [] mld_sendpack+0x5/0x4a0
    #2: (rcu_read_lock_bh){.+....}, at: [] ip6_finish_output2+0x59/0x840
    #3: (rcu_read_lock_bh){.+....}, at: [] __dev_queue_xmit+0x5/0x9b0
    #4: (rcu_read_lock){.+.+..}, at: [] internal_dev_xmit+0x5/0x110 [openvswitch]

    stack backtrace:
    CPU: 0 PID: 0 Comm: swapper/0 Tainted: G I 3.14.0-rc8-00007-g632b06a #1
    Hardware name: /DX58SO, BIOS SOX5810J.86A.5599.2012.0529.2218 05/29/2012
    0000000000000000 0fcf20709903df0c ffff88042d603808 ffffffff817cfe3c
    ffffffff81c134c0 ffff88042d603858 ffffffff817cb6da 0000000000000005
    ffffffff00000001 ffff880400000000 0000000000000006 ffffffff81c134c0
    Call Trace:
    [] dump_stack+0x4d/0x66
    [] print_usage_bug+0x1f4/0x205
    [] ? check_usage_backwards+0x180/0x180
    [] mark_lock+0x223/0x2b0
    [] __lock_acquire+0x623/0x1c40
    [] ? __lock_is_held+0x57/0x80
    [] ? masked_flow_lookup+0x236/0x250 [openvswitch]
    [] lock_acquire+0xa2/0x1d0
    [] ? ovs_flow_stats_update+0x51/0xd0 [openvswitch]
    [] _raw_spin_lock+0x3e/0x80
    [] ? ovs_flow_stats_update+0x51/0xd0 [openvswitch]
    [] ovs_flow_stats_update+0x51/0xd0 [openvswitch]
    [] ovs_dp_process_received_packet+0x84/0x120 [openvswitch]
    [] ? __lock_acquire+0x347/0x1c40
    [] ovs_vport_receive+0x2a/0x30 [openvswitch]
    [] internal_dev_xmit+0x68/0x110 [openvswitch]
    [] ? internal_dev_xmit+0x5/0x110 [openvswitch]
    [] dev_hard_start_xmit+0x2e6/0x8b0
    [] __dev_queue_xmit+0x417/0x9b0
    [] ? __dev_queue_xmit+0x5/0x9b0
    [] ? ip6_finish_output2+0x4f0/0x840
    [] dev_queue_xmit+0x10/0x20
    [] ip6_finish_output2+0x551/0x840
    [] ? ip6_finish_output+0x9a/0x220
    [] ip6_finish_output+0x9a/0x220
    [] ip6_output+0x4f/0x1f0
    [] mld_sendpack+0x1d9/0x4a0
    [] mld_send_initial_cr.part.32+0x88/0xa0
    [] ? addrconf_dad_completed+0x220/0x220
    [] ipv6_mc_dad_complete+0x31/0x50
    [] addrconf_dad_completed+0x147/0x220
    [] ? addrconf_dad_completed+0x220/0x220
    [] addrconf_dad_timer+0x19f/0x1c0
    [] call_timer_fn+0x99/0x320
    [] ? call_timer_fn+0x5/0x320
    [] ? addrconf_dad_completed+0x220/0x220
    [] run_timer_softirq+0x254/0x3b0
    [] __do_softirq+0x12d/0x480

    Signed-off-by: Flavio Leitner
    Signed-off-by: David S. Miller

    Flavio Leitner
     

28 Mar, 2014

1 commit

  • skb_zerocopy can copy elements of the frags array between skbs, but it doesn't
    orphan them. Also, it doesn't handle errors, so this patch takes care of that
    as well, and modify the callers accordingly. skb_tx_error() is also added to
    the callers so they will signal the failed delivery towards the creator of the
    skb.

    Signed-off-by: Zoltan Kiss
    Signed-off-by: David S. Miller

    Zoltan Kiss
     

26 Mar, 2014

1 commit


21 Mar, 2014

1 commit

  • The kernel starts out its "jiffies" timer as 5 minutes below zero, as
    shown in include/linux/jiffies.h:

    /*
    * Have the 32 bit jiffies value wrap 5 minutes after boot
    * so jiffies wrap bugs show up earlier.
    */
    #define INITIAL_JIFFIES ((unsigned long)(unsigned int) (-300*HZ))

    The loop in ovs_flow_stats_get() starts out with 'used' set to 0, then
    takes any "later" time. This means that for the first five minutes after
    boot, flows will always be reported as never used, since 0 is greater than
    any time already seen.

    Signed-off-by: Ben Pfaff
    Acked-by: Pravin B Shelar
    Signed-off-by: Jesse Gross

    Ben Pfaff
     

15 Mar, 2014

1 commit

  • Replace the bh safe variant with the hard irq safe variant.

    We need a hard irq safe variant to deal with netpoll transmitting
    packets from hard irq context, and we need it in most if not all of
    the places using the bh safe variant.

    Except on 32bit uni-processor the code is exactly the same so don't
    bother with a bh variant, just have a hard irq safe variant that
    everyone can use.

    Signed-off-by: "Eric W. Biederman"
    Signed-off-by: David S. Miller

    Eric W. Biederman
     

16 Feb, 2014

3 commits


15 Feb, 2014

2 commits

  • Openvswitch defines u64_stats_sync as ->sync rather than ->syncp,
    so fails to compile with netdev_alloc_pcpu_stats(). So just rename it to ->syncp.

    Reported-by: kbuild test robot
    Fixes: 1c213bd24ad04f4430031 (net: introduce netdev_alloc_pcpu_stats() for drivers)
    Cc: David S. Miller
    Signed-off-by: Cong Wang
    Reviewed-by: Flavio Leitner
    Signed-off-by: David S. Miller

    WANG Cong
     
  • There are many drivers calling alloc_percpu() to allocate pcpu stats
    and then initializing ->syncp. So just introduce a helper function for them.

    Cc: David S. Miller
    Signed-off-by: Cong Wang
    Signed-off-by: David S. Miller

    WANG Cong
     

05 Feb, 2014

5 commits

  • With subfacets, we'd expect megaflow updates message to carry
    the original micro flow. If not, EINVAL is returned and kernel
    logs an error message. Now that the user space subfacet layer is
    removed, it is expected that flow updates can arrive with a
    micro flow other than the original. Change the return code to
    EEXIST and remove the kernel error log message.

    Reported-by: Ben Pfaff
    Signed-off-by: Andy Zhou
    Signed-off-by: Jesse Gross

    Andy Zhou
     
  • ovs_flow_free() is not called under ovs-lock during packet
    execute path (ovs_packet_cmd_execute()). Since packet execute
    does not touch flow->mask, there is no need to take that
    lock either. So move assert in case where flow->mask is checked.

    Found by code inspection.

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

    Pravin B Shelar
     
  • commit 43d4be9cb55f3bac5253e9289996fd9d735531db (openvswitch: Allow user space
    to announce ability to accept unaligned Netlink messages) introduced
    OVS_DP_ATTR_USER_FEATURES netlink attribute in datapath responses,
    but the attribute size was not taken into account in ovs_dp_cmd_msg_size().

    Signed-off-by: Daniele Di Proietto
    Signed-off-by: Jesse Gross

    Daniele Di Proietto
     
  • Both mega flow mask's reference counter and per flow table mask list
    should only be accessed when holding ovs_mutex() lock. However
    this is not true with ovs_flow_table_flush(). The patch fixes this bug.

    Reported-by: Joe Stringer
    Signed-off-by: Andy Zhou
    Signed-off-by: Jesse Gross

    Andy Zhou
     
  • While the zerocopy method is correctly omitted if user space
    does not support unaligned Netlink messages. The attribute is
    still not padded correctly as skb_zerocopy() will not ensure
    padding and the attribute size is no longer pre calculated
    though nla_reserve() which ensured padding previously.

    This patch applies appropriate padding if a linear data copy
    was performed in skb_zerocopy().

    Signed-off-by: Thomas Graf
    Acked-by: Zoltan Kiss
    Signed-off-by: Jesse Gross

    Thomas Graf
     

15 Jan, 2014

1 commit


10 Jan, 2014

1 commit


07 Jan, 2014

15 commits

  • Jesse Gross says:

    ====================
    [GIT net-next] Open vSwitch

    Open vSwitch changes for net-next/3.14. Highlights are:
    * Performance improvements in the mechanism to get packets to userspace
    using memory mapped netlink and skb zero copy where appropriate.
    * Per-cpu flow stats in situations where flows are likely to be shared
    across CPUs. Standard flow stats are used in other situations to save
    memory and allocation time.
    * A handful of code cleanups and rationalization.
    ====================

    Signed-off-by: David S. Miller

    David S. Miller
     
  • Several functions and datastructures could be local
    Found with 'make namespacecheck'

    Signed-off-by: Stephen Hemminger
    Signed-off-by: Jesse Gross

    Stephen Hemminger
     
  • The copy & csum optimization is no longer present with zerocopy
    enabled. Compute the checksum in skb_gso_segment() directly by
    dropping the HW CSUM capability from the features passed in.

    Signed-off-by: Thomas Graf
    Signed-off-by: Jesse Gross

    Thomas Graf
     
  • Use of skb_zerocopy() can avoid the expensive call to memcpy()
    when copying the packet data into the Netlink skb. Completes
    checksum through skb_checksum_help() if not already done in
    GSO segmentation.

    Zerocopy is only performed if user space supported unaligned
    Netlink messages. memory mapped netlink i/o is preferred over
    zerocopy if it is set up.

    Cost of upcall is significantly reduced from:
    + 7.48% vhost-8471 [k] memcpy
    + 5.57% ovs-vswitchd [k] memcpy
    + 2.81% vhost-8471 [k] csum_partial_copy_generic

    to:
    + 5.72% ovs-vswitchd [k] memcpy
    + 3.32% vhost-5153 [k] memcpy
    + 0.68% vhost-5153 [k] skb_zerocopy

    (megaflows disabled)

    Signed-off-by: Thomas Graf
    Signed-off-by: Jesse Gross

    Thomas Graf
     
  • Allows removing the net and dp_ifindex argument and simplify the
    code.

    Signed-off-by: Thomas Graf
    Signed-off-by: Jesse Gross

    Thomas Graf
     
  • Drop user features if an outdated user space instance that does not
    understand the concept of user_features attempted to create a new
    datapath.

    Signed-off-by: Thomas Graf
    Signed-off-by: Jesse Gross

    Thomas Graf
     
  • Signed-off-by: Thomas Graf
    Reviewed-by: Daniel Borkmann
    Signed-off-by: Jesse Gross

    Thomas Graf
     
  • Remove duplicated include.

    Signed-off-by: Wei Yongjun
    Signed-off-by: Jesse Gross

    Wei Yongjun
     
  • As we're only doing a kfree() anyway in the RCU callback, we can
    simply use kfree_rcu, which does the same job, and remove the
    function rcu_free_sw_flow_mask_cb() and rcu_free_acts_callback().

    Signed-off-by: Daniel Borkmann
    Signed-off-by: Jesse Gross

    Daniel Borkmann
     
  • With mega flow implementation ovs flow can be shared between
    multiple CPUs which makes stats updates highly contended
    operation. This patch uses per-CPU stats in cases where a flow
    is likely to be shared (if there is a wildcard in the 5-tuple
    and therefore likely to be spread by RSS). In other situations,
    it uses the current strategy, saving memory and allocation time.

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

    Pravin B Shelar
     
  • Use memory mapped Netlink i/o for all unicast openvswitch
    communication if a ring has been set up.

    Benchmark
    * pktgen -> ovs internal port
    * 5M pkts, 5M flows
    * 4 threads, 8 cores

    Before:
    Result: OK: 67418743(c67108212+d310530) usec, 5000000 (9000byte,0frags)
    74163pps 5339Mb/sec (5339736000bps) errors: 0
    + 2.98% ovs-vswitchd [k] copy_user_generic_string
    + 2.49% ovs-vswitchd [k] memcpy
    + 1.84% kpktgend_2 [k] memcpy
    + 1.81% kpktgend_1 [k] memcpy
    + 1.81% kpktgend_3 [k] memcpy
    + 1.78% kpktgend_0 [k] memcpy

    After:
    Result: OK: 24229690(c24127165+d102524) usec, 5000000 (9000byte,0frags)
    206358pps 14857Mb/sec (14857776000bps) errors: 0
    + 2.80% ovs-vswitchd [k] memcpy
    + 1.31% kpktgend_2 [k] memcpy
    + 1.23% kpktgend_0 [k] memcpy
    + 1.09% kpktgend_1 [k] memcpy
    + 1.04% kpktgend_3 [k] memcpy
    + 0.96% ovs-vswitchd [k] copy_user_generic_string

    Signed-off-by: Thomas Graf
    Reviewed-by: Daniel Borkmann
    Signed-off-by: Jesse Gross

    Thomas Graf
     
  • Flow lookup can happen either in packet processing context or userspace
    context but it was annotated as requiring RCU read lock to be held. This
    also allows OVS mutex to be held without causing warnings.

    Reported-by: Justin Pettit
    Signed-off-by: Jesse Gross
    Reviewed-by: Thomas Graf

    Jesse Gross
     
  • API changes only for code readability. No functional chnages.

    This patch removes the underscored version. Added a new API
    ovs_flow_tbl_lookup_stats() that returns the n_mask_hits.

    Reported by: Ben Pfaff
    Reviewed-by: Thomas Graf
    Signed-off-by: Andy Zhou
    Signed-off-by: Jesse Gross

    Andy Zhou
     
  • We won't normally have a ton of flow masks but using a size_t to store
    values no bigger than sizeof(struct sw_flow_key) seems excessive.

    This reduces sw_flow_key_range and sw_flow_mask by 4 bytes on 32-bit
    systems. On 64-bit systems it shrinks sw_flow_key_range by 12 bytes but
    sw_flow_mask only by 8 bytes due to padding.

    Compile tested only.

    Signed-off-by: Ben Pfaff
    Acked-by: Andy Zhou
    Signed-off-by: Jesse Gross

    Ben Pfaff
     
  • Signed-off-by: Ben Pfaff
    Signed-off-by: Jesse Gross

    Ben Pfaff
     

05 Jan, 2014

1 commit


18 Dec, 2013

2 commits

  • In several places 'skb->rxhash = 0' is being done to clear the
    rxhash value in an skb. This does not clear l4_rxhash which could
    still be set so that the rxhash wouldn't be recalculated on subsequent
    call to skb_get_rxhash. This patch adds an explict function to clear
    all the rxhash related information in the skb properly.

    skb_clear_hash_if_not_l4 clears the rxhash only if it is not marked as
    l4_rxhash.

    Fixed up places where 'skb->rxhash = 0' was being called.

    Signed-off-by: Tom Herbert
    Signed-off-by: David S. Miller

    Tom Herbert
     
  • Currently OVS uses jhash2() for calculating flow hashes in its
    internal flow_hash() function. The performance of the flow_hash()
    function is critical, as the input data can be hundreds of bytes
    long.

    OVS is largely deployed in x86_64 based datacenters. Therefore,
    we argue that the performance critical fast path of OVS should
    exploit underlying CPU features in order to reduce the per packet
    processing costs. We replace jhash2 with the hash implementation
    provided by the kernel hash lib, which exploits the crc32l
    instruction to achieve high performance

    Our patch greatly reduces the hash footprint from ~200 cycles of
    jhash2() to around ~90 cycles in case of ovs_flow_hash_crc()
    (measured with rdtsc over maximum length flow keys on an i7 Intel
    CPU).

    Additionally, we wrote a microbenchmark to stress the flow table
    performance. The benchmark inserts random flows into the flow
    hash and then performs lookups. Our hash deployed on a CRC32
    capable CPU reduces the lookup for 1000 flows, 100 masks from
    ~10,100us to ~6,700us, for example.

    Thus, simply use the newly introduced arch_fast_hash2() as a
    drop-in replacement.

    Signed-off-by: Francesco Fusco
    Signed-off-by: Daniel Borkmann
    Signed-off-by: Thomas Graf
    Acked-by: Jesse Gross
    Signed-off-by: David S. Miller

    Francesco Fusco
     

20 Nov, 2013

3 commits

  • Pull networking fixes from David Miller:
    "Mostly these are fixes for fallout due to merge window changes, as
    well as cures for problems that have been with us for a much longer
    period of time"

    1) Johannes Berg noticed two major deficiencies in our genetlink
    registration. Some genetlink protocols we passing in constant
    counts for their ops array rather than something like
    ARRAY_SIZE(ops) or similar. Also, some genetlink protocols were
    using fixed IDs for their multicast groups.

    We have to retain these fixed IDs to keep existing userland tools
    working, but reserve them so that other multicast groups used by
    other protocols can not possibly conflict.

    In dealing with these two problems, we actually now use less state
    management for genetlink operations and multicast groups.

    2) When configuring interface hardware timestamping, fix several
    drivers that simply do not validate that the hwtstamp_config value
    is one the driver actually supports. From Ben Hutchings.

    3) Invalid memory references in mwifiex driver, from Amitkumar Karwar.

    4) In dev_forward_skb(), set the skb->protocol in the right order
    relative to skb_scrub_packet(). From Alexei Starovoitov.

    5) Bridge erroneously fails to use the proper wrapper functions to make
    calls to netdev_ops->ndo_vlan_rx_{add,kill}_vid. Fix from Toshiaki
    Makita.

    6) When detaching a bridge port, make sure to flush all VLAN IDs to
    prevent them from leaking, also from Toshiaki Makita.

    7) Put in a compromise for TCP Small Queues so that deep queued devices
    that delay TX reclaim non-trivially don't have such a performance
    decrease. One particularly problematic area is 802.11 AMPDU in
    wireless. From Eric Dumazet.

    8) Fix crashes in tcp_fastopen_cache_get(), we can see NULL socket dsts
    here. Fix from Eric Dumzaet, reported by Dave Jones.

    9) Fix use after free in ipv6 SIT driver, from Willem de Bruijn.

    10) When computing mergeable buffer sizes, virtio-net fails to take the
    virtio-net header into account. From Michael Dalton.

    11) Fix seqlock deadlock in ip4_datagram_connect() wrt. statistic
    bumping, this one has been with us for a while. From Eric Dumazet.

    12) Fix NULL deref in the new TIPC fragmentation handling, from Erik
    Hugne.

    13) 6lowpan bit used for traffic classification was wrong, from Jukka
    Rissanen.

    14) macvlan has the same issue as normal vlans did wrt. propagating LRO
    disabling down to the real device, fix it the same way. From Michal
    Kubecek.

    15) CPSW driver needs to soft reset all slaves during suspend, from
    Daniel Mack.

    16) Fix small frame pacing in FQ packet scheduler, from Eric Dumazet.

    17) The xen-netfront RX buffer refill timer isn't properly scheduled on
    partial RX allocation success, from Ma JieYue.

    18) When ipv6 ping protocol support was added, the AF_INET6 protocol
    initialization cleanup path on failure was borked a little. Fix
    from Vlad Yasevich.

    19) If a socket disconnects during a read/recvmsg/recvfrom/etc that
    blocks we can do the wrong thing with the msg_name we write back to
    userspace. From Hannes Frederic Sowa. There is another fix in the
    works from Hannes which will prevent future problems of this nature.

    20) Fix route leak in VTI tunnel transmit, from Fan Du.

    * git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (106 commits)
    genetlink: make multicast groups const, prevent abuse
    genetlink: pass family to functions using groups
    genetlink: add and use genl_set_err()
    genetlink: remove family pointer from genl_multicast_group
    genetlink: remove genl_unregister_mc_group()
    hsr: don't call genl_unregister_mc_group()
    quota/genetlink: use proper genetlink multicast APIs
    drop_monitor/genetlink: use proper genetlink multicast APIs
    genetlink: only pass array to genl_register_family_with_ops()
    tcp: don't update snd_nxt, when a socket is switched from repair mode
    atm: idt77252: fix dev refcnt leak
    xfrm: Release dst if this dst is improper for vti tunnel
    netlink: fix documentation typo in netlink_set_err()
    be2net: Delete secondary unicast MAC addresses during be_close
    be2net: Fix unconditional enabling of Rx interface options
    net, virtio_net: replace the magic value
    ping: prevent NULL pointer dereference on write to msg_name
    bnx2x: Prevent "timeout waiting for state X"
    bnx2x: prevent CFC attention
    bnx2x: Prevent panic during DMAE timeout
    ...

    Linus Torvalds
     
  • 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