net: inline get_netmem() and put_netmem()

These helpers are used in network fast paths.

Only call out-of-line helpers for netmem case.

We might consider inlining __get_netmem() and __put_netmem()
in the future.

$ scripts/bloat-o-meter -t vmlinux.3 vmlinux.4
add/remove: 6/6 grow/shrink: 22/1 up/down: 2614/-646 (1968)
Function                                     old     new   delta
pskb_carve                                  1669    1894    +225
gro_pull_from_frag0                            -     206    +206
get_page                                     190     380    +190
skb_segment                                 3561    3747    +186
put_page                                     595     765    +170
skb_copy_ubufs                              1683    1822    +139
__pskb_trim_head                             276     401    +125
__pskb_copy_fclone                           734     858    +124
skb_zerocopy                                1092    1215    +123
pskb_expand_head                             892    1008    +116
skb_split                                    828     940    +112
skb_release_data                             297     409    +112
___pskb_trim                                 829     941    +112
__skb_zcopy_downgrade_managed                120     226    +106
tcp_clone_payload                            530     634    +104
esp_ssg_unref                                191     294    +103
dev_gro_receive                             1464    1514     +50
__put_netmem                                   -      41     +41
__get_netmem                                   -      41     +41
skb_shift                                   1139    1175     +36
skb_try_coalesce                             681     714     +33
__pfx_put_page                               112     144     +32
__pfx_get_page                                32      64     +32
__pskb_pull_tail                            1137    1168     +31
veth_xdp_get                                 250     267     +17
__pfx_gro_pull_from_frag0                      -      16     +16
__pfx___put_netmem                             -      16     +16
__pfx___get_netmem                             -      16     +16
__pfx_put_netmem                              16       -     -16
__pfx_gro_try_pull_from_frag0                 16       -     -16
__pfx_get_netmem                              16       -     -16
put_netmem                                   114       -    -114
get_netmem                                   130       -    -130
napi_gro_frags                               929     771    -158
gro_try_pull_from_frag0                      196       -    -196
Total: Before=22565857, After=22567825, chg +0.01%

Signed-off-by: Eric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20260122045720.1221017-5-edumazet@google.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Eric Dumazet
2026-01-22 04:57:19 +00:00
committed by Jakub Kicinski
parent 87918dd4ea
commit df7388b3d7
2 changed files with 28 additions and 23 deletions

View File

@@ -401,8 +401,24 @@ static inline bool net_is_devmem_iov(const struct net_iov *niov)
}
#endif
void get_netmem(netmem_ref netmem);
void put_netmem(netmem_ref netmem);
void __get_netmem(netmem_ref netmem);
void __put_netmem(netmem_ref netmem);
static __always_inline void get_netmem(netmem_ref netmem)
{
if (netmem_is_net_iov(netmem))
__get_netmem(netmem);
else
get_page(netmem_to_page(netmem));
}
static __always_inline void put_netmem(netmem_ref netmem)
{
if (netmem_is_net_iov(netmem))
__put_netmem(netmem);
else
put_page(netmem_to_page(netmem));
}
#define netmem_dma_unmap_addr_set(NETMEM, PTR, ADDR_NAME, VAL) \
do { \

View File

@@ -7423,31 +7423,20 @@ bool csum_and_copy_from_iter_full(void *addr, size_t bytes,
}
EXPORT_SYMBOL(csum_and_copy_from_iter_full);
void get_netmem(netmem_ref netmem)
void __get_netmem(netmem_ref netmem)
{
struct net_iov *niov;
struct net_iov *niov = netmem_to_net_iov(netmem);
if (netmem_is_net_iov(netmem)) {
niov = netmem_to_net_iov(netmem);
if (net_is_devmem_iov(niov))
net_devmem_get_net_iov(netmem_to_net_iov(netmem));
return;
}
get_page(netmem_to_page(netmem));
if (net_is_devmem_iov(niov))
net_devmem_get_net_iov(netmem_to_net_iov(netmem));
}
EXPORT_SYMBOL(get_netmem);
EXPORT_SYMBOL(__get_netmem);
void put_netmem(netmem_ref netmem)
void __put_netmem(netmem_ref netmem)
{
struct net_iov *niov;
struct net_iov *niov = netmem_to_net_iov(netmem);
if (netmem_is_net_iov(netmem)) {
niov = netmem_to_net_iov(netmem);
if (net_is_devmem_iov(niov))
net_devmem_put_net_iov(netmem_to_net_iov(netmem));
return;
}
put_page(netmem_to_page(netmem));
if (net_is_devmem_iov(niov))
net_devmem_put_net_iov(netmem_to_net_iov(netmem));
}
EXPORT_SYMBOL(put_netmem);
EXPORT_SYMBOL(__put_netmem);