mbox series

[net-next,v6,0/2] Minor cleanups to skb frag ref/unref

Message ID 20240410190505.1225848-1-almasrymina@google.com (mailing list archive)
Headers show
Series Minor cleanups to skb frag ref/unref | expand

Message

Mina Almasry April 10, 2024, 7:05 p.m. UTC
v6:
- Rebased on top of net-next; dropped the merged patches.
- Move skb ref helpers to a new header file. (Jakub).

v5:
- Applied feedback from Eric to inline napi_pp_get_page().
- Applied Reviewed-By's.

v4:
- Rebased to net-next.
- Clarified skb_shift() code change in commit message.
- Use skb->pp_recycle in a couple of places where I previously hardcoded
  'false'.

v3:
- Fixed patchwork build errors/warnings from patch-by-patch modallconfig
  build

v2:
- Removed RFC tag.
- Rebased on net-next after the merge window opening.
- Added 1 patch at the beginning, "net: make napi_frag_unref reuse
  skb_page_unref" because a recent patch introduced some code
  duplication that can also be improved.
- Addressed feedback from Dragos & Yunsheng.
- Added Dragos's Reviewed-by.

This series is largely motivated by a recent discussion where there was
some confusion on how to properly ref/unref pp pages vs non pp pages:

https://lore.kernel.org/netdev/CAHS8izOoO-EovwMwAm9tLYetwikNPxC0FKyVGu1TPJWSz4bGoA@mail.gmail.com/T/#t

There is some subtely there because pp uses page->pp_ref_count for
refcounting, while non-pp uses get_page()/put_page() for ref counting.
Getting the refcounting pairs wrong can lead to kernel crash.

Additionally currently it may not be obvious to skb users unaware of
page pool internals how to properly acquire a ref on a pp frag. It
requires checking of skb->pp_recycle & is_pp_page() to make the correct
calls and may require some handling at the call site aware of arguable pp
internals.

This series is a minor refactor with a couple of goals:

1. skb users should be able to ref/unref a frag using
   [__]skb_frag_[un]ref() functions without needing to understand pp
   concepts and pp_ref_count vs get/put_page() differences.

2. reference counting functions should have a mirror opposite. I.e. there
   should be a foo_unref() to every foo_ref() with a mirror opposite
   implementation (as much as possible).

This is RFC to collect feedback if this change is desirable, but also so
that I don't race with the fix for the issue Dragos is seeing for his
crash.

https://lore.kernel.org/lkml/CAHS8izN436pn3SndrzsCyhmqvJHLyxgCeDpWXA4r1ANt3RCDLQ@mail.gmail.com/T/

Cc: Dragos Tatulea <dtatulea@nvidia.com>


Mina Almasry (2):
  net: move skb ref helpers to new header
  net: mirror skb frag ref/unref helpers

 .../chelsio/inline_crypto/ch_ktls/chcr_ktls.c |   3 +-
 drivers/net/ethernet/marvell/sky2.c           |   1 +
 drivers/net/ethernet/mellanox/mlx4/en_rx.c    |   1 +
 drivers/net/ethernet/sun/cassini.c            |   5 +-
 drivers/net/veth.c                            |   3 +-
 drivers/net/xen-netback/netback.c             |   1 +
 include/linux/skbuff.h                        |  63 -----------
 include/linux/skbuff_ref.h                    | 106 ++++++++++++++++++
 net/core/gro.c                                |   1 +
 net/core/skbuff.c                             |  47 +-------
 net/ipv4/esp4.c                               |   1 +
 net/ipv4/tcp_output.c                         |   1 +
 net/ipv6/esp6.c                               |   1 +
 net/tls/tls_device.c                          |   1 +
 net/tls/tls_device_fallback.c                 |   3 +-
 net/tls/tls_strp.c                            |   1 +
 16 files changed, 129 insertions(+), 110 deletions(-)
 create mode 100644 include/linux/skbuff_ref.h

Comments

patchwork-bot+netdevbpf@kernel.org April 12, 2024, 2:50 a.m. UTC | #1
Hello:

This series was applied to netdev/net-next.git (main)
by Jakub Kicinski <kuba@kernel.org>:

On Wed, 10 Apr 2024 12:05:00 -0700 you wrote:
> v6:
> - Rebased on top of net-next; dropped the merged patches.
> - Move skb ref helpers to a new header file. (Jakub).
> 
> v5:
> - Applied feedback from Eric to inline napi_pp_get_page().
> - Applied Reviewed-By's.
> 
> [...]

Here is the summary with links:
  - [net-next,v6,1/2] net: move skb ref helpers to new header
    https://git.kernel.org/netdev/net-next/c/f6d827b180bd
  - [net-next,v6,2/2] net: mirror skb frag ref/unref helpers
    https://git.kernel.org/netdev/net-next/c/a580ea994fd3

You are awesome, thank you!