1. 17 6月, 2016 29 次提交
  2. 16 6月, 2016 11 次提交
    • D
      Merge branch 'bpf-fd-array-release' · f0362eab
      David S. Miller 提交于
      Daniel Borkmann says:
      
      ====================
      bpf: improve fd array release
      
      This set improves BPF perf fd array map release wrt to purging
      entries, first two extend the API as needed. Please see individual
      patches for more details.
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      f0362eab
    • D
      bpf, maps: flush own entries on perf map release · 3b1efb19
      Daniel Borkmann 提交于
      The behavior of perf event arrays are quite different from all
      others as they are tightly coupled to perf event fds, f.e. shown
      recently by commit e03e7ee3 ("perf/bpf: Convert perf_event_array
      to use struct file") to make refcounting on perf event more robust.
      A remaining issue that the current code still has is that since
      additions to the perf event array take a reference on the struct
      file via perf_event_get() and are only released via fput() (that
      cleans up the perf event eventually via perf_event_release_kernel())
      when the element is either manually removed from the map from user
      space or automatically when the last reference on the perf event
      map is dropped. However, this leads us to dangling struct file's
      when the map gets pinned after the application owning the perf
      event descriptor exits, and since the struct file reference will
      in such case only be manually dropped or via pinned file removal,
      it leads to the perf event living longer than necessary, consuming
      needlessly resources for that time.
      
      Relations between perf event fds and bpf perf event map fds can be
      rather complex. F.e. maps can act as demuxers among different perf
      event fds that can possibly be owned by different threads and based
      on the index selection from the program, events get dispatched to
      one of the per-cpu fd endpoints. One perf event fd (or, rather a
      per-cpu set of them) can also live in multiple perf event maps at
      the same time, listening for events. Also, another requirement is
      that perf event fds can get closed from application side after they
      have been attached to the perf event map, so that on exit perf event
      map will take care of dropping their references eventually. Likewise,
      when such maps are pinned, the intended behavior is that a user
      application does bpf_obj_get(), puts its fds in there and on exit
      when fd is released, they are dropped from the map again, so the map
      acts rather as connector endpoint. This also makes perf event maps
      inherently different from program arrays as described in more detail
      in commit c9da161c ("bpf: fix clearing on persistent program
      array maps").
      
      To tackle this, map entries are marked by the map struct file that
      added the element to the map. And when the last reference to that map
      struct file is released from user space, then the tracked entries
      are purged from the map. This is okay, because new map struct files
      instances resp. frontends to the anon inode are provided via
      bpf_map_new_fd() that is called when we invoke bpf_obj_get_user()
      for retrieving a pinned map, but also when an initial instance is
      created via map_create(). The rest is resolved by the vfs layer
      automatically for us by keeping reference count on the map's struct
      file. Any concurrent updates on the map slot are fine as well, it
      just means that perf_event_fd_array_release() needs to delete less
      of its own entires.
      Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
      Acked-by: NAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      3b1efb19
    • D
      bpf, maps: extend map_fd_get_ptr arguments · d056a788
      Daniel Borkmann 提交于
      This patch extends map_fd_get_ptr() callback that is used by fd array
      maps, so that struct file pointer from the related map can be passed
      in. It's safe to remove map_update_elem() callback for the two maps since
      this is only allowed from syscall side, but not from eBPF programs for these
      two map types. Like in per-cpu map case, bpf_fd_array_map_update_elem()
      needs to be called directly here due to the extra argument.
      Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
      Acked-by: NAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      d056a788
    • D
      bpf, maps: add release callback · 61d1b6a4
      Daniel Borkmann 提交于
      Add a release callback for maps that is invoked when the last
      reference to its struct file is gone and the struct file about
      to be released by vfs. The handler will be used by fd array maps.
      Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
      Acked-by: NAlexei Starovoitov <ast@kernel.org>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      61d1b6a4
    • D
      Merge branch 'sfc-rx-vlan-filtering' · b478af0c
      David S. Miller 提交于
      Edward Cree says:
      
      ====================
      sfc: RX VLAN filtering
      
      Adds support for VLAN-qualified receive filters on EF10 hardware.
      This is needed when running as a guest if the hypervisor has enabled
      vfs-vlan-restrict, in which case the firmware rejects filters not qualified
      with VLAN 0.
      ====================
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      b478af0c
    • A
      sfc: Fix VLAN filtering feature if vPort has VLAN_RESTRICT flag · 38d27f38
      Andrew Rybchenko 提交于
      If vPort has VLAN_RESTRICT flag, VLAN tagged traffic will not be
      delivered without corresponding Rx filters which may be proxied to and
      moderated by hypervisor.
      Signed-off-by: NEdward Cree <ecree@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      38d27f38
    • E
      sfc: Update MCDI protocol definitions · 23e202b4
      Edward Cree 提交于
      Signed-off-by: NEdward Cree <ecree@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      23e202b4
    • A
      sfc: Disable VLAN filtering by default if not strictly required · eb7cfd8c
      Andrew Rybchenko 提交于
      If should be done after net_dev->hw_features initialization, to keep the
      feature there to be able to enable it later using ethtool.
      
      VLAN filtering is enforced and fixed if vPort requires usage of VLAN
      filters to receive tagged traffic.
      Signed-off-by: NEdward Cree <ecree@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      eb7cfd8c
    • M
      sfc: VLAN filters must only be created if the firmware supports this. · e4478ad1
      Martin Habets 提交于
      If it is not supported we simply disable the feature.
      
      For the feature to work we need firmware filter support for
      OUTER_VID + LOC_MAC and for OUTER_VID + LOC_MAC_IG.
      The low-latency firmware can match on OUTER_VID + LOC_MAC but not on
      OUTER_VID + LOC_MAC_IG.
      For the capture packet firmware it is the other way around.
      Only the full-feature variant can match on both combinations.
      
      Incorporates a fix by Andrew Rybchenko <Andrew.Rybchenko@oktetlabs.ru>
      in the net_dev->[hw_]features handling.
      Signed-off-by: NEdward Cree <ecree@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      e4478ad1
    • A
      sfc: Fix dup unknown multicast/unicast filters after datapath reset · 7ac0dd9d
      Andrew Rybchenko 提交于
      Filter match flags are not unique criteria to be mapped to priority
      because of both unknown unicast and unknown multicast are mapped to
      LOC_MAC_IG. So, local MAC is required to map filter to priority.
      MCDI filter flags is unique criteria to find filter priority.
      Signed-off-by: NEdward Cree <ecree@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      7ac0dd9d
    • E
      sfc: Refactor checks for invalid filter ID · 8c915620
      Edward Cree 提交于
      Nearly every time we call efx_ef10_filter_remove_unsafe, we first check
      for EFX_EF10_FILTER_ID_INVALID, in which case we do nothing.  So move
      that check into the function, simplifying all the call sites.
      
      Also, change the return type to void, since none of the callers check it.
      Signed-off-by: NEdward Cree <ecree@solarflare.com>
      Signed-off-by: NDavid S. Miller <davem@davemloft.net>
      8c915620