Skip to content
  1. Jan 10, 2020
    • Martin KaFai Lau's avatar
      bpf: Introduce BPF_MAP_TYPE_STRUCT_OPS · 85d33df3
      Martin KaFai Lau authored
      
      
      The patch introduces BPF_MAP_TYPE_STRUCT_OPS.  The map value
      is a kernel struct with its func ptr implemented in bpf prog.
      This new map is the interface to register/unregister/introspect
      a bpf implemented kernel struct.
      
      The kernel struct is actually embedded inside another new struct
      (or called the "value" struct in the code).  For example,
      "struct tcp_congestion_ops" is embbeded in:
      struct bpf_struct_ops_tcp_congestion_ops {
      	refcount_t refcnt;
      	enum bpf_struct_ops_state state;
      	struct tcp_congestion_ops data;  /* <-- kernel subsystem struct here */
      }
      The map value is "struct bpf_struct_ops_tcp_congestion_ops".
      The "bpftool map dump" will then be able to show the
      state ("inuse"/"tobefree") and the number of subsystem's refcnt (e.g.
      number of tcp_sock in the tcp_congestion_ops case).  This "value" struct
      is created automatically by a macro.  Having a separate "value" struct
      will also make extending "struct bpf_struct_ops_XYZ" easier (e.g. adding
      "void (*init)(void)" to "struct bpf_struct_ops_XYZ" to do some
      initialization works before registering the struct_ops to the kernel
      subsystem).  The libbpf will take care of finding and populating the
      "struct bpf_struct_ops_XYZ" from "struct XYZ".
      
      Register a struct_ops to a kernel subsystem:
      1. Load all needed BPF_PROG_TYPE_STRUCT_OPS prog(s)
      2. Create a BPF_MAP_TYPE_STRUCT_OPS with attr->btf_vmlinux_value_type_id
         set to the btf id "struct bpf_struct_ops_tcp_congestion_ops" of the
         running kernel.
         Instead of reusing the attr->btf_value_type_id,
         btf_vmlinux_value_type_id s added such that attr->btf_fd can still be
         used as the "user" btf which could store other useful sysadmin/debug
         info that may be introduced in the furture,
         e.g. creation-date/compiler-details/map-creator...etc.
      3. Create a "struct bpf_struct_ops_tcp_congestion_ops" object as described
         in the running kernel btf.  Populate the value of this object.
         The function ptr should be populated with the prog fds.
      4. Call BPF_MAP_UPDATE with the object created in (3) as
         the map value.  The key is always "0".
      
      During BPF_MAP_UPDATE, the code that saves the kernel-func-ptr's
      args as an array of u64 is generated.  BPF_MAP_UPDATE also allows
      the specific struct_ops to do some final checks in "st_ops->init_member()"
      (e.g. ensure all mandatory func ptrs are implemented).
      If everything looks good, it will register this kernel struct
      to the kernel subsystem.  The map will not allow further update
      from this point.
      
      Unregister a struct_ops from the kernel subsystem:
      BPF_MAP_DELETE with key "0".
      
      Introspect a struct_ops:
      BPF_MAP_LOOKUP_ELEM with key "0".  The map value returned will
      have the prog _id_ populated as the func ptr.
      
      The map value state (enum bpf_struct_ops_state) will transit from:
      INIT (map created) =>
      INUSE (map updated, i.e. reg) =>
      TOBEFREE (map value deleted, i.e. unreg)
      
      The kernel subsystem needs to call bpf_struct_ops_get() and
      bpf_struct_ops_put() to manage the "refcnt" in the
      "struct bpf_struct_ops_XYZ".  This patch uses a separate refcnt
      for the purose of tracking the subsystem usage.  Another approach
      is to reuse the map->refcnt and then "show" (i.e. during map_lookup)
      the subsystem's usage by doing map->refcnt - map->usercnt to filter out
      the map-fd/pinned-map usage.  However, that will also tie down the
      future semantics of map->refcnt and map->usercnt.
      
      The very first subsystem's refcnt (during reg()) holds one
      count to map->refcnt.  When the very last subsystem's refcnt
      is gone, it will also release the map->refcnt.  All bpf_prog will be
      freed when the map->refcnt reaches 0 (i.e. during map_free()).
      
      Here is how the bpftool map command will look like:
      [root@arch-fb-vm1 bpf]# bpftool map show
      6: struct_ops  name dctcp  flags 0x0
      	key 4B  value 256B  max_entries 1  memlock 4096B
      	btf_id 6
      [root@arch-fb-vm1 bpf]# bpftool map dump id 6
      [{
              "value": {
                  "refcnt": {
                      "refs": {
                          "counter": 1
                      }
                  },
                  "state": 1,
                  "data": {
                      "list": {
                          "next": 0,
                          "prev": 0
                      },
                      "key": 0,
                      "flags": 2,
                      "init": 24,
                      "release": 0,
                      "ssthresh": 25,
                      "cong_avoid": 30,
                      "set_state": 27,
                      "cwnd_event": 28,
                      "in_ack_event": 26,
                      "undo_cwnd": 29,
                      "pkts_acked": 0,
                      "min_tso_segs": 0,
                      "sndbuf_expand": 0,
                      "cong_control": 0,
                      "get_info": 0,
                      "name": [98,112,102,95,100,99,116,99,112,0,0,0,0,0,0,0
                      ],
                      "owner": 0
                  }
              }
          }
      ]
      
      Misc Notes:
      * bpf_struct_ops_map_sys_lookup_elem() is added for syscall lookup.
        It does an inplace update on "*value" instead returning a pointer
        to syscall.c.  Otherwise, it needs a separate copy of "zero" value
        for the BPF_STRUCT_OPS_STATE_INIT to avoid races.
      
      * The bpf_struct_ops_map_delete_elem() is also called without
        preempt_disable() from map_delete_elem().  It is because
        the "->unreg()" may requires sleepable context, e.g.
        the "tcp_unregister_congestion_control()".
      
      * "const" is added to some of the existing "struct btf_func_model *"
        function arg to avoid a compiler warning caused by this patch.
      
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20200109003505.3855919-1-kafai@fb.com
      85d33df3
    • Martin KaFai Lau's avatar
      bpf: Introduce BPF_PROG_TYPE_STRUCT_OPS · 27ae7997
      Martin KaFai Lau authored
      
      
      This patch allows the kernel's struct ops (i.e. func ptr) to be
      implemented in BPF.  The first use case in this series is the
      "struct tcp_congestion_ops" which will be introduced in a
      latter patch.
      
      This patch introduces a new prog type BPF_PROG_TYPE_STRUCT_OPS.
      The BPF_PROG_TYPE_STRUCT_OPS prog is verified against a particular
      func ptr of a kernel struct.  The attr->attach_btf_id is the btf id
      of a kernel struct.  The attr->expected_attach_type is the member
      "index" of that kernel struct.  The first member of a struct starts
      with member index 0.  That will avoid ambiguity when a kernel struct
      has multiple func ptrs with the same func signature.
      
      For example, a BPF_PROG_TYPE_STRUCT_OPS prog is written
      to implement the "init" func ptr of the "struct tcp_congestion_ops".
      The attr->attach_btf_id is the btf id of the "struct tcp_congestion_ops"
      of the _running_ kernel.  The attr->expected_attach_type is 3.
      
      The ctx of BPF_PROG_TYPE_STRUCT_OPS is an array of u64 args saved
      by arch_prepare_bpf_trampoline that will be done in the next
      patch when introducing BPF_MAP_TYPE_STRUCT_OPS.
      
      "struct bpf_struct_ops" is introduced as a common interface for the kernel
      struct that supports BPF_PROG_TYPE_STRUCT_OPS prog.  The supporting kernel
      struct will need to implement an instance of the "struct bpf_struct_ops".
      
      The supporting kernel struct also needs to implement a bpf_verifier_ops.
      During BPF_PROG_LOAD, bpf_struct_ops_find() will find the right
      bpf_verifier_ops by searching the attr->attach_btf_id.
      
      A new "btf_struct_access" is also added to the bpf_verifier_ops such
      that the supporting kernel struct can optionally provide its own specific
      check on accessing the func arg (e.g. provide limited write access).
      
      After btf_vmlinux is parsed, the new bpf_struct_ops_init() is called
      to initialize some values (e.g. the btf id of the supporting kernel
      struct) and it can only be done once the btf_vmlinux is available.
      
      The R0 checks at BPF_EXIT is excluded for the BPF_PROG_TYPE_STRUCT_OPS prog
      if the return type of the prog->aux->attach_func_proto is "void".
      
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarAndrii Nakryiko <andriin@fb.com>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20200109003503.3855825-1-kafai@fb.com
      27ae7997
    • Martin KaFai Lau's avatar
      bpf: Support bitfield read access in btf_struct_access · 976aba00
      Martin KaFai Lau authored
      
      
      This patch allows bitfield access as a scalar.
      
      It checks "off + size > t->size" to avoid accessing bitfield
      end up accessing beyond the struct.  This check is done
      outside of the loop since it is applicable to all access.
      
      It also takes this chance to break early on the "off < moff" case.
      
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20200109003501.3855427-1-kafai@fb.com
      976aba00
    • Martin KaFai Lau's avatar
      bpf: Add enum support to btf_ctx_access() · 218b3f65
      Martin KaFai Lau authored
      
      
      It allows bpf prog (e.g. tracing) to attach
      to a kernel function that takes enum argument.
      
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20200109003459.3855366-1-kafai@fb.com
      218b3f65
    • Martin KaFai Lau's avatar
      bpf: Avoid storing modifier to info->btf_id · 275517ff
      Martin KaFai Lau authored
      
      
      info->btf_id expects the btf_id of a struct, so it should
      store the final result after skipping modifiers (if any).
      
      It also takes this chanace to add a missing newline in one of the
      bpf_log() messages.
      
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20200109003456.3855176-1-kafai@fb.com
      275517ff
    • Martin KaFai Lau's avatar
      bpf: Save PTR_TO_BTF_ID register state when spilling to stack · 65726b5b
      Martin KaFai Lau authored
      
      
      This patch makes the verifier save the PTR_TO_BTF_ID register state when
      spilling to the stack.
      
      Signed-off-by: default avatarMartin KaFai Lau <kafai@fb.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarYonghong Song <yhs@fb.com>
      Link: https://lore.kernel.org/bpf/20200109003454.3854870-1-kafai@fb.com
      65726b5b
    • Stanislav Fomichev's avatar
      selftests/bpf: Restore original comm in test_overhead · e4300224
      Stanislav Fomichev authored
      
      
      test_overhead changes task comm in order to estimate BPF trampoline
      overhead but never sets the comm back to the original one.
      We have the tests (like core_reloc.c) that have 'test_progs'
      as hard-coded expected comm, so let's try to preserve the
      original comm.
      
      Currently, everything works because the order of execution is:
      first core_recloc, then test_overhead; but let's make it a bit
      future-proof.
      
      Other related changes: use 'test_overhead' as new comm instead of
      'test' to make it easy to debug and drop '\n' at the end.
      
      Signed-off-by: default avatarStanislav Fomichev <sdf@google.com>
      Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
      Acked-by: default avatarPetar Penkov <ppenkov@google.com>
      Acked-by: default avatarSong Liu <songliubraving@fb.com>
      Link: https://lore.kernel.org/bpf/20200108192132.189221-1-sdf@google.com
      e4300224
  2. Jan 09, 2020
  3. Jan 08, 2020
  4. Jan 07, 2020
    • David S. Miller's avatar
      Merge branch '1GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/jkirsher/next-queue · 5528e0d7
      David S. Miller authored
      
      
      Jeff Kirsher says:
      
      ====================
      1GbE Intel Wired LAN Driver Updates 2020-01-06
      
      This series contains updates to igc to add basic support for
      timestamping.
      
      Vinicius adds basic support for timestamping and enables ptp4l/phc2sys
      to work with i225 devices.  Initially, adds the ability to read and
      adjust the PHC clock.  Patches 2 & 3 enable and retrieve hardware
      timestamps.  Patch 4 implements the ethtool ioctl that ptp4l uses to
      check what timestamping methods are supported.  Lastly, added support to
      do timestamping using the "Start of Packet" signal from the PHY, which
      is now supported in i225 devices.
      
      While i225 does support multiple PTP domains, with multiple timestamping
      registers, we currently only support one PTP domain and use only one of
      the timestamping registers for implementation purposes.
      ====================
      
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      5528e0d7
    • David S. Miller's avatar
      Merge branch 'Unique-mv88e6xxx-IRQ-names' · 1b935183
      David S. Miller authored
      
      
      Andrew Lunn says:
      
      ====================
      Unique mv88e6xxx IRQ names
      
      There are a few boards which have multiple mv88e6xxx switches. With
      such boards, it can be hard to determine which interrupts belong to
      which switches. Make the interrupt names unique by including the
      device name in the interrupt name. For the SERDES interrupt, also
      include the port number. As a result of these patches ZII devel C
      looks like:
      
       50:          0  gpio-vf610  27 Level     mv88e6xxx-0.1:00
       54:          0  mv88e6xxx-g1   3 Edge      mv88e6xxx-0.1:00-g1-atu-prob
       56:          0  mv88e6xxx-g1   5 Edge      mv88e6xxx-0.1:00-g1-vtu-prob
       58:          0  mv88e6xxx-g1   7 Edge      mv88e6xxx-0.1:00-g2
       61:          0  mv88e6xxx-g2   1 Edge      !mdio-mux!mdio@1!switch@0!mdio:01
       62:          0  mv88e6xxx-g2   2 Edge      !mdio-mux!mdio@1!switch@0!mdio:02
       63:          0  mv88e6xxx-g2   3 Edge      !mdio-mux!mdio@1!switch@0!mdio:03
       64:          0  mv88e6xxx-g2   4 Edge      !mdio-mux!mdio@1!switch@0!mdio:04
       70:          0  mv88e6xxx-g2  10 Edge      mv88e6xxx-0.1:00-serdes-10
       75:          0  mv88e6xxx-g2  15 Edge      mv88e6xxx-0.1:00-watchdog
       76:          5  gpio-vf610  26 Level     mv88e6xxx-0.2:00
       80:          0  mv88e6xxx-g1   3 Edge      mv88e6xxx-0.2:00-g1-atu-prob
       82:          0  mv88e6xxx-g1   5 Edge      mv88e6xxx-0.2:00-g1-vtu-prob
       84:          4  mv88e6xxx-g1   7 Edge      mv88e6xxx-0.2:00-g2
       87:          2  mv88e6xxx-g2   1 Edge      !mdio-mux!mdio@2!switch@0!mdio:01
       88:          0  mv88e6xxx-g2   2 Edge      !mdio-mux!mdio@2!switch@0!mdio:02
       89:          0  mv88e6xxx-g2   3 Edge      !mdio-mux!mdio@2!switch@0!mdio:03
       90:          0  mv88e6xxx-g2   4 Edge      !mdio-mux!mdio@2!switch@0!mdio:04
       95:          3  mv88e6xxx-g2   9 Edge      mv88e6xxx-0.2:00-serdes-9
       96:          0  mv88e6xxx-g2  10 Edge      mv88e6xxx-0.2:00-serdes-10
      101:          0  mv88e6xxx-g2  15 Edge      mv88e6xxx-0.2:00-watchdog
      
      Interrupt names like !mdio-mux!mdio@2!switch@0!mdio:01 are created by
      phylib for the integrated PHYs. The mv88e6xxx driver does not
      determine these names.
      ====================
      
      Tested-by: default avatarChris Healy <cphealy@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      1b935183
    • Andrew Lunn's avatar
      net: dsa: mv88e6xxx: Unique ATU and VTU IRQ names · 8ddf0b56
      Andrew Lunn authored
      
      
      Dynamically generate a unique interrupt name for the VTU and ATU,
      based on the device name.
      
      Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8ddf0b56
    • Andrew Lunn's avatar
      net: dsa: mv88e6xxx: Unique g2 IRQ name · 06acd114
      Andrew Lunn authored
      
      
      Dynamically generate a unique g2 interrupt name, based on the
      device name.
      
      Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      06acd114
    • Andrew Lunn's avatar
      net: dsa: mv88e6xxx: Unique watchdog IRQ name · 8b4db289
      Andrew Lunn authored
      
      
      Dynamically generate a unique watchdog interrupt name, based on the
      device name.
      
      Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      8b4db289
    • Andrew Lunn's avatar
      net: dsa: mv88e6xxx: Unique SERDES interrupt names · e6f2f6b8
      Andrew Lunn authored
      
      
      Dynamically generate a unique SERDES interrupt name, based on the
      device name and the port the SERDES is for. For example:
      
       95:          3  mv88e6xxx-g2   9 Edge      mv88e6xxx-0.2:00-serdes-9
       96:          0  mv88e6xxx-g2  10 Edge      mv88e6xxx-0.2:00-serdes-10
      
      The 0.2:00 indicates the switch and -9 indicates port 9.
      
      Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      e6f2f6b8
    • Andrew Lunn's avatar
      net: dsa: mv88e6xxx: Unique IRQ name · 3095383a
      Andrew Lunn authored
      
      
      Dynamically generate a unique switch interrupt name, based on the
      device name.
      
      Signed-off-by: default avatarAndrew Lunn <andrew@lunn.ch>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      3095383a
    • Vinicius Costa Gomes's avatar
      igc: Use Start of Packet signal from PHY for timestamping · a299df35
      Vinicius Costa Gomes authored
      
      
      For better accuracy, i225 is able to do timestamping using the Start of
      Packet signal from the PHY.
      
      Signed-off-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
      Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
      Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
      a299df35
    • Vinicius Costa Gomes's avatar
      igc: Add support for ethtool GET_TS_INFO command · 60dbede0
      Vinicius Costa Gomes authored
      
      
      This command allows igc to report what types of timestamping are
      supported. ptp4l uses this to detect if the hardware supports
      timestamping.
      
      Signed-off-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
      Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
      Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
      60dbede0
    • Vinicius Costa Gomes's avatar
      igc: Add support for TX timestamping · 2c344ae2
      Vinicius Costa Gomes authored
      
      
      This adds support for timestamping packets being transmitted.
      
      Based on the code from i210. The basic differences is that i225 has 4
      registers to store the transmit timestamps (i210 has one). Right now,
      we only support retrieving from one register, support for using the
      other registers will be added later.
      
      Signed-off-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
      Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
      Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
      2c344ae2
    • Vinicius Costa Gomes's avatar
      igc: Add support for RX timestamping · 81b05520
      Vinicius Costa Gomes authored
      
      
      This adds support for timestamping received packets.
      
      It is based on the i210, as many features of i225 work the same way.
      The main difference from i210 is that i225 has support for choosing
      the timer register to use when timestamping packets. Right now, we
      only support using timer 0. The other difference is that i225 stores
      two timestamps in the receive descriptor, right now, we only retrieve
      one.
      
      Signed-off-by: default avatarVinicius Costa Gomes <vinicius.gomes@intel.com>
      Tested-by: default avatarAaron Brown <aaron.f.brown@intel.com>
      Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
      81b05520
    • David S. Miller's avatar
      Merge branch 'ethtool-allow-nesting-of-begin-and-complete-callbacks' · 50d31037
      David S. Miller authored
      
      
      Michal Kubecek says:
      
      ====================
      ethtool: allow nesting of begin() and complete() callbacks
      
      The ethtool ioctl interface used to guarantee that ethtool_ops callbacks
      were always called in a block between calls to ->begin() and ->complete()
      (if these are defined) and that this whole block was executed with RTNL
      lock held:
      
      	rtnl_lock();
      	ops->begin();
      	/* other ethtool_ops calls */
      	ops->complete();
      	rtnl_unlock();
      
      This prevented any nesting or crossing of the begin-complete blocks.
      However, this is no longer guaranteed even for ioctl interface as at least
      ethtool_phys_id() releases RTNL lock while waiting for a timer. With the
      introduction of netlink ethtool interface, the begin-complete pairs are
      naturally nested e.g. when a request triggers a netlink notification.
      
      Fortunately, only minority of networking drivers implements begin() and
      complete() callbacks and most of those that do, fall into three groups:
      
        - wrappers for pm_runtime_get_sync() and pm_runtime_put()
        - wrappers for clk_prepare_enable() and clk_disable_unprepare()
        - begin() checks netif_running() (fails if false), no complete()
      
      First two have their own refcounting, third is safe w.r.t. nesting of the
      blocks.
      
      Only three in-tree networking drivers need an update to deal with nesting
      of begin() and complete() calls: via-velocity and epic100 perform resume
      and suspend on their own and wil6210 completely serializes the calls using
      its own mutex (which would lead to a deadlock if a request request
      triggered a netlink notification). The series addresses these problems.
      
      changes between v1 and v2:
        - fix inverted condition in epic100 ethtool_begin() (thanks to Andrew
          Lunn)
      ====================
      
      Reviewed-by: default avatarSimon Horman <simon.horman@netronome.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      50d31037
    • Michal Kubecek's avatar
      epic100: allow nesting of ethtool_ops begin() and complete() · 4ac0ac84
      Michal Kubecek authored
      
      
      Unlike most networking drivers using begin() and complete() ethtool_ops
      callbacks to resume a device which is down and suspend it again when done,
      epic100 does not use standard refcounted infrastructure but sets device
      sleep state directly.
      
      With the introduction of netlink ethtool interface, we may have nested
      begin-complete blocks so that inner complete() would put the device back to
      sleep for the rest of the outer block.
      
      To avoid rewriting an old and not very actively developed driver, just add
      a nesting counter and only perform resume and suspend on the outermost
      level.
      
      Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      4ac0ac84
    • Michal Kubecek's avatar
      via-velocity: allow nesting of ethtool_ops begin() and complete() · 71f711a4
      Michal Kubecek authored
      
      
      Unlike most networking drivers using begin() and complete() ethtool_ops
      callbacks to resume a device which is down and suspend it again when done,
      via-velocity does not use standard refcounted infrastructure but sets
      device sleep state directly.
      
      With the introduction of netlink ethtool interface, we may have nested
      begin-complete blocks so that inner complete() would put the device back to
      sleep for the rest of the outer block.
      
      To avoid rewriting an old and not very actively developed driver, just add
      a nesting counter and only perform resume and suspend on the outermost
      level.
      
      Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      71f711a4
    • Michal Kubecek's avatar
      wil6210: get rid of begin() and complete() ethtool_ops · a69faa09
      Michal Kubecek authored
      
      
      The wil6210 driver locks a mutex in begin() ethtool_ops callback and
      unlocks it in complete() so that all ethtool requests are serialized. This
      is not going to work correctly with netlink interface; e.g. when ioctl
      triggers a netlink notification, netlink code would call begin() again
      while the mutex taken by ioctl code is still held by the same task.
      
      Let's get rid of the begin() and complete() callbacks and move the mutex
      locking into the remaining ethtool_ops handlers except get_drvinfo which
      only copies strings that are not changing so that there is no need for
      serialization.
      
      Signed-off-by: default avatarMichal Kubecek <mkubecek@suse.cz>
      Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
      Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
      a69faa09