From nobody Tue Apr 22 23:46:18 2025 X-Original-To: dev-commits-src-main@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 4ZhzQg186Tz5tNCH; Tue, 22 Apr 2025 23:46:19 +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 4ZhzQf5Q21z3qM4; Tue, 22 Apr 2025 23:46:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1745365578; 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=FSPEpTgJU3AsJywbpk3BqkIEhHPvyDjZRuY8S2GCg4w=; b=aM5hghAeUsf3H+RTI/vegxmf+1ZjIDgufAWghUaZwJMw+wv5SAjD/HcN3y4XpyQ59q5GYn FrNMy9ap9jh40AjbfiAdDwksYi/iEZNbd6nXGjUCJiuIWgfF0Ar3qL+4mj7Yv9PllPb9b1 kj0gW9zOciieeXNCTQktqjOxlJfKnTT5k68gc2o5LxTx2dfCo2KQe+NR1uTIvRHmcv+7gY AgbAOcw0KS5t4KHzOIRUmf8yJxybEDNwUFsS7kBek/vCmwgPLMOwrHZWQQ62spAOY7Xx9j sgZ/qBhS5LiHew4KfYVxpOLS962vu5fjPsbfTducmPFGUQGG2Z2YljwoZ/BY7A== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1745365578; a=rsa-sha256; cv=none; b=JXRCSBZnB10NLgBD6Kz0j0dPJRPquJWXL+08khWokDzfMoxf9EraDbm5AxN6h9uFlMIVKH EnBjqGKCCg6KT3dWH5dnXm7WZ9JAnmpwEl6sa6M/0p3EZVj2Q3KDdHK6Bbgqj1Nepm/4bU b8oEjf8PcOFsP8muTt4GjFEJtK4+5NM26SvDMlBZp9bm1P6Cl4b0Uot5sRpjMBHcPvfJFr LKeSl9V48jjvNykjJcVMtWeSynQefiLQ6UHrN184CxQ4MNsOp+EFHr7iDEPJGnwS4YN2E3 GJXq7ZjWsVSO+OskDT5BT9KAvPcVZkhn+T24ylBG+Z+GPffB6vl9UYCDfjGKuA== 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=1745365578; 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=FSPEpTgJU3AsJywbpk3BqkIEhHPvyDjZRuY8S2GCg4w=; b=TW1jMOQDWzk6yMHARqYNcvzJ7bsCzGoC1XqGjZW5fT5yUFlkDDWPwBO/d3RK9h/9SPtZdB yXiinv7otQR+qR/clJsiK2FmvnT/KVoGna6fLa8/cVGqyS8PC+ylyuJHIOhp9jyWYNkVwz 96CHEwEIBByLW64nca8RaYJzzejTAWNoV96z0Gz821U8DPPopC6qi0ST71B7UqAsCry5Ai a21ezNlbtbf0tE4jh9W15bAuGb7BocZMTQmw+46c8uFt4qjlOCLZswMraxYBm4O8arR61m Ss4+MbqqLCAGy9qmd7BpNp6w2wUnK67+OnREU/gm15oM6Pg5f9mYU4VDfrlFxw== 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 4ZhzQf4kd8zfxm; Tue, 22 Apr 2025 23:46:18 +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 53MNkIDA009768; Tue, 22 Apr 2025 23:46:18 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 53MNkIqr009765; Tue, 22 Apr 2025 23:46:18 GMT (envelope-from git) Date: Tue, 22 Apr 2025 23:46:18 GMT Message-Id: <202504222346.53MNkIqr009765@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: "Bjoern A. Zeeb" Subject: git: 43ffd0f5c0f9 - main - LinuxKPI: skbuff: switch to using uma for the skb List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@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/main X-Git-Reftype: branch X-Git-Commit: 43ffd0f5c0f91237a37736f1d40045b0052b775b Auto-Submitted: auto-generated The branch main has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=43ffd0f5c0f91237a37736f1d40045b0052b775b commit 43ffd0f5c0f91237a37736f1d40045b0052b775b Author: Bjoern A. Zeeb AuthorDate: 2025-04-22 20:41:40 +0000 Commit: Bjoern A. Zeeb CommitDate: 2025-04-22 23:45:49 +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 MFC after: 3 days --- 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)