mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Core
 ----
 
  - Introduce a config option to tweak MAX_SKB_FRAGS. Increasing the
    default value allows for better BIG TCP performances.
 
  - Reduce compound page head access for zero-copy data transfers.
 
  - RPS/RFS improvements, avoiding unneeded NET_RX_SOFTIRQ when possible.
 
  - Threaded NAPI improvements, adding defer skb free support and unneeded
    softirq avoidance.
 
  - Address dst_entry reference count scalability issues, via false
    sharing avoidance and optimize refcount tracking.
 
  - Add lockless accesses annotation to sk_err[_soft].
 
  - Optimize again the skb struct layout.
 
  - Extends the skb drop reasons to make it usable by multiple
    subsystems.
 
  - Better const qualifier awareness for socket casts.
 
 BPF
 ---
 
  - Add skb and XDP typed dynptrs which allow BPF programs for more
    ergonomic and less brittle iteration through data and variable-sized
    accesses.
 
  - Add a new BPF netfilter program type and minimal support to hook
    BPF programs to netfilter hooks such as prerouting or forward.
 
  - Add more precise memory usage reporting for all BPF map types.
 
  - Adds support for using {FOU,GUE} encap with an ipip device operating
    in collect_md mode and add a set of BPF kfuncs for controlling encap
    params.
 
  - Allow BPF programs to detect at load time whether a particular kfunc
    exists or not, and also add support for this in light skeleton.
 
  - Bigger batch of BPF verifier improvements to prepare for upcoming BPF
    open-coded iterators allowing for less restrictive looping capabilities.
 
  - Rework RCU enforcement in the verifier, add kptr_rcu and enforce BPF
    programs to NULL-check before passing such pointers into kfunc.
 
  - Add support for kptrs in percpu hashmaps, percpu LRU hashmaps and in
    local storage maps.
 
  - Enable RCU semantics for task BPF kptrs and allow referenced kptr
    tasks to be stored in BPF maps.
 
  - Add support for refcounted local kptrs to the verifier for allowing
    shared ownership, useful for adding a node to both the BPF list and
    rbtree.
 
  - Add BPF verifier support for ST instructions in convert_ctx_access()
    which will help new -mcpu=v4 clang flag to start emitting them.
 
  - Add ARM32 USDT support to libbpf.
 
  - Improve bpftool's visual program dump which produces the control
    flow graph in a DOT format by adding C source inline annotations.
 
 Protocols
 ---------
 
  - IPv4: Allow adding to IPv4 address a 'protocol' tag. Such value
    indicates the provenance of the IP address.
 
  - IPv6: optimize route lookup, dropping unneeded R/W lock acquisition.
 
  - Add the handshake upcall mechanism, allowing the user-space
    to implement generic TLS handshake on kernel's behalf.
 
  - Bridge: support per-{Port, VLAN} neighbor suppression, increasing
    resilience to nodes failures.
 
  - SCTP: add support for Fair Capacity and Weighted Fair Queueing
    schedulers.
 
  - MPTCP: delay first subflow allocation up to its first usage. This
    will allow for later better LSM interaction.
 
  - xfrm: Remove inner/outer modes from input/output path. These are
    not needed anymore.
 
  - WiFi:
    - reduced neighbor report (RNR) handling for AP mode
    - HW timestamping support
    - support for randomized auth/deauth TA for PASN privacy
    - per-link debugfs for multi-link
    - TC offload support for mac80211 drivers
    - mac80211 mesh fast-xmit and fast-rx support
    - enable Wi-Fi 7 (EHT) mesh support
 
 Netfilter
 ---------
 
  - Add nf_tables 'brouting' support, to force a packet to be routed
    instead of being bridged.
 
  - Update bridge netfilter and ovs conntrack helpers to handle
    IPv6 Jumbo packets properly, i.e. fetch the packet length
    from hop-by-hop extension header. This is needed for BIT TCP
    support.
 
  - The iptables 32bit compat interface isn't compiled in by default
    anymore.
 
  - Move ip(6)tables builtin icmp matches to the udptcp one.
    This has the advantage that icmp/icmpv6 match doesn't load the
    iptables/ip6tables modules anymore when iptables-nft is used.
 
  - Extended netlink error report for netdevice in flowtables and
    netdev/chains. Allow for incrementally add/delete devices to netdev
    basechain. Allow to create netdev chain without device.
 
 Driver API
 ----------
 
  - Remove redundant Device Control Error Reporting Enable, as PCI core
    has already error reporting enabled at enumeration time.
 
  - Move Multicast DB netlink handlers to core, allowing devices other
    then bridge to use them.
 
  - Allow the page_pool to directly recycle the pages from safely
    localized NAPI.
 
  - Implement lockless TX queue stop/wake combo macros, allowing for
    further code de-duplication and sanitization.
 
  - Add YNL support for user headers and struct attrs.
 
  - Add partial YNL specification for devlink.
 
  - Add partial YNL specification for ethtool.
 
  - Add tc-mqprio and tc-taprio support for preemptible traffic classes.
 
  - Add tx push buf len param to ethtool, specifies the maximum number
    of bytes of a transmitted packet a driver can push directly to the
    underlying device.
 
  - Add basic LED support for switch/phy.
 
  - Add NAPI documentation, stop relaying on external links.
 
  - Convert dsa_master_ioctl() to netdev notifier. This is a preparatory
    work to make the hardware timestamping layer selectable by user
    space.
 
  - Add transceiver support and improve the error messages for CAN-FD
    controllers.
 
 New hardware / drivers
 ----------------------
 
  - Ethernet:
    - AMD/Pensando core device support
    - MediaTek MT7981 SoC
    - MediaTek MT7988 SoC
    - Broadcom BCM53134 embedded switch
    - Texas Instruments CPSW9G ethernet switch
    - Qualcomm EMAC3 DWMAC ethernet
    - StarFive JH7110 SoC
    - NXP CBTX ethernet PHY
 
  - WiFi:
    - Apple M1 Pro/Max devices
    - RealTek rtl8710bu/rtl8188gu
    - RealTek rtl8822bs, rtl8822cs and rtl8821cs SDIO chipset
 
  - Bluetooth:
    - Realtek RTL8821CS, RTL8851B, RTL8852BS
    - Mediatek MT7663, MT7922
    - NXP w8997
    - Actions Semi ATS2851
    - QTI WCN6855
    - Marvell 88W8997
 
  - Can:
    - STMicroelectronics bxcan stm32f429
 
 Drivers
 -------
  - Ethernet NICs:
    - Intel (1G, icg):
      - add tracking and reporting of QBV config errors.
      - add support for configuring max SDU for each Tx queue.
    - Intel (100G, ice):
      - refactor mailbox overflow detection to support Scalable IOV
      - GNSS interface optimization
    - Intel (i40e):
      - support XDP multi-buffer
    - nVidia/Mellanox:
      - add the support for linux bridge multicast offload
      - enable TC offload for egress and engress MACVLAN over bond
      - add support for VxLAN GBP encap/decap flows offload
      - extend packet offload to fully support libreswan
      - support tunnel mode in mlx5 IPsec packet offload
      - extend XDP multi-buffer support
      - support MACsec VLAN offload
      - add support for dynamic msix vectors allocation
      - drop RX page_cache and fully use page_pool
      - implement thermal zone to report NIC temperature
    - Netronome/Corigine:
      - add support for multi-zone conntrack offload
    - Solarflare/Xilinx:
      - support offloading TC VLAN push/pop actions to the MAE
      - support TC decap rules
      - support unicast PTP
 
  - Other NICs:
    - Broadcom (bnxt): enforce software based freq adjustments only
 		on shared PHC NIC
    - RealTek (r8169): refactor to addess ASPM issues during NAPI poll.
    - Micrel (lan8841): add support for PTP_PF_PEROUT
    - Cadence (macb): enable PTP unicast
    - Engleder (tsnep): add XDP socket zero-copy support
    - virtio-net: implement exact header length guest feature
    - veth: add page_pool support for page recycling
    - vxlan: add MDB data path support
    - gve: add XDP support for GQI-QPL format
    - geneve: accept every ethertype
    - macvlan: allow some packets to bypass broadcast queue
    - mana: add support for jumbo frame
 
  - Ethernet high-speed switches:
    - Microchip (sparx5): Add support for TC flower templates.
 
  - Ethernet embedded switches:
    - Broadcom (b54):
      - configure 6318 and 63268 RGMII ports
    - Marvell (mv88e6xxx):
      - faster C45 bus scan
    - Microchip:
      - lan966x:
        - add support for IS1 VCAP
        - better TX/RX from/to CPU performances
      - ksz9477: add ETS Qdisc support
      - ksz8: enhance static MAC table operations and error handling
      - sama7g5: add PTP capability
    - NXP (ocelot):
      - add support for external ports
      - add support for preemptible traffic classes
    - Texas Instruments:
      - add CPSWxG SGMII support for J7200 and J721E
 
  - Intel WiFi (iwlwifi):
    - preparation for Wi-Fi 7 EHT and multi-link support
    - EHT (Wi-Fi 7) sniffer support
    - hardware timestamping support for some devices/firwmares
    - TX beacon protection on newer hardware
 
  - Qualcomm 802.11ax WiFi (ath11k):
    - MU-MIMO parameters support
    - ack signal support for management packets
 
  - RealTek WiFi (rtw88):
    - SDIO bus support
    - better support for some SDIO devices
      (e.g. MAC address from efuse)
 
  - RealTek WiFi (rtw89):
    - HW scan support for 8852b
    - better support for 6 GHz scanning
    - support for various newer firmware APIs
    - framework firmware backwards compatibility
 
  - MediaTek WiFi (mt76):
    - P2P support
    - mesh A-MSDU support
    - EHT (Wi-Fi 7) support
    - coredump support
 
 Signed-off-by: Paolo Abeni <pabeni@redhat.com>
 -----BEGIN PGP SIGNATURE-----
 
 iQJGBAABCAAwFiEEg1AjqC77wbdLX2LbKSR5jcyPE6QFAmRI/mUSHHBhYmVuaUBy
 ZWRoYXQuY29tAAoJECkkeY3MjxOkgO0QAJGxpuN67YgYV0BIM+/atWKEEexJYG7B
 9MMpU4jMO3EW/pUS5t7VRsBLUybLYVPmqCZoHodObDfnu59jiPOegb6SikJv/ZwJ
 Zw62PVk5MvDnQjlu4e6kDcGwkplteN08TlgI+a49BUTedpdFitrxHAYGW8f2fRO6
 cK2XSld+ZucMoym5vRwf8yWS1BwdxnslPMxDJ+/8ZbWBZv44qAnG2vMB/kIx7ObC
 Vel/4m6MzTwVsLYBsRvcwMVbNNlZ9GuhztlTzEbfGA4ZhTadIAMgb5VTWXB84Ws7
 Aic5wTdli+q+x6/2cxhbyeoVuB9HHObYmLBAciGg4GNljP5rnQBY3X3+KVZ/x9TI
 HQB7CmhxmAZVrO9pLARFV+ECrMTH2/dy3NyrZ7uYQ3WPOXJi8hJZjOTO/eeEGL7C
 eTjdz0dZBWIBK2gON/6s4nExXVQUTEF2ZsPi52jTTClKjfe5pz/ddeFQIWaY1DTm
 pInEiWPAvd28JyiFmhFNHsuIBCjX/Zqe2JuMfMBeBibDAC09o/OGdKJYUI15AiRf
 F46Pdb7use/puqfrYW44kSAfaPYoBiE+hj1RdeQfen35xD9HVE4vdnLNeuhRlFF9
 aQfyIRHYQofkumRDr5f8JEY66cl9NiKQ4IVW1xxQfYDNdC6wQqREPG1md7rJVMrJ
 vP7ugFnttneg
 =ITVa
 -----END PGP SIGNATURE-----
Merge tag 'net-next-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next
Pull networking updates from Paolo Abeni:
 "Core:
   - Introduce a config option to tweak MAX_SKB_FRAGS. Increasing the
     default value allows for better BIG TCP performances
   - Reduce compound page head access for zero-copy data transfers
   - RPS/RFS improvements, avoiding unneeded NET_RX_SOFTIRQ when
     possible
   - Threaded NAPI improvements, adding defer skb free support and
     unneeded softirq avoidance
   - Address dst_entry reference count scalability issues, via false
     sharing avoidance and optimize refcount tracking
   - Add lockless accesses annotation to sk_err[_soft]
   - Optimize again the skb struct layout
   - Extends the skb drop reasons to make it usable by multiple
     subsystems
   - Better const qualifier awareness for socket casts
  BPF:
   - Add skb and XDP typed dynptrs which allow BPF programs for more
     ergonomic and less brittle iteration through data and
     variable-sized accesses
   - Add a new BPF netfilter program type and minimal support to hook
     BPF programs to netfilter hooks such as prerouting or forward
   - Add more precise memory usage reporting for all BPF map types
   - Adds support for using {FOU,GUE} encap with an ipip device
     operating in collect_md mode and add a set of BPF kfuncs for
     controlling encap params
   - Allow BPF programs to detect at load time whether a particular
     kfunc exists or not, and also add support for this in light
     skeleton
   - Bigger batch of BPF verifier improvements to prepare for upcoming
     BPF open-coded iterators allowing for less restrictive looping
     capabilities
   - Rework RCU enforcement in the verifier, add kptr_rcu and enforce
     BPF programs to NULL-check before passing such pointers into kfunc
   - Add support for kptrs in percpu hashmaps, percpu LRU hashmaps and
     in local storage maps
   - Enable RCU semantics for task BPF kptrs and allow referenced kptr
     tasks to be stored in BPF maps
   - Add support for refcounted local kptrs to the verifier for allowing
     shared ownership, useful for adding a node to both the BPF list and
     rbtree
   - Add BPF verifier support for ST instructions in
     convert_ctx_access() which will help new -mcpu=v4 clang flag to
     start emitting them
   - Add ARM32 USDT support to libbpf
   - Improve bpftool's visual program dump which produces the control
     flow graph in a DOT format by adding C source inline annotations
  Protocols:
   - IPv4: Allow adding to IPv4 address a 'protocol' tag. Such value
     indicates the provenance of the IP address
   - IPv6: optimize route lookup, dropping unneeded R/W lock acquisition
   - Add the handshake upcall mechanism, allowing the user-space to
     implement generic TLS handshake on kernel's behalf
   - Bridge: support per-{Port, VLAN} neighbor suppression, increasing
     resilience to nodes failures
   - SCTP: add support for Fair Capacity and Weighted Fair Queueing
     schedulers
   - MPTCP: delay first subflow allocation up to its first usage. This
     will allow for later better LSM interaction
   - xfrm: Remove inner/outer modes from input/output path. These are
     not needed anymore
   - WiFi:
      - reduced neighbor report (RNR) handling for AP mode
      - HW timestamping support
      - support for randomized auth/deauth TA for PASN privacy
      - per-link debugfs for multi-link
      - TC offload support for mac80211 drivers
      - mac80211 mesh fast-xmit and fast-rx support
      - enable Wi-Fi 7 (EHT) mesh support
  Netfilter:
   - Add nf_tables 'brouting' support, to force a packet to be routed
     instead of being bridged
   - Update bridge netfilter and ovs conntrack helpers to handle IPv6
     Jumbo packets properly, i.e. fetch the packet length from
     hop-by-hop extension header. This is needed for BIT TCP support
   - The iptables 32bit compat interface isn't compiled in by default
     anymore
   - Move ip(6)tables builtin icmp matches to the udptcp one. This has
     the advantage that icmp/icmpv6 match doesn't load the
     iptables/ip6tables modules anymore when iptables-nft is used
   - Extended netlink error report for netdevice in flowtables and
     netdev/chains. Allow for incrementally add/delete devices to netdev
     basechain. Allow to create netdev chain without device
  Driver API:
   - Remove redundant Device Control Error Reporting Enable, as PCI core
     has already error reporting enabled at enumeration time
   - Move Multicast DB netlink handlers to core, allowing devices other
     then bridge to use them
   - Allow the page_pool to directly recycle the pages from safely
     localized NAPI
   - Implement lockless TX queue stop/wake combo macros, allowing for
     further code de-duplication and sanitization
   - Add YNL support for user headers and struct attrs
   - Add partial YNL specification for devlink
   - Add partial YNL specification for ethtool
   - Add tc-mqprio and tc-taprio support for preemptible traffic classes
   - Add tx push buf len param to ethtool, specifies the maximum number
     of bytes of a transmitted packet a driver can push directly to the
     underlying device
   - Add basic LED support for switch/phy
   - Add NAPI documentation, stop relaying on external links
   - Convert dsa_master_ioctl() to netdev notifier. This is a
     preparatory work to make the hardware timestamping layer selectable
     by user space
   - Add transceiver support and improve the error messages for CAN-FD
     controllers
  New hardware / drivers:
   - Ethernet:
      - AMD/Pensando core device support
      - MediaTek MT7981 SoC
      - MediaTek MT7988 SoC
      - Broadcom BCM53134 embedded switch
      - Texas Instruments CPSW9G ethernet switch
      - Qualcomm EMAC3 DWMAC ethernet
      - StarFive JH7110 SoC
      - NXP CBTX ethernet PHY
   - WiFi:
      - Apple M1 Pro/Max devices
      - RealTek rtl8710bu/rtl8188gu
      - RealTek rtl8822bs, rtl8822cs and rtl8821cs SDIO chipset
   - Bluetooth:
      - Realtek RTL8821CS, RTL8851B, RTL8852BS
      - Mediatek MT7663, MT7922
      - NXP w8997
      - Actions Semi ATS2851
      - QTI WCN6855
      - Marvell 88W8997
   - Can:
      - STMicroelectronics bxcan stm32f429
  Drivers:
   - Ethernet NICs:
      - Intel (1G, icg):
         - add tracking and reporting of QBV config errors
         - add support for configuring max SDU for each Tx queue
      - Intel (100G, ice):
         - refactor mailbox overflow detection to support Scalable IOV
         - GNSS interface optimization
      - Intel (i40e):
         - support XDP multi-buffer
      - nVidia/Mellanox:
         - add the support for linux bridge multicast offload
         - enable TC offload for egress and engress MACVLAN over bond
         - add support for VxLAN GBP encap/decap flows offload
         - extend packet offload to fully support libreswan
         - support tunnel mode in mlx5 IPsec packet offload
         - extend XDP multi-buffer support
         - support MACsec VLAN offload
         - add support for dynamic msix vectors allocation
         - drop RX page_cache and fully use page_pool
         - implement thermal zone to report NIC temperature
      - Netronome/Corigine:
         - add support for multi-zone conntrack offload
      - Solarflare/Xilinx:
         - support offloading TC VLAN push/pop actions to the MAE
         - support TC decap rules
         - support unicast PTP
   - Other NICs:
      - Broadcom (bnxt): enforce software based freq adjustments only on
        shared PHC NIC
      - RealTek (r8169): refactor to addess ASPM issues during NAPI poll
      - Micrel (lan8841): add support for PTP_PF_PEROUT
      - Cadence (macb): enable PTP unicast
      - Engleder (tsnep): add XDP socket zero-copy support
      - virtio-net: implement exact header length guest feature
      - veth: add page_pool support for page recycling
      - vxlan: add MDB data path support
      - gve: add XDP support for GQI-QPL format
      - geneve: accept every ethertype
      - macvlan: allow some packets to bypass broadcast queue
      - mana: add support for jumbo frame
   - Ethernet high-speed switches:
      - Microchip (sparx5): Add support for TC flower templates
   - Ethernet embedded switches:
      - Broadcom (b54):
         - configure 6318 and 63268 RGMII ports
      - Marvell (mv88e6xxx):
         - faster C45 bus scan
      - Microchip:
         - lan966x:
            - add support for IS1 VCAP
            - better TX/RX from/to CPU performances
         - ksz9477: add ETS Qdisc support
         - ksz8: enhance static MAC table operations and error handling
         - sama7g5: add PTP capability
      - NXP (ocelot):
         - add support for external ports
         - add support for preemptible traffic classes
      - Texas Instruments:
         - add CPSWxG SGMII support for J7200 and J721E
   - Intel WiFi (iwlwifi):
      - preparation for Wi-Fi 7 EHT and multi-link support
      - EHT (Wi-Fi 7) sniffer support
      - hardware timestamping support for some devices/firwmares
      - TX beacon protection on newer hardware
   - Qualcomm 802.11ax WiFi (ath11k):
      - MU-MIMO parameters support
      - ack signal support for management packets
   - RealTek WiFi (rtw88):
      - SDIO bus support
      - better support for some SDIO devices (e.g. MAC address from
        efuse)
   - RealTek WiFi (rtw89):
      - HW scan support for 8852b
      - better support for 6 GHz scanning
      - support for various newer firmware APIs
      - framework firmware backwards compatibility
   - MediaTek WiFi (mt76):
      - P2P support
      - mesh A-MSDU support
      - EHT (Wi-Fi 7) support
      - coredump support"
* tag 'net-next-6.4' of git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net-next: (2078 commits)
  net: phy: hide the PHYLIB_LEDS knob
  net: phy: marvell-88x2222: remove unnecessary (void*) conversions
  tcp/udp: Fix memleaks of sk and zerocopy skbs with TX timestamp.
  net: amd: Fix link leak when verifying config failed
  net: phy: marvell: Fix inconsistent indenting in led_blink_set
  lan966x: Don't use xdp_frame when action is XDP_TX
  tsnep: Add XDP socket zero-copy TX support
  tsnep: Add XDP socket zero-copy RX support
  tsnep: Move skb receive action to separate function
  tsnep: Add functions for queue enable/disable
  tsnep: Rework TX/RX queue initialization
  tsnep: Replace modulo operation with mask
  net: phy: dp83867: Add led_brightness_set support
  net: phy: Fix reading LED reg property
  drivers: nfc: nfcsim: remove return value check of `dev_dir`
  net: phy: dp83867: Remove unnecessary (void*) conversions
  net: ethtool: coalesce: try to make user settings stick twice
  net: mana: Check if netdev/napi_alloc_frag returns single page
  net: mana: Rename mana_refill_rxoob and remove some empty lines
  net: veth: add page_pool stats
  ...
		
	
			
		
			
				
	
	
		
			237 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
// SPDX-License-Identifier: GPL-2.0
 | 
						|
/*
 | 
						|
 * Copyright (c) 2019 Facebook
 | 
						|
 * Copyright 2020 Google LLC.
 | 
						|
 */
 | 
						|
 | 
						|
#include <linux/rculist.h>
 | 
						|
#include <linux/list.h>
 | 
						|
#include <linux/hash.h>
 | 
						|
#include <linux/types.h>
 | 
						|
#include <linux/spinlock.h>
 | 
						|
#include <linux/bpf.h>
 | 
						|
#include <linux/bpf_local_storage.h>
 | 
						|
#include <net/sock.h>
 | 
						|
#include <uapi/linux/sock_diag.h>
 | 
						|
#include <uapi/linux/btf.h>
 | 
						|
#include <linux/bpf_lsm.h>
 | 
						|
#include <linux/btf_ids.h>
 | 
						|
#include <linux/fdtable.h>
 | 
						|
#include <linux/rcupdate_trace.h>
 | 
						|
 | 
						|
DEFINE_BPF_STORAGE_CACHE(inode_cache);
 | 
						|
 | 
						|
static struct bpf_local_storage __rcu **
 | 
						|
inode_storage_ptr(void *owner)
 | 
						|
{
 | 
						|
	struct inode *inode = owner;
 | 
						|
	struct bpf_storage_blob *bsb;
 | 
						|
 | 
						|
	bsb = bpf_inode(inode);
 | 
						|
	if (!bsb)
 | 
						|
		return NULL;
 | 
						|
	return &bsb->storage;
 | 
						|
}
 | 
						|
 | 
						|
static struct bpf_local_storage_data *inode_storage_lookup(struct inode *inode,
 | 
						|
							   struct bpf_map *map,
 | 
						|
							   bool cacheit_lockit)
 | 
						|
{
 | 
						|
	struct bpf_local_storage *inode_storage;
 | 
						|
	struct bpf_local_storage_map *smap;
 | 
						|
	struct bpf_storage_blob *bsb;
 | 
						|
 | 
						|
	bsb = bpf_inode(inode);
 | 
						|
	if (!bsb)
 | 
						|
		return NULL;
 | 
						|
 | 
						|
	inode_storage =
 | 
						|
		rcu_dereference_check(bsb->storage, bpf_rcu_lock_held());
 | 
						|
	if (!inode_storage)
 | 
						|
		return NULL;
 | 
						|
 | 
						|
	smap = (struct bpf_local_storage_map *)map;
 | 
						|
	return bpf_local_storage_lookup(inode_storage, smap, cacheit_lockit);
 | 
						|
}
 | 
						|
 | 
						|
void bpf_inode_storage_free(struct inode *inode)
 | 
						|
{
 | 
						|
	struct bpf_local_storage *local_storage;
 | 
						|
	struct bpf_storage_blob *bsb;
 | 
						|
 | 
						|
	bsb = bpf_inode(inode);
 | 
						|
	if (!bsb)
 | 
						|
		return;
 | 
						|
 | 
						|
	rcu_read_lock();
 | 
						|
 | 
						|
	local_storage = rcu_dereference(bsb->storage);
 | 
						|
	if (!local_storage) {
 | 
						|
		rcu_read_unlock();
 | 
						|
		return;
 | 
						|
	}
 | 
						|
 | 
						|
	bpf_local_storage_destroy(local_storage);
 | 
						|
	rcu_read_unlock();
 | 
						|
}
 | 
						|
 | 
						|
static void *bpf_fd_inode_storage_lookup_elem(struct bpf_map *map, void *key)
 | 
						|
{
 | 
						|
	struct bpf_local_storage_data *sdata;
 | 
						|
	struct fd f = fdget_raw(*(int *)key);
 | 
						|
 | 
						|
	if (!f.file)
 | 
						|
		return ERR_PTR(-EBADF);
 | 
						|
 | 
						|
	sdata = inode_storage_lookup(file_inode(f.file), map, true);
 | 
						|
	fdput(f);
 | 
						|
	return sdata ? sdata->data : NULL;
 | 
						|
}
 | 
						|
 | 
						|
static long bpf_fd_inode_storage_update_elem(struct bpf_map *map, void *key,
 | 
						|
					     void *value, u64 map_flags)
 | 
						|
{
 | 
						|
	struct bpf_local_storage_data *sdata;
 | 
						|
	struct fd f = fdget_raw(*(int *)key);
 | 
						|
 | 
						|
	if (!f.file)
 | 
						|
		return -EBADF;
 | 
						|
	if (!inode_storage_ptr(file_inode(f.file))) {
 | 
						|
		fdput(f);
 | 
						|
		return -EBADF;
 | 
						|
	}
 | 
						|
 | 
						|
	sdata = bpf_local_storage_update(file_inode(f.file),
 | 
						|
					 (struct bpf_local_storage_map *)map,
 | 
						|
					 value, map_flags, GFP_ATOMIC);
 | 
						|
	fdput(f);
 | 
						|
	return PTR_ERR_OR_ZERO(sdata);
 | 
						|
}
 | 
						|
 | 
						|
static int inode_storage_delete(struct inode *inode, struct bpf_map *map)
 | 
						|
{
 | 
						|
	struct bpf_local_storage_data *sdata;
 | 
						|
 | 
						|
	sdata = inode_storage_lookup(inode, map, false);
 | 
						|
	if (!sdata)
 | 
						|
		return -ENOENT;
 | 
						|
 | 
						|
	bpf_selem_unlink(SELEM(sdata), false);
 | 
						|
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
 | 
						|
static long bpf_fd_inode_storage_delete_elem(struct bpf_map *map, void *key)
 | 
						|
{
 | 
						|
	struct fd f = fdget_raw(*(int *)key);
 | 
						|
	int err;
 | 
						|
 | 
						|
	if (!f.file)
 | 
						|
		return -EBADF;
 | 
						|
 | 
						|
	err = inode_storage_delete(file_inode(f.file), map);
 | 
						|
	fdput(f);
 | 
						|
	return err;
 | 
						|
}
 | 
						|
 | 
						|
/* *gfp_flags* is a hidden argument provided by the verifier */
 | 
						|
BPF_CALL_5(bpf_inode_storage_get, struct bpf_map *, map, struct inode *, inode,
 | 
						|
	   void *, value, u64, flags, gfp_t, gfp_flags)
 | 
						|
{
 | 
						|
	struct bpf_local_storage_data *sdata;
 | 
						|
 | 
						|
	WARN_ON_ONCE(!bpf_rcu_lock_held());
 | 
						|
	if (flags & ~(BPF_LOCAL_STORAGE_GET_F_CREATE))
 | 
						|
		return (unsigned long)NULL;
 | 
						|
 | 
						|
	/* explicitly check that the inode_storage_ptr is not
 | 
						|
	 * NULL as inode_storage_lookup returns NULL in this case and
 | 
						|
	 * bpf_local_storage_update expects the owner to have a
 | 
						|
	 * valid storage pointer.
 | 
						|
	 */
 | 
						|
	if (!inode || !inode_storage_ptr(inode))
 | 
						|
		return (unsigned long)NULL;
 | 
						|
 | 
						|
	sdata = inode_storage_lookup(inode, map, true);
 | 
						|
	if (sdata)
 | 
						|
		return (unsigned long)sdata->data;
 | 
						|
 | 
						|
	/* This helper must only called from where the inode is guaranteed
 | 
						|
	 * to have a refcount and cannot be freed.
 | 
						|
	 */
 | 
						|
	if (flags & BPF_LOCAL_STORAGE_GET_F_CREATE) {
 | 
						|
		sdata = bpf_local_storage_update(
 | 
						|
			inode, (struct bpf_local_storage_map *)map, value,
 | 
						|
			BPF_NOEXIST, gfp_flags);
 | 
						|
		return IS_ERR(sdata) ? (unsigned long)NULL :
 | 
						|
					     (unsigned long)sdata->data;
 | 
						|
	}
 | 
						|
 | 
						|
	return (unsigned long)NULL;
 | 
						|
}
 | 
						|
 | 
						|
BPF_CALL_2(bpf_inode_storage_delete,
 | 
						|
	   struct bpf_map *, map, struct inode *, inode)
 | 
						|
{
 | 
						|
	WARN_ON_ONCE(!bpf_rcu_lock_held());
 | 
						|
	if (!inode)
 | 
						|
		return -EINVAL;
 | 
						|
 | 
						|
	/* This helper must only called from where the inode is guaranteed
 | 
						|
	 * to have a refcount and cannot be freed.
 | 
						|
	 */
 | 
						|
	return inode_storage_delete(inode, map);
 | 
						|
}
 | 
						|
 | 
						|
static int notsupp_get_next_key(struct bpf_map *map, void *key,
 | 
						|
				void *next_key)
 | 
						|
{
 | 
						|
	return -ENOTSUPP;
 | 
						|
}
 | 
						|
 | 
						|
static struct bpf_map *inode_storage_map_alloc(union bpf_attr *attr)
 | 
						|
{
 | 
						|
	return bpf_local_storage_map_alloc(attr, &inode_cache, false);
 | 
						|
}
 | 
						|
 | 
						|
static void inode_storage_map_free(struct bpf_map *map)
 | 
						|
{
 | 
						|
	bpf_local_storage_map_free(map, &inode_cache, NULL);
 | 
						|
}
 | 
						|
 | 
						|
const struct bpf_map_ops inode_storage_map_ops = {
 | 
						|
	.map_meta_equal = bpf_map_meta_equal,
 | 
						|
	.map_alloc_check = bpf_local_storage_map_alloc_check,
 | 
						|
	.map_alloc = inode_storage_map_alloc,
 | 
						|
	.map_free = inode_storage_map_free,
 | 
						|
	.map_get_next_key = notsupp_get_next_key,
 | 
						|
	.map_lookup_elem = bpf_fd_inode_storage_lookup_elem,
 | 
						|
	.map_update_elem = bpf_fd_inode_storage_update_elem,
 | 
						|
	.map_delete_elem = bpf_fd_inode_storage_delete_elem,
 | 
						|
	.map_check_btf = bpf_local_storage_map_check_btf,
 | 
						|
	.map_mem_usage = bpf_local_storage_map_mem_usage,
 | 
						|
	.map_btf_id = &bpf_local_storage_map_btf_id[0],
 | 
						|
	.map_owner_storage_ptr = inode_storage_ptr,
 | 
						|
};
 | 
						|
 | 
						|
BTF_ID_LIST_SINGLE(bpf_inode_storage_btf_ids, struct, inode)
 | 
						|
 | 
						|
const struct bpf_func_proto bpf_inode_storage_get_proto = {
 | 
						|
	.func		= bpf_inode_storage_get,
 | 
						|
	.gpl_only	= false,
 | 
						|
	.ret_type	= RET_PTR_TO_MAP_VALUE_OR_NULL,
 | 
						|
	.arg1_type	= ARG_CONST_MAP_PTR,
 | 
						|
	.arg2_type	= ARG_PTR_TO_BTF_ID_OR_NULL,
 | 
						|
	.arg2_btf_id	= &bpf_inode_storage_btf_ids[0],
 | 
						|
	.arg3_type	= ARG_PTR_TO_MAP_VALUE_OR_NULL,
 | 
						|
	.arg4_type	= ARG_ANYTHING,
 | 
						|
};
 | 
						|
 | 
						|
const struct bpf_func_proto bpf_inode_storage_delete_proto = {
 | 
						|
	.func		= bpf_inode_storage_delete,
 | 
						|
	.gpl_only	= false,
 | 
						|
	.ret_type	= RET_INTEGER,
 | 
						|
	.arg1_type	= ARG_CONST_MAP_PTR,
 | 
						|
	.arg2_type	= ARG_PTR_TO_BTF_ID_OR_NULL,
 | 
						|
	.arg2_btf_id	= &bpf_inode_storage_btf_ids[0],
 | 
						|
};
 |