From nobody Wed Jan 18 16:24:41 2023 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 4Nxrgt1K7Rz2yJLB; Wed, 18 Jan 2023 16:24:42 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Nxrgs727Lz3DXW; Wed, 18 Jan 2023 16:24:41 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674059082; 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=fZwSvQtyv4Df3AeXowsSwrppgk0zL045WJOTBKSYqpg=; b=pNXzdC46nb/4PjwwYfSgylEworaRkx+su7AitCPk/w8uFtrkPHBhR6ap7IK66/G/kYjfBp oEPeY+BKe1tq/q87avkEjuAQK8UbBFumnUbDBGBH1ifc//mD9jwWf3m30F8ufoNNMse1Lo K6G5IBMvOFIqc6X+bqHFmPiB87Gl9FFyRXF3HGcNdLhLlIlQ8pq1WjAGChDxP6Brh/E1UG KpQOMIAz2FUkhVQT7Y526AB/8v1vuAP9C192AsKdLvdCDtVtdj9/idDFInPLTT4Dodh7UQ Lo2A0OaWwMCOycG3/GUr5Ldb/RU3MSs5z0CVEqK8zol0b8sPtiTzCxiEcNdr0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1674059082; 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=fZwSvQtyv4Df3AeXowsSwrppgk0zL045WJOTBKSYqpg=; b=BAlGrTcECr7di9i9VFfBK4GvCWAw2o1p+QXe+WhPO+IWtReql/voDkpdsG3dxRVC5bP6rS 3NBRtusJB5HUr+fHmMBvOCc75FnnffhvYvWgTWq+LKJ9vY/yVWI6X1N/O50UyC6AKNQ9sn WZiqNOyKKY1PwqZWpFug0KydMj0izM29KgN5TbnyY8i9gOmyxZhvlMV6CyKDBNaM7DF5B+ c4hB4lnBu67fqZ4o/cVJk9sUWa2GMXS3BhwB3QJsODbsbgzpZq52NXz6oGgJ4Bjb9hEVbN zgXTAk7gF/cCli2rzXVWGL1ky1PR/OrePnQ4ONuTDlRwZ+yqwkhC9OGwkKgRUg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1674059082; a=rsa-sha256; cv=none; b=nvhvhPknBFVcWbVj87nNehG5aRdSfvJrn1wRua52YMr7Fvq4PgJmYvLgTFCuNCJAKOoFHv 37fyl80fmEKgG8R7hmxNuS2NxR20V6L7BmKiDDRg7Du76+YJ981Edh11Iir6H7OoEZV66m Wt5hxvqsIPMQSrjjklN69T39yVUeNzjtxemkXJndTH3jB3jmd5vx3TD7x1XodN7w7h3TAG HjYJ9GCqHgTR8AJ94wlwXXV58oJ4Nn+PWldB0kYgiwKnP3Md4e7Cb18F/iqp+8Rbn6LlM5 8dtZoOiXdZzigovWxKuiYkQnH5hVXnfToFNmVyjDzg8zBkWcaOl4EmnN002q1Q== 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 4Nxrgs58hkzHp8; Wed, 18 Jan 2023 16:24:41 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 30IGOfW7037757; Wed, 18 Jan 2023 16:24:41 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 30IGOfJc037756; Wed, 18 Jan 2023 16:24:41 GMT (envelope-from git) Date: Wed, 18 Jan 2023 16:24:41 GMT Message-Id: <202301181624.30IGOfJc037756@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: 07adc4446abc - stable/13 - LinuxKPI: SKB update 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: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: 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/13 X-Git-Reftype: branch X-Git-Commit: 07adc4446abcd49e678a01fe1e9c6f732e420982 Auto-Submitted: auto-generated X-ThisMailContainsUnwantedMimeParts: N The branch stable/13 has been updated by bz: URL: https://cgit.FreeBSD.org/src/commit/?id=07adc4446abcd49e678a01fe1e9c6f732e420982 commit 07adc4446abcd49e678a01fe1e9c6f732e420982 Author: Bjoern A. Zeeb AuthorDate: 2022-11-28 20:54:57 +0000 Commit: Bjoern A. Zeeb CommitDate: 2023-01-18 13:23:37 +0000 LinuxKPI: SKB update - skb_reset_tail_pointer(): we do not do offsets so do a plain reset - skb_add_rx_frag(): adjust data_len to keep track of the frag - based on that implement skb_is_nonlinear() and skb_linearize() - implement build_skb() and adjust linuxkpi_kfree_skb() and ddb macro. Sponsored by: The FreeBSD Foundation (partially) (cherry picked from commit 5504bd59a39ba0bd0014308ff1aa5d4899432a3e) --- sys/compat/linuxkpi/common/include/linux/skbuff.h | 56 +++++++++++++---------- sys/compat/linuxkpi/common/src/linux_skbuff.c | 33 ++++++++++++- 2 files changed, 62 insertions(+), 27 deletions(-) diff --git a/sys/compat/linuxkpi/common/include/linux/skbuff.h b/sys/compat/linuxkpi/common/include/linux/skbuff.h index d3a795344f86..b54f5a91769f 100644 --- a/sys/compat/linuxkpi/common/include/linux/skbuff.h +++ b/sys/compat/linuxkpi/common/include/linux/skbuff.h @@ -143,7 +143,8 @@ struct sk_buff { uint16_t l4hdroff; /* transport header offset from *head */ uint32_t priority; uint16_t qmap; /* queue mapping */ - uint16_t _spareu16_0; + uint16_t _flags; /* Internal flags. */ +#define _SKB_FLAGS_SKBEXTFRAG 0x0001 enum sk_buff_pkt_type pkt_type; /* "Scratch" area for layers to store metadata. */ @@ -174,6 +175,7 @@ struct sk_buff { struct sk_buff *linuxkpi_alloc_skb(size_t, gfp_t); struct sk_buff *linuxkpi_dev_alloc_skb(size_t, gfp_t); +struct sk_buff *linuxkpi_build_skb(void *, size_t); void linuxkpi_kfree_skb(struct sk_buff *); struct sk_buff *linuxkpi_skb_copy(struct sk_buff *, gfp_t); @@ -241,6 +243,16 @@ dev_kfree_skb_irq(struct sk_buff *skb) dev_kfree_skb(skb); } +static inline struct sk_buff * +build_skb(void *data, unsigned int fragsz) +{ + struct sk_buff *skb; + + skb = linuxkpi_build_skb(data, fragsz); + SKB_TRACE(skb); + return (skb); +} + /* -------------------------------------------------------------------------- */ /* XXX BZ review this one for terminal condition as Linux "queues" are special. */ @@ -467,6 +479,7 @@ skb_add_rx_frag(struct sk_buff *skb, int fragno, struct page *page, shinfo->frags[fragno].size = size; shinfo->nr_frags = fragno + 1; skb->len += size; + skb->data_len += size; skb->truesize += truesize; /* XXX TODO EXTEND truesize? */ @@ -736,13 +749,6 @@ skb_frag_size(const skb_frag_t *frag) return (-1); } -static inline bool -skb_is_nonlinear(struct sk_buff *skb) -{ - SKB_TRACE(skb); - return ((skb->data_len > 0) ? true : false); -} - #define skb_walk_frags(_skb, _frag) \ for ((_frag) = (_skb); false; (_frag)++) @@ -847,6 +853,13 @@ skb_network_header(struct sk_buff *skb) return (skb->head + skb->l3hdroff); } +static inline bool +skb_is_nonlinear(struct sk_buff *skb) +{ + SKB_TRACE(skb); + return ((skb->data_len > 0) ? true : false); +} + static inline int __skb_linearize(struct sk_buff *skb) { @@ -855,6 +868,13 @@ __skb_linearize(struct sk_buff *skb) return (ENXIO); } +static inline int +skb_linearize(struct sk_buff *skb) +{ + + return (skb_is_nonlinear(skb) ? __skb_linearize(skb) : 0); +} + static inline int pskb_expand_head(struct sk_buff *skb, int x, int len, gfp_t gfp) { @@ -936,7 +956,10 @@ skb_reset_tail_pointer(struct sk_buff *skb) { SKB_TRACE(skb); +#ifdef SKB_DOING_OFFSETS_US_NOT skb->tail = (uint8_t *)(uintptr_t)(skb->data - skb->head); +#endif + skb->tail = skb->data; SKB_TRACE(skb); } @@ -965,14 +988,6 @@ skb_copy_from_linear_data(const struct sk_buff *skb, void *dst, size_t len) memcpy(dst, skb->data, len); } -static inline struct sk_buff * -build_skb(void *data, unsigned int fragsz) -{ - - SKB_TODO(); - return (NULL); -} - static inline int skb_pad(struct sk_buff *skb, int pad) { @@ -998,15 +1013,6 @@ napi_consume_skb(struct sk_buff *skb, int budget) SKB_TODO(); } -static inline bool -skb_linearize(struct sk_buff *skb) -{ - - SKB_TRACE(skb); - SKB_TODO(); - return (false); -} - #define SKB_WITH_OVERHEAD(_s) \ (_s) - ALIGN(sizeof(struct skb_shared_info), CACHE_LINE_SIZE) diff --git a/sys/compat/linuxkpi/common/src/linux_skbuff.c b/sys/compat/linuxkpi/common/src/linux_skbuff.c index df8e3fda8d56..c23a59b3c536 100644 --- a/sys/compat/linuxkpi/common/src/linux_skbuff.c +++ b/sys/compat/linuxkpi/common/src/linux_skbuff.c @@ -150,6 +150,28 @@ linuxkpi_dev_alloc_skb(size_t size, gfp_t gfp) return (skb); } +struct sk_buff * +linuxkpi_build_skb(void *data, size_t fragsz) +{ + struct sk_buff *skb; + + if (data == NULL || fragsz == 0) + return (NULL); + + /* Just allocate a skb without data area. */ + skb = linuxkpi_alloc_skb(0, GFP_KERNEL); + if (skb == NULL) + return (NULL); + + 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); + + return (skb); +} + struct sk_buff * linuxkpi_skb_copy(struct sk_buff *skb, gfp_t gfp) { @@ -233,6 +255,13 @@ linuxkpi_kfree_skb(struct sk_buff *skb) } } + if ((skb->_flags & _SKB_FLAGS_SKBEXTFRAG) != 0) { + void *p; + + p = skb->head; + skb_free_frag(p); + } + #ifdef __LP64__ if (__predict_true(linuxkpi_skb_memlimit == 0)) free(skb, M_LKPISKB); @@ -268,6 +297,7 @@ DB_SHOW_COMMAND(skb, db_show_skb) skb->pkt_type, skb->dev, skb->sk); db_printf("\tcsum_offset %d csum_start %d ip_summed %d protocol %d\n", skb->csum_offset, skb->csum_start, skb->ip_summed, skb->protocol); + db_printf("\t_flags %#06x\n", skb->_flags); /* XXX-BZ print names? */ db_printf("\thead %p data %p tail %p end %p\n", skb->head, skb->data, skb->tail, skb->end); db_printf("\tshinfo %p m %p m_free_func %p\n", @@ -298,7 +328,6 @@ DB_SHOW_COMMAND(skb, db_show_skb) } db_printf("}\n"); - db_printf("\t_spareu16_0 %#06x __scratch[0] %p\n", - skb->_spareu16_0, skb->__scratch); + db_printf("\t__scratch[0] %p\n", skb->__scratch); }; #endif