From nobody Tue Apr 29 11:41:46 2025 X-Original-To: dev-commits-src-branches@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Zmz1R09ycz5tvC0; Tue, 29 Apr 2025 11:41:47 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R11" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Zmz1Q2MRRz3wpc; Tue, 29 Apr 2025 11:41:46 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745926906; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Rj4MDw1TCFLIYecT4Dj02XI+9fePOUwIlL47lmuDTQ4=; b=ozTLN5of6tBEZpq+P7sQEsT6fhWbW5BPowr8L2/OpBROSm+naJq6QDD1YMvUw7M+TtBnxI W80y6jwZmQzo7jU9nGhmFGLar6sku0S7UZXa9JQgqSiunyvDx/7Ju6G71ji1WL3Ra9fCRd SPnA2jdoiz/c12rdNRFnc/m7vvQdKAqDcvozS4FsLEn7RgNQjKipf5omG+/oG/hkEX8UX5 l70uMGEvPeJKCqWaVjlExO9Y83Gwgc68kqb0xtTXzxsHaLnDrX+E+LoOWdFKAoHkityk4W sMrR7E3rLuc0OXJnsgFaDZwlVOmgNq26IQT64cLAwFh/KyKWjRsvHQoiuTAYVg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745926906; a=rsa-sha256; cv=none; b=QXIYEXA5G9/dH9e4TsGfXGICEe7aK0TxyQNSKZDcZSFpiAomTRZj2eHY5tMWzKEckuCR1C wv2WfHgL1X/AjD1c5ENEDUOFjdZ9bY1rVGjcM57J/1gfU0ZAJykkCZNkEvqYpDoWGkSbmw RguWPZczIjq4TuqHhmkWgVuZZ2we/U5gUWr113hG7NiAQZCDx156R3/RNx9/HrFFtHY7pb ozToIVf5cbf2bZCGDUeX5NYIzn3Ldy51bMHLEnPUu3qDG4MvUdUjsK5lCbFClNiP7U5NLB 3P6byNamHaKvoRyMrg0JDztuAGK393FMptMip2TyiJZG4U9klJrSepx17+jX1g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745926906; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=Rj4MDw1TCFLIYecT4Dj02XI+9fePOUwIlL47lmuDTQ4=; b=M2bp/VOyWr+qVptMWfnajiTKCtnMTzTnRmE+fsATE670wdVKZ6Vtf5FG73tn9mWzt8wl+r BYsjF7xXh8xtm5lo+UdphRs4By/mqskPRjRrn5wf36P8nVRS4L8s7HiFM/cfzXf8dJJ/zJ a7lM4bM7OOw/LpAnQfe3ZA4ex596rqrFBYaefFa+y1d+Sc1j/e/58U4NGXtc0juCOxtzgx +Cnb7NVtIIVT1NdsvrAgBKO73f+GHhiC6MH7/D0iL5+ozkYB0roHJLHK3yoJKA2NPrBXz1 r1aEE/Unh3NjgRagTI/UyU1Lt1iEnf1cI7f3nIXzVM603yOMa2zMYPM7rj0xCQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Zmz1Q1yQqz3yY; Tue, 29 Apr 2025 11:41:46 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 53TBfkY1046042; Tue, 29 Apr 2025 11:41:46 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53TBfkhw046039; Tue, 29 Apr 2025 11:41:46 GMT (envelope-from git) Date: Tue, 29 Apr 2025 11:41:46 GMT Message-Id: <202504291141.53TBfkhw046039@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 85c811c9e368 - stable/14 - LinuxKPI: skbuff: switch to using uma for the skb List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-branches@freebsd.org Sender: owner-dev-commits-src-branches@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: bz X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: 85c811c9e368dccadf20c071117b8e84efb3281d Auto-Submitted: auto-generated The branch stable/14 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=85c811c9e368dccadf20c071117b8e84efb3281d commit 85c811c9e368dccadf20c071117b8e84efb3281d Author: Bjoern A. Zeeb AuthorDate: 2025-04-22 20:41:40 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-04-29 10:49:29 +0000 LinuxKPI: skbuff: switch to using uma for the skb Split allocating the skb header and its payload data memory into skb header from uma and the data to whatever we used to do for it. This is a first step which should allow us to one day at least in the RX path take the data, attach it to an mbuf and send it up the stack and just free the skbuff header. Sponsored by: The FreeBSD Foundation (cherry picked from commit 43ffd0f5c0f91237a37736f1d40045b0052b775b) --- sys/compat/linuxkpi/common/src/linux_skbuff.c | 65 ++++++++++++++++++++------- 1 file changed, 49 insertions(+), 16 deletions(-) diff --git a/sys/compat/linuxkpi/common/src/linux_skbuff.c b/sys/compat/linuxkpi/common/src/linux_skbuff.c index 4139295fc837..d454e5fc3ab8 100644 --- a/sys/compat/linuxkpi/common/src/linux_skbuff.c +++ b/sys/compat/linuxkpi/common/src/linux_skbuff.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 2020-2022 The FreeBSD Foundation + * Copyright (c) 2020-2025 The FreeBSD Foundation * Copyright (c) 2021-2022 Bjoern A. Zeeb * * This software was developed by Björn Zeeb under sponsorship from @@ -42,6 +42,8 @@ #include #include +#include + #ifdef DDB #include #endif @@ -63,6 +65,8 @@ SYSCTL_INT(_compat_linuxkpi_skb, OID_AUTO, debug, CTLFLAG_RWTUN, &linuxkpi_debug_skb, 0, "SKB debug level"); #endif +static uma_zone_t skbzone; + #ifdef __LP64__ /* * Realtek wireless drivers (e.g., rtw88) require 32bit DMA in a single segment. @@ -84,16 +88,28 @@ struct sk_buff * linuxkpi_alloc_skb(size_t size, gfp_t gfp) { struct sk_buff *skb; + void *p; size_t len; - len = sizeof(*skb) + size + sizeof(struct skb_shared_info); + skb = uma_zalloc(skbzone, linux_check_m_flags(gfp) | M_ZERO); + if (skb == NULL) + return (NULL); + + skb->prev = skb->next = skb; + skb->truesize = size; + skb->shinfo = (struct skb_shared_info *)(skb + 1); + + if (size == 0) + return (skb); + + len = size; /* * Using our own type here not backing my kmalloc. * We assume no one calls kfree directly on the skb. */ #ifdef __LP64__ if (__predict_true(linuxkpi_skb_memlimit == 0)) { - skb = malloc(len, M_LKPISKB, linux_check_m_flags(gfp) | M_ZERO); + p = malloc(len, M_LKPISKB, linux_check_m_flags(gfp) | M_ZERO); } else { vm_paddr_t high; @@ -107,23 +123,21 @@ linuxkpi_alloc_skb(size_t size, gfp_t gfp) break; } len = roundup_pow_of_two(len); - skb = contigmalloc(len, M_LKPISKB, + p = contigmalloc(len, M_LKPISKB, linux_check_m_flags(gfp) | M_ZERO, 0, high, PAGE_SIZE, 0); } #else - skb = malloc(len, M_LKPISKB, linux_check_m_flags(gfp) | M_ZERO); + p = malloc(len, M_LKPISKB, linux_check_m_flags(gfp) | M_ZERO); #endif - if (skb == NULL) - return (skb); - skb->truesize = size; + if (p == NULL) { + uma_zfree(skbzone, skb); + return (NULL); + } - skb->head = skb->data = skb->tail = (uint8_t *)(skb+1); + skb->head = skb->data = (uint8_t *)p; + skb_reset_tail_pointer(skb); skb->end = skb->head + size; - skb->prev = skb->next = skb; - - skb->shinfo = (struct skb_shared_info *)(skb->end); - SKB_TRACE_FMT(skb, "data %p size %zu", (skb) ? skb->data : NULL, size); return (skb); } @@ -161,8 +175,8 @@ linuxkpi_build_skb(void *data, size_t fragsz) skb->_flags |= _SKB_FLAGS_SKBEXTFRAG; skb->truesize = fragsz; skb->head = skb->data = data; - skb_reset_tail_pointer(skb); /* XXX is that correct? */ - skb->end = (void *)((uintptr_t)skb->head + fragsz); + skb_reset_tail_pointer(skb); + skb->end = skb->head + fragsz; return (skb); } @@ -255,10 +269,29 @@ linuxkpi_kfree_skb(struct sk_buff *skb) p = skb->head; skb_free_frag(p); + skb->head = NULL; } - free(skb, M_LKPISKB); + free(skb->head, M_LKPISKB); + uma_zfree(skbzone, skb); +} + +static void +lkpi_skbuff_init(void *arg __unused) +{ + skbzone = uma_zcreate("skbuff", + sizeof(struct sk_buff) + sizeof(struct skb_shared_info), + NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); + /* Do we need to apply limits? */ +} +SYSINIT(linuxkpi_skbuff, SI_SUB_DRIVERS, SI_ORDER_FIRST, lkpi_skbuff_init, NULL); + +static void +lkpi_skbuff_destroy(void *arg __unused) +{ + uma_zdestroy(skbzone); } +SYSUNINIT(linuxkpi_skbuff, SI_SUB_DRIVERS, SI_ORDER_SECOND, lkpi_skbuff_destroy, NULL); #ifdef DDB DB_SHOW_COMMAND(skb, db_show_skb)