From patchwork Tue Mar 4 09:25:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000246 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 606A1C282D0 for ; Tue, 4 Mar 2025 09:25:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1A93C280005; Tue, 4 Mar 2025 04:25:20 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 0BA05280001; Tue, 4 Mar 2025 04:25:20 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id EA2F5280005; Tue, 4 Mar 2025 04:25:19 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id C1632280001 for ; Tue, 4 Mar 2025 04:25:19 -0500 (EST) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 4B7C881A04 for ; Tue, 4 Mar 2025 09:25:19 +0000 (UTC) X-FDA: 83183335158.16.C16161F Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf06.hostedemail.com (Postfix) with ESMTP id 2A9DA180006 for ; Tue, 4 Mar 2025 09:25:16 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=gIOw3RLP; spf=pass (imf06.hostedemail.com: domain of herbert@gondor.apana.org.au designates 144.6.53.87 as permitted sender) smtp.mailfrom=herbert@gondor.apana.org.au; dmarc=pass (policy=quarantine) header.from=apana.org.au ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741080317; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:content-type: content-transfer-encoding:in-reply-to:in-reply-to: references:references:dkim-signature; bh=ohyCghcONkkI1RQ7lYU6pSsY7Vt9ONamE1WQpUNPRNg=; b=MzUJMM/ciZ0UQ+UIXiQVvOEUxHauk3lZU462Fkxe1AsyB96EQ80waQa73jw8oDOBVyKAkz fmzeHYilo2g7ClNiCR8jP+fzaWqKZ8XOS8pK6Btf2gDDH1kh1jjp8687ZXqG6Hq7pHPF/z 1jE7WirtlvJmBlXbG2dv6CFLUHSG6Ew= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=gIOw3RLP; spf=pass (imf06.hostedemail.com: domain of herbert@gondor.apana.org.au designates 144.6.53.87 as permitted sender) smtp.mailfrom=herbert@gondor.apana.org.au; dmarc=pass (policy=quarantine) header.from=apana.org.au ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741080317; a=rsa-sha256; cv=none; b=z6vClO5XfvjCsx2f9dCbrMy3SSwtoLAI1F9X5haSlpSAno7kpoiW/1ydcFMmkXJ0Vim4z6 A2j3rZ9/Ab/vYZFK9pqlOgIa0eCgOZ5btKKPZKiSlYwM9a2xp7Ntd25N8Dwh9tcOq/hJ0p a/iKCnHVqaY9d+MivehnAKjG31wMTPI= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=hmeau.com; s=formenos; h=Cc:To:Subject:From:References:In-Reply-To:Message-Id:Date: Sender:Reply-To:MIME-Version:Content-Type:Content-Transfer-Encoding: Content-ID:Content-Description:Resent-Date:Resent-From:Resent-Sender: Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=ohyCghcONkkI1RQ7lYU6pSsY7Vt9ONamE1WQpUNPRNg=; b=gIOw3RLP35QeN9c7IznxuMqEjl b17BqBR9VjCgO0eTaqJq/aQTJslrifTKl5hU8kqIcajROrf0Zjmlhupgyk3aI6iENCEKtDSuOpadw U1zzENGex2x+qyM8DCwhjkzNbrfFHiroKDwv8oG8GXZ4gv33VU5DomR8BDzxKXXXtDaUMSMEkG+Cc +eguvTGwFvKLsQe8AODHJRADUKAc1+h8i95V/AqpXKCnajv2xeCxZRDuJq8CdLaWnl73IJ6Y8K8SI fsf/iKW1Nmy/qSV2HTeNn0jbq5GLAKIwvnbYi1GmLR/9WGUF7TQhL+Zz0URYDLEUSk7/rUtvOek8M GQHEwmhQ==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWX-003a39-09; Tue, 04 Mar 2025 17:25:14 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:13 +0800 Date: Tue, 04 Mar 2025 17:25:13 +0800 Message-Id: <840b89f0c8a11c691ea827a7ce620a6931e434d4.1741080140.git.herbert@gondor.apana.org.au> In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 5/7] crypto: scomp - Remove support for most non-trivial destination SG lists To: Linux Crypto Mailing List Cc: linux-mm@kvack.org, Yosry Ahmed , Kanchana P Sridhar X-Rspam-User: X-Rspamd-Server: rspam10 X-Rspamd-Queue-Id: 2A9DA180006 X-Stat-Signature: bh7bizcamdctimfxcmhxckiewywfct46 X-HE-Tag: 1741080316-24653 X-HE-Meta: U2FsdGVkX18OyXAt8H0jJbaIuodO3mEgpI0YXC7RGLyEySE+xwhDmnnhMprqdO/Oq3QEenqKyjYdT4Dt/1uWqOP9he/aKRebpfVz0geayYykjtza8BtRqTeflJkXDBRQQBtv4mh7jGkTc6ej8KdpegcQcUjxdrvB6fALPJFc5D/+8FQ/EAaTdxP2HyG87h2EktGIJQC7UmkCLur/PWigZe6lUMiQ6BsZp/p4qiZatIubJjGDQ4R7/V60OUSwU+MFo2J7Har6mv2RZ7Jkb3Xgfwr5jy0ThIIUNk8vRk7fCQX+dJHfMggRB7hJNKA66f+hkbOr+W6Jc3KXenATu6hsmnckrujGiFtFBlT28Wk1+SExcz+/3srO1sMa5lC4YmlOkdzbrP/OK2nzA8hf4ALolSYVRDXMBSdgDjq6qR+AERp6EFwbPn0CdqK4SmDVgr5sAyemE8kBYEEhCcKtnru1IR+O4UJCpllarllZo04EmtgnTWrOmhoVf/o6WCdVLnQNnxXZeib/JdQF4167FuB7o9Vk4eXF1PQ16rD2/d7h2/UqZFnKRG5ewQF4LTKfiu7kR+IjJbMshbuPshH+F1Lv//WEZY5djtrZ4e0kIPyo4IPr72uso6pZz/jWZPWYex6UBfTtkabw0r94vq3DTQ3b+oAQm8R4J9ENE/U27L5xVqAnS/HohSu3fPaz6ETKBVFWudAbUA1vGOFdKHKrzrVFOEf6F67UH3wzXPr2xVPSlg836iEZJ7NYyyRt6gwcTh2KwwWSFsCUPIvtKdfZiEvNx1hzzCi6eHkcKwk1LgsctlNq6tPn/JmtQbMM2B0A2Z8CYQ5S9BAuUHWZkmt7crZKT6KCh4Lao7kE5hs7hNbS8Mo8jmw2x6thVWVDQHFNdunB5IyKiwGgHC3II7EwVwa0jCYa4HEJeKKgJOCi8JfrrdNyR5gNdF1OxyaxHa3LqdJQOsnj/SChZ++iZR8xwYq UjrPr8Q8 YtNJTXFR6HUEf07WiJiKDQoqSawuJ6FsxrTNanL0eb4JLLk2eBVBSYGYavn4fUohJMF0EeHt3s/Qmze6g/waBy/jfdBsYs7Nevc9j97iRKTwpKU1z5evQXqB026tDr1GivnLlUP8cusyXfNCSd0JgMwBIcwjHmrQqJy/SN4XXKomLaXJ/37o5L8fd+bmTbQ1FHeyN/MxskY8vWtxbfB+IWwg+TA== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: As the only user of acomp/scomp uses a trivial single-page SG list, remove support for everything else in preprataion for the addition of virtual address support. However, keep support for non-trivial source SG lists as that user is currently jumping through hoops in order to linearise the source data. Limit the source SG linearisation buffer to a single page as that user never goes over that. The only other potential user is also unlikely to exceed that (IPComp) and it can easily do its own linearisation if necessary. Signed-off-by: Herbert Xu --- crypto/acompress.c | 6 -- crypto/scompress.c | 98 ++++++++++++----------------- include/crypto/acompress.h | 12 +--- include/crypto/internal/scompress.h | 2 - 4 files changed, 42 insertions(+), 76 deletions(-) diff --git a/crypto/acompress.c b/crypto/acompress.c index d2103d4e42cc..8914d0c4cc75 100644 --- a/crypto/acompress.c +++ b/crypto/acompress.c @@ -73,7 +73,6 @@ static int crypto_acomp_init_tfm(struct crypto_tfm *tfm) acomp->compress = alg->compress; acomp->decompress = alg->decompress; - acomp->dst_free = alg->dst_free; acomp->reqsize = alg->reqsize; if (alg->exit) @@ -146,11 +145,6 @@ void acomp_request_free(struct acomp_req *req) if (tfm->__crt_alg->cra_type != &crypto_acomp_type) crypto_acomp_scomp_free_ctx(req); - if (req->base.flags & CRYPTO_ACOMP_ALLOC_OUTPUT) { - acomp->dst_free(req->dst); - req->dst = NULL; - } - __acomp_request_free(req); } EXPORT_SYMBOL_GPL(acomp_request_free); diff --git a/crypto/scompress.c b/crypto/scompress.c index 1cef6bb06a81..d78f307343ac 100644 --- a/crypto/scompress.c +++ b/crypto/scompress.c @@ -18,15 +18,18 @@ #include #include #include -#include #include #include "compress.h" +#define SCOMP_SCRATCH_SIZE PAGE_SIZE + struct scomp_scratch { spinlock_t lock; - void *src; - void *dst; + union { + void *src; + unsigned long saddr; + }; }; static DEFINE_PER_CPU(struct scomp_scratch, scomp_scratch) = { @@ -66,10 +69,8 @@ static void crypto_scomp_free_scratches(void) for_each_possible_cpu(i) { scratch = per_cpu_ptr(&scomp_scratch, i); - vfree(scratch->src); - vfree(scratch->dst); + free_page(scratch->saddr); scratch->src = NULL; - scratch->dst = NULL; } } @@ -79,18 +80,14 @@ static int crypto_scomp_alloc_scratches(void) int i; for_each_possible_cpu(i) { - void *mem; + unsigned long mem; scratch = per_cpu_ptr(&scomp_scratch, i); - mem = vmalloc_node(SCOMP_SCRATCH_SIZE, cpu_to_node(i)); + mem = __get_free_page(GFP_KERNEL); if (!mem) goto error; - scratch->src = mem; - mem = vmalloc_node(SCOMP_SCRATCH_SIZE, cpu_to_node(i)); - if (!mem) - goto error; - scratch->dst = mem; + scratch->saddr = mem; } return 0; error: @@ -113,72 +110,58 @@ static int crypto_scomp_init_tfm(struct crypto_tfm *tfm) static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) { struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); - void **tfm_ctx = acomp_tfm_ctx(tfm); + struct crypto_scomp **tfm_ctx = acomp_tfm_ctx(tfm); struct crypto_scomp *scomp = *tfm_ctx; void **ctx = acomp_request_ctx(req); struct scomp_scratch *scratch; + unsigned int slen = req->slen; + unsigned int dlen = req->dlen; void *src, *dst; - unsigned int dlen; int ret; - if (!req->src || !req->slen || req->slen > SCOMP_SCRATCH_SIZE) + if (!req->src || !slen) return -EINVAL; - if (req->dst && !req->dlen) + if (req->dst && !dlen) return -EINVAL; - if (!req->dlen || req->dlen > SCOMP_SCRATCH_SIZE) - req->dlen = SCOMP_SCRATCH_SIZE; + if (sg_nents(req->dst) > 1) + return -ENOSYS; - dlen = req->dlen; + if (req->dst->offset >= PAGE_SIZE) + return -ENOSYS; + + if (req->dst->offset + dlen > PAGE_SIZE) + dlen = PAGE_SIZE - req->dst->offset; + + if (sg_nents(req->src) == 1 && (!PageHighMem(sg_page(req->src)) || + req->src->offset + slen <= PAGE_SIZE)) + src = kmap_local_page(sg_page(req->src)) + req->src->offset; + else + src = scratch->src; + + dst = kmap_local_page(sg_page(req->dst)) + req->dst->offset; scratch = raw_cpu_ptr(&scomp_scratch); spin_lock(&scratch->lock); - if (sg_nents(req->src) == 1 && !PageHighMem(sg_page(req->src))) { - src = page_to_virt(sg_page(req->src)) + req->src->offset; - } else { - scatterwalk_map_and_copy(scratch->src, req->src, 0, - req->slen, 0); - src = scratch->src; - } - - if (req->dst && sg_nents(req->dst) == 1 && !PageHighMem(sg_page(req->dst))) - dst = page_to_virt(sg_page(req->dst)) + req->dst->offset; - else - dst = scratch->dst; + if (src == scratch->src) + memcpy_from_sglist(src, req->src, 0, req->slen); if (dir) - ret = crypto_scomp_compress(scomp, src, req->slen, + ret = crypto_scomp_compress(scomp, src, slen, dst, &req->dlen, *ctx); else - ret = crypto_scomp_decompress(scomp, src, req->slen, + ret = crypto_scomp_decompress(scomp, src, slen, dst, &req->dlen, *ctx); - if (!ret) { - if (!req->dst) { - req->dst = sgl_alloc(req->dlen, GFP_ATOMIC, NULL); - if (!req->dst) { - ret = -ENOMEM; - goto out; - } - } else if (req->dlen > dlen) { - ret = -ENOSPC; - goto out; - } - if (dst == scratch->dst) { - scatterwalk_map_and_copy(scratch->dst, req->dst, 0, - req->dlen, 1); - } else { - int nr_pages = DIV_ROUND_UP(req->dst->offset + req->dlen, PAGE_SIZE); - int i; - struct page *dst_page = sg_page(req->dst); - for (i = 0; i < nr_pages; i++) - flush_dcache_page(dst_page + i); - } - } -out: spin_unlock(&scratch->lock); + + if (src != scratch->src) + kunmap_local(src); + kunmap_local(dst); + flush_dcache_page(sg_page(req->dst)); + return ret; } @@ -225,7 +208,6 @@ int crypto_init_scomp_ops_async(struct crypto_tfm *tfm) crt->compress = scomp_acomp_compress; crt->decompress = scomp_acomp_decompress; - crt->dst_free = sgl_free; crt->reqsize = sizeof(void *); return 0; diff --git a/include/crypto/acompress.h b/include/crypto/acompress.h index 15bb13e47f8b..25e193b0b8b4 100644 --- a/include/crypto/acompress.h +++ b/include/crypto/acompress.h @@ -15,8 +15,6 @@ #include #include -#define CRYPTO_ACOMP_ALLOC_OUTPUT 0x00000001 - /* Set this bit for virtual address instead of SG list. */ #define CRYPTO_ACOMP_REQ_VIRT 0x00000002 @@ -75,15 +73,12 @@ struct acomp_req { * * @compress: Function performs a compress operation * @decompress: Function performs a de-compress operation - * @dst_free: Frees destination buffer if allocated inside the - * algorithm * @reqsize: Context size for (de)compression requests * @base: Common crypto API algorithm data structure */ struct crypto_acomp { int (*compress)(struct acomp_req *req); int (*decompress)(struct acomp_req *req); - void (*dst_free)(struct scatterlist *dst); unsigned int reqsize; struct crypto_tfm base; }; @@ -234,7 +229,7 @@ static inline void acomp_request_set_callback(struct acomp_req *req, crypto_completion_t cmpl, void *data) { - u32 keep = CRYPTO_ACOMP_ALLOC_OUTPUT | CRYPTO_ACOMP_REQ_VIRT; + u32 keep = CRYPTO_ACOMP_REQ_VIRT; req->base.complete = cmpl; req->base.data = data; @@ -268,9 +263,7 @@ static inline void acomp_request_set_params(struct acomp_req *req, req->slen = slen; req->dlen = dlen; - req->base.flags &= ~(CRYPTO_ACOMP_ALLOC_OUTPUT | CRYPTO_ACOMP_REQ_VIRT); - if (!req->dst) - req->base.flags |= CRYPTO_ACOMP_ALLOC_OUTPUT; + req->base.flags &= ~CRYPTO_ACOMP_REQ_VIRT; } /** @@ -294,7 +287,6 @@ static inline void acomp_request_set_virt(struct acomp_req *req, req->slen = slen; req->dlen = dlen; - req->base.flags &= ~CRYPTO_ACOMP_ALLOC_OUTPUT; req->base.flags |= CRYPTO_ACOMP_REQ_VIRT; } diff --git a/include/crypto/internal/scompress.h b/include/crypto/internal/scompress.h index 6ba9974df7d3..2a6b15c0a32d 100644 --- a/include/crypto/internal/scompress.h +++ b/include/crypto/internal/scompress.h @@ -12,8 +12,6 @@ #include #include -#define SCOMP_SCRATCH_SIZE 131072 - struct acomp_req; struct crypto_scomp {