From patchwork Thu Feb 27 10:15:04 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 13994055 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 7E856C021BE for ; Thu, 27 Feb 2025 10:15:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id DACE1280009; Thu, 27 Feb 2025 05:15:13 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id D3565280008; Thu, 27 Feb 2025 05:15:13 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B604F280009; Thu, 27 Feb 2025 05:15:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 87A64280004 for ; Thu, 27 Feb 2025 05:15:13 -0500 (EST) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 0FF07509E4 for ; Thu, 27 Feb 2025 10:15:13 +0000 (UTC) X-FDA: 83165316906.18.4978C59 Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf01.hostedemail.com (Postfix) with ESMTP id DAC3440036 for ; Thu, 27 Feb 2025 10:15:10 +0000 (UTC) Authentication-Results: imf01.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=c95stfs5; spf=pass (imf01.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=1740651311; 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=eSOj7vOfSpGgQ5Kj0GYCHDDmdqiWsm4T+x7O3x8fxBs=; b=gUNorhjqUhffD1ZGTG1avaUIldyJtzEnXQyGW+h4iGJ4/JmCV6OSewm0V+2LprHYmJjcd7 7AnfRzU0UVGJwXO8zrorJA7QB5R7ynIEm5Sxo+q6sFjXaSRlCBr//++VK5vE9v7ePAzma7 2jIc4XWfhvwTXU3aT3jQH7vV3qzIS9I= ARC-Authentication-Results: i=1; imf01.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=c95stfs5; spf=pass (imf01.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=1740651311; a=rsa-sha256; cv=none; b=IUDWEXbykuNRlrGg+DrXBWqJ2yoj55rYRrcysO8q18D2gLG2sAYtB7Ah/PiGs6LKH4iB4U EAHZpGNehvtz1mg3sdfKRToXBAZJg8hveNK4pAbPMWIYOslGbDSyi9umtuTt/TF6YF0h0M Jmytc3Bceg47jvXnDiWxjMeiY9jQ58M= 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=eSOj7vOfSpGgQ5Kj0GYCHDDmdqiWsm4T+x7O3x8fxBs=; b=c95stfs5HmYKPE0pSQB1u/9+9m eNW8XoG3ZufiFA7486HXkW4q8y/NUBHBIHlLfx7JgpoMia3q17JBW0B8zduZl6+gqJwBSrbjk1JXr gtSlDfbKeWvMGaBR8n7C4AXW/vWGALoo1blWXp3//n25MgO4sO8gFqzdYrCH+Iet1+5hXEUX1jM3V v8yaRWJkBCuQXqAtY6D8w24/K758HJt5Lg14VaVLcQUNFFne2OuUcU3GMw3zd9Eiaem2pYtz1f79Z kpWVvYJv739ZaF/rvfdg98nhdMNB+N9kPZGpqOU5z4TPgFjm95b0m1jEAEkqPhz4+148LySIH+4s3 NYkRMvFw==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tnav2-002DrQ-2q; Thu, 27 Feb 2025 18:15:05 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Thu, 27 Feb 2025 18:15:04 +0800 Date: Thu, 27 Feb 2025 18:15:04 +0800 Message-Id: <30f87ea9a3738c57287f9099a9e638781fa212c5.1740651138.git.herbert@gondor.apana.org.au> In-Reply-To: References: From: Herbert Xu Subject: [PATCH 5/7] crypto: scomp - Remove support for non-trivial SG lists To: Linux Crypto Mailing List Cc: linux-mm@kvack.org, Yosry Ahmed X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: DAC3440036 X-Stat-Signature: h3afuzsfx64juzo5gbqff7crohta33bo X-HE-Tag: 1740651310-828058 X-HE-Meta: U2FsdGVkX18EIktFTAGmhn0Q80FSxVPS//BC+Dkj43y75e8AeZIOwLt/CMtBy85kL6faUVn9m+fsEJnDLAXsms/bwpvz68lErVVTv/2oCIY441m/gCFtU2KmwXoRDZI02uZLNasIfOsFIyztYXR4kn4hkDLdmsplTKVFbUZiwuBZiG1cFFA4+k0v5Ke4pckoL7W2yJwCejMJQgRE1l6wRuorS7LkbEo48+3R5qaSo/lPHXtj9xkiWLHKeK2LKbaq/Td6TpyJdHocBhnEWWT3v43PBUohJ/gI9Hx9rep3mBt97fNFvlyDqhXWEfi1x1n2hEv6ikDL9yBz0iDGEgeNINxE59040qRaVpCud+5EH+BmDdLQErLXTkzVd4JsgdhqaT1DkzyS+TtyzAalDJLk8e0jxalADxO65g19eIUr/kKaRwuTtLEhNyH82jsHuX2bGrplasklQCF1bzOpLv4JyCpa37fie6MBjLqUYrJQt9vuM9HdjlIwFSooccRLplfszncuH2rmn5s7b+vo8W4oY1ww4GEY0q8LacFo4GXmp4j83tJ0kv/Oq/7ZGqqlVVKtmkz6sQrg8mATFC+fx90rEvq7LpMTSr0NHGzjtlz0AiUi2jrGpWzjwC6zVxjN5ZryqaszUgu5e0lhDTL3sYtvetLSWxUpHxzZE/laCHBILu9absDSQ/WFCUlWYThMwDLzShoGaFqhr6FOtKNWXr4h0hH98GSa5DG/JOSjaYzgEk+6gdDOUkprIYTy/iRwkrVY4ahO+/Qi+Vvs2gZ4QO17VddCBdmr/+zL43a5QHJ79D21LGLd/1SryN75kivInFawvusVc5+5lEBXevbdP06Gs+rPDLew7u06XQOLivvwRh/swd35L/q1PnP3jAm565yfCBiqsJW3vJqPJXeoIlYN7N5R6RLYFO0gP4uxwfpDNpQxrdi8+kOk+UIDB/sr6BRbWdEXIEKnUqQBHS5/+fW 4hgyg+W6 pkx6RErkIClgzT+w6CpCSaw0GiWeh8Fl93sCsiGSgk14G/s01mpWyAYp+Pv7MVLmosRGkHCDaI9688EsNT9kfTempVMVub0ZLpT6M/dlHx+KXUhFNnXARZeonkrH52igsvy14vWD6euS510OJb4sElY8uQvzgo9qGKbm6mRf34QwEoRdu0NnsrRfc+mN17ZyzwmXnwsr7WYEm8ikq1KCAua9/wg== 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 scomp uses a trivial single-page SG list, remove support for everything else in preprataion for a shift to virtual addresses. Signed-off-by: Herbert Xu --- crypto/acompress.c | 6 -- crypto/scompress.c | 139 +++++----------------------- include/crypto/acompress.h | 12 +-- include/crypto/internal/scompress.h | 2 - 4 files changed, 27 insertions(+), 132 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..ffc8e7f4862c 100644 --- a/crypto/scompress.c +++ b/crypto/scompress.c @@ -18,24 +18,11 @@ #include #include #include -#include #include #include "compress.h" -struct scomp_scratch { - spinlock_t lock; - void *src; - void *dst; -}; - -static DEFINE_PER_CPU(struct scomp_scratch, scomp_scratch) = { - .lock = __SPIN_LOCK_UNLOCKED(scomp_scratch.lock), -}; - static const struct crypto_type crypto_scomp_type; -static int scomp_scratch_users; -static DEFINE_MUTEX(scomp_lock); static int __maybe_unused crypto_scomp_report( struct sk_buff *skb, struct crypto_alg *alg) @@ -58,127 +45,57 @@ static void crypto_scomp_show(struct seq_file *m, struct crypto_alg *alg) seq_puts(m, "type : scomp\n"); } -static void crypto_scomp_free_scratches(void) -{ - struct scomp_scratch *scratch; - int i; - - for_each_possible_cpu(i) { - scratch = per_cpu_ptr(&scomp_scratch, i); - - vfree(scratch->src); - vfree(scratch->dst); - scratch->src = NULL; - scratch->dst = NULL; - } -} - -static int crypto_scomp_alloc_scratches(void) -{ - struct scomp_scratch *scratch; - int i; - - for_each_possible_cpu(i) { - void *mem; - - scratch = per_cpu_ptr(&scomp_scratch, i); - - mem = vmalloc_node(SCOMP_SCRATCH_SIZE, cpu_to_node(i)); - if (!mem) - goto error; - scratch->src = mem; - mem = vmalloc_node(SCOMP_SCRATCH_SIZE, cpu_to_node(i)); - if (!mem) - goto error; - scratch->dst = mem; - } - return 0; -error: - crypto_scomp_free_scratches(); - return -ENOMEM; -} - static int crypto_scomp_init_tfm(struct crypto_tfm *tfm) { - int ret = 0; - - mutex_lock(&scomp_lock); - if (!scomp_scratch_users++) - ret = crypto_scomp_alloc_scratches(); - mutex_unlock(&scomp_lock); - - return ret; + return 0; } 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 (!req->dst || !dlen) + return -ENOSYS; - dlen = req->dlen; + if (sg_nents(req->src) > 1 || req->src->offset + slen > PAGE_SIZE) + return -ENOSYS; - scratch = raw_cpu_ptr(&scomp_scratch); - spin_lock(&scratch->lock); + if (sg_nents(req->dst) > 1) + return -ENOSYS; - 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->offset >= PAGE_SIZE) + return -ENOSYS; - 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 (req->dst->offset + dlen > PAGE_SIZE) + dlen = PAGE_SIZE - req->dst->offset; + + src = kmap_local_page(sg_page(req->src)) + req->src->offset; + dst = kmap_local_page(sg_page(req->dst)) + req->dst->offset; 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); + kunmap_local(src); + kunmap_local(dst); + flush_dcache_page(sg_page(req->dst)); + return ret; } @@ -197,11 +114,6 @@ static void crypto_exit_scomp_ops_async(struct crypto_tfm *tfm) struct crypto_scomp **ctx = crypto_tfm_ctx(tfm); crypto_free_scomp(*ctx); - - mutex_lock(&scomp_lock); - if (!--scomp_scratch_users) - crypto_scomp_free_scratches(); - mutex_unlock(&scomp_lock); } int crypto_init_scomp_ops_async(struct crypto_tfm *tfm) @@ -225,7 +137,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 07a10fd2d321..25c5f8126618 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 {