From patchwork Tue Mar 4 09:25:03 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000241 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 4F65AC021B8 for ; Tue, 4 Mar 2025 09:25:11 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id D3FB56B0088; Tue, 4 Mar 2025 04:25:10 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id CFA726B008C; Tue, 4 Mar 2025 04:25:10 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id BDC806B008A; Tue, 4 Mar 2025 04:25:10 -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 A16BE6B0082 for ; Tue, 4 Mar 2025 04:25:10 -0500 (EST) Received: from smtpin08.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id 47AEE819F2 for ; Tue, 4 Mar 2025 09:25:10 +0000 (UTC) X-FDA: 83183334780.08.DE0B31B Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf03.hostedemail.com (Postfix) with ESMTP id 21FFB2000E for ; Tue, 4 Mar 2025 09:25:07 +0000 (UTC) Authentication-Results: imf03.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b="euheJy/j"; spf=pass (imf03.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=1741080308; 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=OoqpE0SkD7kTh5lf/A0RjqC+kdgsA27dsiXVeZ3yVdI=; b=OV00SLI9BKZT9ufXLi1W01A+GwSUZlMHmZECQitceNd8+RUOuf7Kn/naNdX0Q/ChzhT3Iu xEcudR3n2ruABXCdtVnpPwBYqF5RYPCHKh3v3nzMUG+78CXom/Cfb5yZNOmpsoDSu6SuD8 2rNbAKZ0Jf8Zofpbfzi9lsWnTZinBqI= ARC-Authentication-Results: i=1; imf03.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b="euheJy/j"; spf=pass (imf03.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=1741080308; a=rsa-sha256; cv=none; b=SVuarsvdiV/kctNV30876DBuNU6PFRJqlCHVS4RSAh5aypoNPIM2vJiRcBheEyC6dmyJgF D0KKnv7xR1hgayfAZ5ZPI3x/l3rRuyHnioYL4QJDUNYkfdL6D+3m7DNE9K8BA16qIhC21e vaHSLbpGdSyLCQTViOubuecAGGF59Y8= 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=OoqpE0SkD7kTh5lf/A0RjqC+kdgsA27dsiXVeZ3yVdI=; b=euheJy/jNLG9lofIrRVrWR2dfD MOmfVs0l+IXKFAp7m7G+qgpNhKp49YC2RAIkulAVSS2wgfBHQzuAQD4MLOlRjgmj080gKt00YtOd0 5NkzK5yO4v+w3EdvZkhtF4Owl2+NuRnt0zg3ykmBy8URLAQRLDA+Pz66oQEJfRcp4i3X+kGF8cfzB 2yKhs5Sd79/uC801DZNJrwZJUDpAvXUfll0j31S7Qpt7+1aDXlmPT4USsit3+QnsuTuHYIScCUguK fFntRiIey0qjd5PAyvyB4iQuSzFBD/c7NqBuhVNK7hIqWWdAXwbIlVvPkrDqU8p71Tz8gpDBJBzQb EZ/YPNmA==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWN-003a2K-2e; Tue, 04 Mar 2025 17:25:04 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:03 +0800 Date: Tue, 04 Mar 2025 17:25:03 +0800 Message-Id: <3c3c20451382a4e17f2179d436f5841fa1cc3a28.1741080140.git.herbert@gondor.apana.org.au> In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 1/7] crypto: api - Add cra_type->destroy hook 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: 21FFB2000E X-Stat-Signature: 3fjfmgthne9prhmnux8ggyb3xpjq63z3 X-HE-Tag: 1741080307-237421 X-HE-Meta: U2FsdGVkX1+dyWOwwl/GRMe+zlNWeCnM9uwfM9ArWt79qLfD7RXY1AhnXw+hLcKm7xs4l4mIrt+76+PhtCiOwWW1fwoYceDK8zqk1XpW31aLxfK9X0GqCrGX6ZGcMa5ZHj9ypwE5QJmVi7YbBZnIV2ZbqxKiOSWVEqHQ3glNi5wTOE8VOI91nJdEKoBZIxth2335AvRYL+hSpLfyAmq1+b3wUTSdBymCkxD58ksAUVUS6Ose/QXaiZ17pnYmmEG/mn/sj/LwmZOw1g1eeWOTdKcgEsuvctCwbFQlbDRmj+KGfgBYqv4dhavUxm1ahQG67Kv6zuKIY6eykOmaEywEGFD0LdH+lJCkKn2hV1qvrDD2xNhKd/AIUAjgpo+XFBRHAEYJXsU4IyWddxcVQBQ88r+JoG1Bl7b9UrXBsQK04qGZYeqCEQXlrFv9wU8SR8/iOJ44OJtEUhERKtC86j9wBosJ7yNccRTnDkdM7kA5TFM5SDp/CqoBz8MJKva5eIDoBLvQS25zAGzXpBZJFRtZd9Z2DPf3d3/GG+KDlMaSIpeCzRNqSGEEDEhtrlaPqHDZbQboSZcVNBS/eWs1vl1iCEkTtCquLjOHTJwE4beoCHcXttJakZHc07whWCHHv9YTOa0wMQ5n4eUmcLekPp8JXTVsNmaLyJ2ZG6LAp1zeDnx/6ht6AdnjUTlrQDXtE3uAm/rCzU6mYdkvrXJLe2c5QDM3IYir72tSwW1UQw+5ujkwZDcWr0jjkLFMTgHQ/ts85yvqBriPcAKWyxJZVd6KDcUvfZvFp7OKxn465S8AYoanBiEjcQLvHk9CxrXOhZGIlO7TWNvgArBulsNnM8C/f30Rc6Ms/aWwLqJP359x8oafFZ0yTlqBUETfWDD/cZB0zXzbYZdtXeBhYWcTUG6yQi4gjybLB0+JHNTD28Q8+FDhEa384WcnEHtibGfIWCUeNSCzEpTcZUo8uV9aNuL EsAoUh7L hIRMz058H1EjvrY9g0B2QIowktMIQsDLHhmYbNECM7NGvNTGkpjss+VsFfKn2lPetlPXHeExOn1Y4KBGUpoeLkLBEHL+4L+6KjtRYU7seHtBPfg8RqJ8ehR+w6bpzRA3pNq8CbyeqduR2Qn5AGqta8bgqNK8/UzFrpjLNMWOgJh+OWjGRbQt/1YApud+SevOUYbRcJjxJa6wOy4/vP+LtzrPeRPW/qEU+dbS7EMDKNVSmp9XQ28/O3GaFsJKPRbDthuaNZS3gCs/W3yU= 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: Add a cra_type->destroy hook so that resources can be freed after the last user of a registered algorithm is gone. Signed-off-by: Herbert Xu --- crypto/algapi.c | 9 +++++++++ crypto/internal.h | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/crypto/algapi.c b/crypto/algapi.c index e7a9a2ada2cf..8f72dd15cf9c 100644 --- a/crypto/algapi.c +++ b/crypto/algapi.c @@ -89,6 +89,15 @@ static void crypto_destroy_instance(struct crypto_alg *alg) schedule_work(&inst->free_work); } +void crypto_destroy_alg(struct crypto_alg *alg) +{ + if (alg->cra_type && alg->cra_type->destroy) + alg->cra_type->destroy(alg); + + if (alg->cra_destroy) + alg->cra_destroy(alg); +} + /* * This function adds a spawn to the list secondary_spawns which * will be used at the end of crypto_remove_spawns to unregister diff --git a/crypto/internal.h b/crypto/internal.h index 08d43b40e7db..11567ea24fc3 100644 --- a/crypto/internal.h +++ b/crypto/internal.h @@ -40,6 +40,7 @@ struct crypto_type { void (*show)(struct seq_file *m, struct crypto_alg *alg); int (*report)(struct sk_buff *skb, struct crypto_alg *alg); void (*free)(struct crypto_instance *inst); + void (*destroy)(struct crypto_alg *alg); unsigned int type; unsigned int maskclear; @@ -127,6 +128,7 @@ void *crypto_create_tfm_node(struct crypto_alg *alg, const struct crypto_type *frontend, int node); void *crypto_clone_tfm(const struct crypto_type *frontend, struct crypto_tfm *otfm); +void crypto_destroy_alg(struct crypto_alg *alg); static inline void *crypto_create_tfm(struct crypto_alg *alg, const struct crypto_type *frontend) @@ -163,8 +165,8 @@ static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg) static inline void crypto_alg_put(struct crypto_alg *alg) { - if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy) - alg->cra_destroy(alg); + if (refcount_dec_and_test(&alg->cra_refcnt)) + crypto_destroy_alg(alg); } static inline int crypto_tmpl_get(struct crypto_template *tmpl) From patchwork Tue Mar 4 09:25:06 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000243 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 1B959C282D0 for ; Tue, 4 Mar 2025 09:25:15 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 1FC60280002; Tue, 4 Mar 2025 04:25:14 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 17E29280001; Tue, 4 Mar 2025 04:25:14 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id F38A3280002; Tue, 4 Mar 2025 04:25:13 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id D5A88280001 for ; Tue, 4 Mar 2025 04:25:13 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 926191A19E8 for ; Tue, 4 Mar 2025 09:25:13 +0000 (UTC) X-FDA: 83183334906.15.CD485FE Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf25.hostedemail.com (Postfix) with ESMTP id 70332A0014 for ; Tue, 4 Mar 2025 09:25:10 +0000 (UTC) Authentication-Results: imf25.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=hBMzOb3y; spf=pass (imf25.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=1741080312; 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=byKSmpFZ+BAJKsKdkjOGzGyv3O1PUfZflpCvm7z8pKY=; b=hRIC9RGRv7Uap6v4Oi6nwYlFD0ucX46H+NKYi+1GQeTcVRT6xhNmrSj/p7AEy0hFejjZE0 hFMIF0cxZidyD0tI8v/bE6nY8Y4VB1tZZL0pGqXGSExc1Hm5EBxu2+3dWPQh7mG0BVxqBr g4I+grRXwvG3zHoVnHsGntqL6zlwVQU= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741080312; a=rsa-sha256; cv=none; b=J0tqhMVBfeQthbAwDmi1eaeqXfOhMtmwfrqkCxn0dzCYvhSjlPOaPUWDcDxCpNxckOQFEz A8zVCWPSmV4chG0xJHdDXkbFxWVJjhGJeX/UIYbt99EKsl/0R4EXLE7HRw7OQxzJcN0yyC uz3OVWGbOJJqrjDgTEXOtKSGREnH398= ARC-Authentication-Results: i=1; imf25.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=hBMzOb3y; spf=pass (imf25.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 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=byKSmpFZ+BAJKsKdkjOGzGyv3O1PUfZflpCvm7z8pKY=; b=hBMzOb3yHsbMiRC+hwbLmYMdOk SPLaxeTu5rabFKGX8uDzGpaUAkobwoVW/FNXTC7PEAYkdKUxco8yJcmzKEIHzYfHIeYhUJJsxyMU2 1OglS7+cuLzT0jQ4gxMod1Bqvpr3OaXuybDZ2+lw/+hxmYovkdeTf6mnmFYBlmt88F2OuVJxWHyD3 5J2ZN4pQLUTvqcq5YXVJ1nSw0ZIedXXrVbM+E4BkfHgs5CqG80H2i5fbOAG5twVL+xwO2l0IEKokn 5WNBR2BECvP/8d1t7yGfiYMSyMY+DItrCMjQP1dzILLzf2TNDEqzF8ebo61VRrwtycE7fs40pH1sH r9ZXD2Rg==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWQ-003a2V-0P; Tue, 04 Mar 2025 17:25:07 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:06 +0800 Date: Tue, 04 Mar 2025 17:25:06 +0800 Message-Id: In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 2/7] crypto: scomp - Remove tfm argument from alloc/free_ctx To: Linux Crypto Mailing List Cc: linux-mm@kvack.org, Yosry Ahmed , Kanchana P Sridhar X-Stat-Signature: 1se9smhrnw4t7azt814ak61dsb3kharz X-Rspamd-Queue-Id: 70332A0014 X-Rspam-User: X-Rspamd-Server: rspam01 X-HE-Tag: 1741080310-414642 X-HE-Meta: U2FsdGVkX1+cn8UrLK4raix44xPFNmKoQQGzO3zeBzjuUR6D75iMM6HlNp0dArXuYtD60/ljo2mr402+2R1dqIxZBFTUhT2K/GIrPoSmVaZBg/oYMF98xSGuyh6DkWTgrDW88xJnpk20KcL3YwCOqIFaqB29MHQlwHvIQcReBGa5VNzpnf5JXgbOEs9bbgQEbcEiKt39+E7bwfoBBF+73hWKiXiQmbIXJSDr/mnIP1OA59zm2IV2H3OkmgbBNA7K/tGahO3P5mlZ0wxArzOimxaICMOZtebh9cjMVwxxN9tVNctiNDMoqfV3nMWQOHPTdsNEGbYBrL2QrTugWenkC7e2olH5HXJ/0Ri9y7Ovz7WFa5fhydH+aO2z1bA9mC4q2R2t/KF+kiaJyYXdXJqwlbtP+j1ioY2mXGhqOwNSh/W7xMN+vf+6z5k6H0oAjThR6hmfRhRvcsZ4hP5k491p/q7Q3hqKYI/uSDed8c8NI8PGurIUKUZRWULeaK0Q2jR4jLIOwt3gklzEvaIshARk64zL1OHij8XjCYNtq5LEzO9XXM/LOcW8Gd6t9dbvlswYuNQWxc2Z+UG/oP9M1VosGpPhre0csxjgji93k6izQ2Ek6FExcBMLimpWFs2zoKRfzuMKzYJNCJ7jUSjrRTETY91xA1pxrB4m9GyEpbuRJm1zw53QTMtwnrFTco02OZbPQ9HCJqDUa1+xzAcOFA1RlEaiyyvWOqtIH2/LXsWZVIc+DWf20jjFU4f2Zr3ZwS+UcJAC2Ep1dO1khYvQIIJ1PP/VidOgBFl8ADCZhEOOs4VnPhg69UsIR1S33Uho3+fLyzY7MUKKB2tKP2IUWID+Dfxh9NR6u1U0DvFWy2b11qmEb5KpKKIZ6Dz3W9/xsTYj3s0FwZQwN2YDzvQarfnpt0xl33xcM+k2F7pteam8qiaTx8i+QmpinuX9eghSbw+WMSucmXgqv3h1On1Xzdc LDLCyuOb fxo4EH2ldxL1ZCrrveivCWzmxNRm8vUT1E0J6Z2jSsAZMOoLXEbrZ99EagN9kuH+agxhny1PHpPmnMOPjP1Xf62YF2hJotYTLC0DTiwl0E9/iDveBFNt1Kbr8A31tOopy484HE9nDAyoirYLrAV19YHCrrXnUSiO5E5neg3ALjl0Tsykv0xxgMOfHBUKhZ/dgDMiAuOP1iuLQDKARkLiscQCiyeKB7HJ2ezEdfLPfjObwK0rJeDWwP9miKDwtMuZGnW4K6s4kerdVLUw= 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: The tfm argument is completely unused and meaningless as the same stream object is identical over all transforms of a given algorithm. Remove it. Signed-off-by: Herbert Xu --- crypto/842.c | 8 ++++---- crypto/deflate.c | 4 ++-- crypto/lz4.c | 8 ++++---- crypto/lz4hc.c | 8 ++++---- crypto/lzo-rle.c | 8 ++++---- crypto/lzo.c | 8 ++++---- crypto/zstd.c | 4 ++-- drivers/crypto/cavium/zip/zip_crypto.c | 6 +++--- drivers/crypto/cavium/zip/zip_crypto.h | 6 +++--- include/crypto/internal/scompress.h | 8 ++++---- 10 files changed, 34 insertions(+), 34 deletions(-) diff --git a/crypto/842.c b/crypto/842.c index e59e54d76960..2238478c3493 100644 --- a/crypto/842.c +++ b/crypto/842.c @@ -28,7 +28,7 @@ struct crypto842_ctx { void *wmem; /* working memory for compress */ }; -static void *crypto842_alloc_ctx(struct crypto_scomp *tfm) +static void *crypto842_alloc_ctx(void) { void *ctx; @@ -43,14 +43,14 @@ static int crypto842_init(struct crypto_tfm *tfm) { struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm); - ctx->wmem = crypto842_alloc_ctx(NULL); + ctx->wmem = crypto842_alloc_ctx(); if (IS_ERR(ctx->wmem)) return -ENOMEM; return 0; } -static void crypto842_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void crypto842_free_ctx(void *ctx) { kfree(ctx); } @@ -59,7 +59,7 @@ static void crypto842_exit(struct crypto_tfm *tfm) { struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm); - crypto842_free_ctx(NULL, ctx->wmem); + crypto842_free_ctx(ctx->wmem); } static int crypto842_compress(struct crypto_tfm *tfm, diff --git a/crypto/deflate.c b/crypto/deflate.c index 98e8bcb81a6a..1bf7184ad670 100644 --- a/crypto/deflate.c +++ b/crypto/deflate.c @@ -112,7 +112,7 @@ static int __deflate_init(void *ctx) return ret; } -static void *deflate_alloc_ctx(struct crypto_scomp *tfm) +static void *deflate_alloc_ctx(void) { struct deflate_ctx *ctx; int ret; @@ -143,7 +143,7 @@ static void __deflate_exit(void *ctx) deflate_decomp_exit(ctx); } -static void deflate_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void deflate_free_ctx(void *ctx) { __deflate_exit(ctx); kfree_sensitive(ctx); diff --git a/crypto/lz4.c b/crypto/lz4.c index 0606f8862e78..e66c6d1ba34f 100644 --- a/crypto/lz4.c +++ b/crypto/lz4.c @@ -16,7 +16,7 @@ struct lz4_ctx { void *lz4_comp_mem; }; -static void *lz4_alloc_ctx(struct crypto_scomp *tfm) +static void *lz4_alloc_ctx(void) { void *ctx; @@ -31,14 +31,14 @@ static int lz4_init(struct crypto_tfm *tfm) { struct lz4_ctx *ctx = crypto_tfm_ctx(tfm); - ctx->lz4_comp_mem = lz4_alloc_ctx(NULL); + ctx->lz4_comp_mem = lz4_alloc_ctx(); if (IS_ERR(ctx->lz4_comp_mem)) return -ENOMEM; return 0; } -static void lz4_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void lz4_free_ctx(void *ctx) { vfree(ctx); } @@ -47,7 +47,7 @@ static void lz4_exit(struct crypto_tfm *tfm) { struct lz4_ctx *ctx = crypto_tfm_ctx(tfm); - lz4_free_ctx(NULL, ctx->lz4_comp_mem); + lz4_free_ctx(ctx->lz4_comp_mem); } static int __lz4_compress_crypto(const u8 *src, unsigned int slen, diff --git a/crypto/lz4hc.c b/crypto/lz4hc.c index d7cc94aa2fcf..25a95b65aca5 100644 --- a/crypto/lz4hc.c +++ b/crypto/lz4hc.c @@ -15,7 +15,7 @@ struct lz4hc_ctx { void *lz4hc_comp_mem; }; -static void *lz4hc_alloc_ctx(struct crypto_scomp *tfm) +static void *lz4hc_alloc_ctx(void) { void *ctx; @@ -30,14 +30,14 @@ static int lz4hc_init(struct crypto_tfm *tfm) { struct lz4hc_ctx *ctx = crypto_tfm_ctx(tfm); - ctx->lz4hc_comp_mem = lz4hc_alloc_ctx(NULL); + ctx->lz4hc_comp_mem = lz4hc_alloc_ctx(); if (IS_ERR(ctx->lz4hc_comp_mem)) return -ENOMEM; return 0; } -static void lz4hc_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void lz4hc_free_ctx(void *ctx) { vfree(ctx); } @@ -46,7 +46,7 @@ static void lz4hc_exit(struct crypto_tfm *tfm) { struct lz4hc_ctx *ctx = crypto_tfm_ctx(tfm); - lz4hc_free_ctx(NULL, ctx->lz4hc_comp_mem); + lz4hc_free_ctx(ctx->lz4hc_comp_mem); } static int __lz4hc_compress_crypto(const u8 *src, unsigned int slen, diff --git a/crypto/lzo-rle.c b/crypto/lzo-rle.c index 0631d975bfac..261ef327637a 100644 --- a/crypto/lzo-rle.c +++ b/crypto/lzo-rle.c @@ -15,7 +15,7 @@ struct lzorle_ctx { void *lzorle_comp_mem; }; -static void *lzorle_alloc_ctx(struct crypto_scomp *tfm) +static void *lzorle_alloc_ctx(void) { void *ctx; @@ -30,14 +30,14 @@ static int lzorle_init(struct crypto_tfm *tfm) { struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm); - ctx->lzorle_comp_mem = lzorle_alloc_ctx(NULL); + ctx->lzorle_comp_mem = lzorle_alloc_ctx(); if (IS_ERR(ctx->lzorle_comp_mem)) return -ENOMEM; return 0; } -static void lzorle_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void lzorle_free_ctx(void *ctx) { kvfree(ctx); } @@ -46,7 +46,7 @@ static void lzorle_exit(struct crypto_tfm *tfm) { struct lzorle_ctx *ctx = crypto_tfm_ctx(tfm); - lzorle_free_ctx(NULL, ctx->lzorle_comp_mem); + lzorle_free_ctx(ctx->lzorle_comp_mem); } static int __lzorle_compress(const u8 *src, unsigned int slen, diff --git a/crypto/lzo.c b/crypto/lzo.c index ebda132dd22b..ae40e80a4094 100644 --- a/crypto/lzo.c +++ b/crypto/lzo.c @@ -15,7 +15,7 @@ struct lzo_ctx { void *lzo_comp_mem; }; -static void *lzo_alloc_ctx(struct crypto_scomp *tfm) +static void *lzo_alloc_ctx(void) { void *ctx; @@ -30,14 +30,14 @@ static int lzo_init(struct crypto_tfm *tfm) { struct lzo_ctx *ctx = crypto_tfm_ctx(tfm); - ctx->lzo_comp_mem = lzo_alloc_ctx(NULL); + ctx->lzo_comp_mem = lzo_alloc_ctx(); if (IS_ERR(ctx->lzo_comp_mem)) return -ENOMEM; return 0; } -static void lzo_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void lzo_free_ctx(void *ctx) { kvfree(ctx); } @@ -46,7 +46,7 @@ static void lzo_exit(struct crypto_tfm *tfm) { struct lzo_ctx *ctx = crypto_tfm_ctx(tfm); - lzo_free_ctx(NULL, ctx->lzo_comp_mem); + lzo_free_ctx(ctx->lzo_comp_mem); } static int __lzo_compress(const u8 *src, unsigned int slen, diff --git a/crypto/zstd.c b/crypto/zstd.c index 154a969c83a8..68a093427944 100644 --- a/crypto/zstd.c +++ b/crypto/zstd.c @@ -103,7 +103,7 @@ static int __zstd_init(void *ctx) return ret; } -static void *zstd_alloc_ctx(struct crypto_scomp *tfm) +static void *zstd_alloc_ctx(void) { int ret; struct zstd_ctx *ctx; @@ -134,7 +134,7 @@ static void __zstd_exit(void *ctx) zstd_decomp_exit(ctx); } -static void zstd_free_ctx(struct crypto_scomp *tfm, void *ctx) +static void zstd_free_ctx(void *ctx) { __zstd_exit(ctx); kfree_sensitive(ctx); diff --git a/drivers/crypto/cavium/zip/zip_crypto.c b/drivers/crypto/cavium/zip/zip_crypto.c index 1046a746d36f..a9c3efce8f2d 100644 --- a/drivers/crypto/cavium/zip/zip_crypto.c +++ b/drivers/crypto/cavium/zip/zip_crypto.c @@ -236,7 +236,7 @@ int zip_comp_decompress(struct crypto_tfm *tfm, } /* Legacy compress framework end */ /* SCOMP framework start */ -void *zip_alloc_scomp_ctx_deflate(struct crypto_scomp *tfm) +void *zip_alloc_scomp_ctx_deflate(void) { int ret; struct zip_kernel_ctx *zip_ctx; @@ -255,7 +255,7 @@ void *zip_alloc_scomp_ctx_deflate(struct crypto_scomp *tfm) return zip_ctx; } -void *zip_alloc_scomp_ctx_lzs(struct crypto_scomp *tfm) +void *zip_alloc_scomp_ctx_lzs(void) { int ret; struct zip_kernel_ctx *zip_ctx; @@ -274,7 +274,7 @@ void *zip_alloc_scomp_ctx_lzs(struct crypto_scomp *tfm) return zip_ctx; } -void zip_free_scomp_ctx(struct crypto_scomp *tfm, void *ctx) +void zip_free_scomp_ctx(void *ctx) { struct zip_kernel_ctx *zip_ctx = ctx; diff --git a/drivers/crypto/cavium/zip/zip_crypto.h b/drivers/crypto/cavium/zip/zip_crypto.h index b59ddfcacd34..dbe20bfeb3e9 100644 --- a/drivers/crypto/cavium/zip/zip_crypto.h +++ b/drivers/crypto/cavium/zip/zip_crypto.h @@ -67,9 +67,9 @@ int zip_comp_decompress(struct crypto_tfm *tfm, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen); -void *zip_alloc_scomp_ctx_deflate(struct crypto_scomp *tfm); -void *zip_alloc_scomp_ctx_lzs(struct crypto_scomp *tfm); -void zip_free_scomp_ctx(struct crypto_scomp *tfm, void *zip_ctx); +void *zip_alloc_scomp_ctx_deflate(void); +void *zip_alloc_scomp_ctx_lzs(void); +void zip_free_scomp_ctx(void *zip_ctx); int zip_scomp_compress(struct crypto_scomp *tfm, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen, void *ctx); diff --git a/include/crypto/internal/scompress.h b/include/crypto/internal/scompress.h index 07a10fd2d321..6ba9974df7d3 100644 --- a/include/crypto/internal/scompress.h +++ b/include/crypto/internal/scompress.h @@ -31,8 +31,8 @@ struct crypto_scomp { * @calg: Cmonn algorithm data structure shared with acomp */ struct scomp_alg { - void *(*alloc_ctx)(struct crypto_scomp *tfm); - void (*free_ctx)(struct crypto_scomp *tfm, void *ctx); + void *(*alloc_ctx)(void); + void (*free_ctx)(void *ctx); int (*compress)(struct crypto_scomp *tfm, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen, void *ctx); @@ -73,13 +73,13 @@ static inline struct scomp_alg *crypto_scomp_alg(struct crypto_scomp *tfm) static inline void *crypto_scomp_alloc_ctx(struct crypto_scomp *tfm) { - return crypto_scomp_alg(tfm)->alloc_ctx(tfm); + return crypto_scomp_alg(tfm)->alloc_ctx(); } static inline void crypto_scomp_free_ctx(struct crypto_scomp *tfm, void *ctx) { - return crypto_scomp_alg(tfm)->free_ctx(tfm, ctx); + return crypto_scomp_alg(tfm)->free_ctx(ctx); } static inline int crypto_scomp_compress(struct crypto_scomp *tfm, From patchwork Tue Mar 4 09:25:08 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000244 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 4F8D8C282D3 for ; Tue, 4 Mar 2025 09:25:17 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 8D146280003; Tue, 4 Mar 2025 04:25:15 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 8833C280001; Tue, 4 Mar 2025 04:25:15 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 6FD6B280003; Tue, 4 Mar 2025 04:25:15 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 4C2E7280001 for ; Tue, 4 Mar 2025 04:25:15 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay08.hostedemail.com (Postfix) with ESMTP id BD15D141916 for ; Tue, 4 Mar 2025 09:25:14 +0000 (UTC) X-FDA: 83183334948.15.2E1C116 Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf17.hostedemail.com (Postfix) with ESMTP id 913A04000A for ; Tue, 4 Mar 2025 09:25:12 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=MwGq+l4e; spf=pass (imf17.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=1741080313; 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=5bLm0Q94gEJgQpTepUh8jBt4BX7iBQgckVIz1+HDSw8=; b=q3dYHtDMBo/w07szjDmgpzGrqa7bgLnzKa6dwQtGzISzmxpNcHuFrWC8a6OdJvnAJaHsqm LHAP3rLkzvlvOcF9DsmmjlCyuVTfILzGUaSX+uwLLU3DQkpIxvfFNENAfv+pUgi6NQPUFO 0ANaCGhe7rnE9db1RjF1MTbVSoiKHP8= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=MwGq+l4e; spf=pass (imf17.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=1741080313; a=rsa-sha256; cv=none; b=UuMHwN7vdjmC/5WVXIDCklViE4m9qvWtaTReOdtJl/+u39JutiBrhZmCyeZDcrDkD4zf66 501GgAkhDMPlAZtwdUNIKvmFusl6GyPRIDZJpQUK8PDzcDmZ666Wrk7msqrP0Hsg3Upif4 aiPW3xx6r4gOore50ZbwfrIGHOGtovY= 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=5bLm0Q94gEJgQpTepUh8jBt4BX7iBQgckVIz1+HDSw8=; b=MwGq+l4eG+ISeWYAOsEzYpHyok 3sOmziVy2t5BSJtFnEzCKvihMTO8gWeJCyDe/d/dVBE9pduhpjPLsXu+9IacagUcuKXG/NohG34l5 5ooJh/6wWQnpQQL64QTHARJCqwkrFE07Zbu/3rQ3uHU0wOstSS1t0cMF86kj6NtOF0plTpBNuCNt3 SSn4ZngqUHIN8Mn+I2emD4Ts52388W/MOVaQ6urHtexYTKYXtncfx50pqqOL/LoME+pH5nIutcCKm 0XwyDtP2zANcO9ckHfBgmVEwcES69d0gdcg70XJQc4ek7vykSSlnDdl1HwmJPEA5NNiXm1IK/V24L 3hnK1b3w==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWS-003a2g-1V; Tue, 04 Mar 2025 17:25:09 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:08 +0800 Date: Tue, 04 Mar 2025 17:25:08 +0800 Message-Id: In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 3/7] crypto: acomp - Add request chaining and virtual addresses To: Linux Crypto Mailing List Cc: linux-mm@kvack.org, Yosry Ahmed , Kanchana P Sridhar X-Stat-Signature: 66jmgtbz1o68eowq4aioho3wojz1nn6k X-Rspamd-Server: rspam11 X-Rspamd-Queue-Id: 913A04000A X-Rspam-User: X-HE-Tag: 1741080312-520685 X-HE-Meta: U2FsdGVkX195E0iUJdr4EOOYWJ0661ZiSx4STInU6AtbRnG+aKts4aRxXkjdgv0j0NQs7kXELiz6EXvtKdHi5SUoEjIMfguVs3EW5jjBJbN78klZcLMp3xdrm8cDNWW1duBOJAPBL3hRoG87GPnU87FzByiHYScz1TvzxJ6cw3Stn2OGoeBGLxxxYozCqWlVJXyM0lCXTl2DAXK1N6QMmwLho6UUCPOtkzLeaaJwBLX1uRuhgcmB/U+gkq2GXVCbtN0wY6sR9d7M/aF/zpd8uh1qHhG9uDMDNz/yIRNCj/PKDzNLG3ZxbllrLF1wNOE4o/BQiHJ+Yyjx5ZcevvHpBQAezIS2xrr33CbVbsGEALzEUFg7IqckK17hdRa5ALs7+Q2C64+TsT73wtinoU6SfzH7Y2uCuNvYX5+jRvZMoj7JBJ/FO3OYycWrmK2lqES4mfM52j6Py8u9b/d+EoMlRlGcI0TZLLxbnenOvZ2qiClmO85Br5sKZToA4c8C31KLc9kjX6iWM51wEt8Uh+yNx+EiccKEYNYEw73HZoAxwkZWbl6JlKEwkUHDMJLiIusHCfr1QyyAYAhS1yVVo6++lDeyRnhepAzpWMsLAsayNxII9lG2d39l4pB2m9xvvepJwmG+nRV7DM3DEjvoFd4zO6zferZD1kNh8t+LaXO3JnmxuHdj4/OEmjdaw+ybC3B3CbUjyerAAAhpcbgXqbdpFfqsON/yyUwty3o9UppVm8KIvVha2sAg1sZr0ZMEx3OrnNHn3ikTHlDKrR0TdShYMHQoqB1fQS7p89dspPtWV+Om8gpU5h6CkS8+2OWb1t5zkjqwfCa2ReJNLNYNuNjmCjnqVq2URZYodb+lRzCXa0NNwjsn1EMBs6/awQQHQpA1XfxK/wK17ttF7VU2ScZ/DUihtry47aWLiZy4VI38gfEeipKL65J67Lp7+pnkNwq0Xx4ZumUzdKdrMeD/Ns4 31RNuf0+ jysdD4qt+gxxkstYTNOZi6P2zsgE1KdXSaLjZa2YQeVry3fMaNkIgQUfQvioiP6itfBgq/sgU1jQ4y9bzbce3gl6cKUyhvawEIs9bwCpRvLnf785XQk1jyvMm/H5VpNJAZ5cTw12c1uwcxBDk2fqRAFJQu5mcxhER/LpcWQezdgtE8suip74xOv1JduXW42MNLvZavZwePUVPwSNaYNlj/rsCtw== 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: This adds request chaining and virtual address support to the acomp interface. It is identical to the ahash interface, except that a new flag CRYPTO_ACOMP_REQ_NONDMA has been added to indicate that the virtual addresses are not suitable for DMA. This is because all existing and potential acomp users can provide memory that is suitable for DMA so there is no need for a fall-back copy path. Signed-off-by: Herbert Xu --- crypto/acompress.c | 201 ++++++++++++++++++++++++++++ include/crypto/acompress.h | 89 ++++++++++-- include/crypto/internal/acompress.h | 22 +++ 3 files changed, 299 insertions(+), 13 deletions(-) diff --git a/crypto/acompress.c b/crypto/acompress.c index 30176316140a..d2103d4e42cc 100644 --- a/crypto/acompress.c +++ b/crypto/acompress.c @@ -23,6 +23,8 @@ struct crypto_scomp; static const struct crypto_type crypto_acomp_type; +static void acomp_reqchain_done(void *data, int err); + static inline struct acomp_alg *__crypto_acomp_alg(struct crypto_alg *alg) { return container_of(alg, struct acomp_alg, calg.base); @@ -153,6 +155,205 @@ void acomp_request_free(struct acomp_req *req) } EXPORT_SYMBOL_GPL(acomp_request_free); +static bool acomp_request_has_nondma(struct acomp_req *req) +{ + struct acomp_req *r2; + + if (acomp_request_isnondma(req)) + return true; + + list_for_each_entry(r2, &req->base.list, base.list) + if (acomp_request_isnondma(r2)) + return true; + + return false; +} + +static void acomp_save_req(struct acomp_req *req, crypto_completion_t cplt) +{ + struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); + struct acomp_req_chain *state = &req->chain; + + if (!acomp_is_async(tfm)) + return; + + state->compl = req->base.complete; + state->data = req->base.data; + req->base.complete = cplt; + req->base.data = state; + state->req0 = req; +} + +static void acomp_restore_req(struct acomp_req_chain *state) +{ + struct acomp_req *req = state->req0; + struct crypto_acomp *tfm; + + tfm = crypto_acomp_reqtfm(req); + if (!acomp_is_async(tfm)) + return; + + req->base.complete = state->compl; + req->base.data = state->data; +} + +static void acomp_reqchain_virt(struct acomp_req_chain *state, int err) +{ + struct acomp_req *req = state->cur; + unsigned int slen = req->slen; + unsigned int dlen = req->dlen; + + req->base.err = err; + if (!state->src) + return; + + acomp_request_set_virt(req, state->src, state->dst, slen, dlen); + state->src = NULL; +} + +static int acomp_reqchain_finish(struct acomp_req_chain *state, + int err, u32 mask) +{ + struct acomp_req *req0 = state->req0; + struct acomp_req *req = state->cur; + struct acomp_req *n; + + acomp_reqchain_virt(state, err); + + if (req != req0) + list_add_tail(&req->base.list, &req0->base.list); + + list_for_each_entry_safe(req, n, &state->head, base.list) { + list_del_init(&req->base.list); + + req->base.flags &= mask; + req->base.complete = acomp_reqchain_done; + req->base.data = state; + state->cur = req; + + if (acomp_request_isvirt(req)) { + unsigned int slen = req->slen; + unsigned int dlen = req->dlen; + const u8 *svirt = req->svirt; + u8 *dvirt = req->dvirt; + + state->src = svirt; + state->dst = dvirt; + + sg_init_one(&state->ssg, svirt, slen); + sg_init_one(&state->dsg, dvirt, dlen); + + acomp_request_set_params(req, &state->ssg, &state->dsg, + slen, dlen); + } + + err = state->op(req); + + if (err == -EINPROGRESS) { + if (!list_empty(&state->head)) + err = -EBUSY; + goto out; + } + + if (err == -EBUSY) + goto out; + + acomp_reqchain_virt(state, err); + list_add_tail(&req->base.list, &req0->base.list); + } + + acomp_restore_req(state); + +out: + return err; +} + +static void acomp_reqchain_done(void *data, int err) +{ + struct acomp_req_chain *state = data; + crypto_completion_t compl = state->compl; + + data = state->data; + + if (err == -EINPROGRESS) { + if (!list_empty(&state->head)) + return; + goto notify; + } + + err = acomp_reqchain_finish(state, err, CRYPTO_TFM_REQ_MAY_BACKLOG); + if (err == -EBUSY) + return; + +notify: + compl(data, err); +} + +static int acomp_do_req_chain(struct acomp_req *req, + int (*op)(struct acomp_req *req)) +{ + struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); + struct acomp_req_chain *state = &req->chain; + int err; + + if (crypto_acomp_req_chain(tfm) || + (!acomp_request_chained(req) && !acomp_request_isvirt(req))) + return op(req); + + /* + * There are no in-kernel users that do this. If and ever + * such users come into being then we could add a fall-back + * path. + */ + if (acomp_request_has_nondma(req)) + return -EINVAL; + + if (acomp_is_async(tfm)) { + acomp_save_req(req, acomp_reqchain_done); + state = req->base.data; + } + + state->op = op; + state->cur = req; + state->src = NULL; + INIT_LIST_HEAD(&state->head); + list_splice_init(&req->base.list, &state->head); + + if (acomp_request_isvirt(req)) { + unsigned int slen = req->slen; + unsigned int dlen = req->dlen; + const u8 *svirt = req->svirt; + u8 *dvirt = req->dvirt; + + state->src = svirt; + state->dst = dvirt; + + sg_init_one(&state->ssg, svirt, slen); + sg_init_one(&state->dsg, dvirt, dlen); + + acomp_request_set_params(req, &state->ssg, &state->dsg, + slen, dlen); + } + + err = op(req); + if (err == -EBUSY || err == -EINPROGRESS) + return -EBUSY; + + return acomp_reqchain_finish(state, err, ~0); +} + +int crypto_acomp_compress(struct acomp_req *req) +{ + return acomp_do_req_chain(req, crypto_acomp_reqtfm(req)->compress); +} +EXPORT_SYMBOL_GPL(crypto_acomp_compress); + +int crypto_acomp_decompress(struct acomp_req *req) +{ + return acomp_do_req_chain(req, crypto_acomp_reqtfm(req)->decompress); +} +EXPORT_SYMBOL_GPL(crypto_acomp_decompress); + void comp_prepare_alg(struct comp_alg_common *alg) { struct crypto_alg *base = &alg->base; diff --git a/include/crypto/acompress.h b/include/crypto/acompress.h index b6d5136e689d..15bb13e47f8b 100644 --- a/include/crypto/acompress.h +++ b/include/crypto/acompress.h @@ -12,10 +12,34 @@ #include #include #include +#include +#include #define CRYPTO_ACOMP_ALLOC_OUTPUT 0x00000001 + +/* Set this bit for virtual address instead of SG list. */ +#define CRYPTO_ACOMP_REQ_VIRT 0x00000002 + +/* Set this bit for if virtual address buffer cannot be used for DMA. */ +#define CRYPTO_ACOMP_REQ_NONDMA 0x00000004 + #define CRYPTO_ACOMP_DST_MAX 131072 +struct acomp_req; + +struct acomp_req_chain { + struct list_head head; + struct acomp_req *req0; + struct acomp_req *cur; + int (*op)(struct acomp_req *req); + crypto_completion_t compl; + void *data; + struct scatterlist ssg; + struct scatterlist dsg; + const u8 *src; + u8 *dst; +}; + /** * struct acomp_req - asynchronous (de)compression request * @@ -24,14 +48,24 @@ * @dst: Destination data * @slen: Size of the input buffer * @dlen: Size of the output buffer and number of bytes produced + * @chain: Private API code data, do not use * @__ctx: Start of private context data */ struct acomp_req { struct crypto_async_request base; - struct scatterlist *src; - struct scatterlist *dst; + union { + struct scatterlist *src; + const u8 *svirt; + }; + union { + struct scatterlist *dst; + u8 *dvirt; + }; unsigned int slen; unsigned int dlen; + + struct acomp_req_chain chain; + void *__ctx[] CRYPTO_MINALIGN_ATTR; }; @@ -200,10 +234,14 @@ 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; + req->base.complete = cmpl; req->base.data = data; - req->base.flags &= CRYPTO_ACOMP_ALLOC_OUTPUT; - req->base.flags |= flgs & ~CRYPTO_ACOMP_ALLOC_OUTPUT; + req->base.flags &= keep; + req->base.flags |= flgs & ~keep; + + crypto_reqchain_init(&req->base); } /** @@ -230,11 +268,42 @@ static inline void acomp_request_set_params(struct acomp_req *req, req->slen = slen; req->dlen = dlen; - req->base.flags &= ~CRYPTO_ACOMP_ALLOC_OUTPUT; + req->base.flags &= ~(CRYPTO_ACOMP_ALLOC_OUTPUT | CRYPTO_ACOMP_REQ_VIRT); if (!req->dst) req->base.flags |= CRYPTO_ACOMP_ALLOC_OUTPUT; } +/** + * acomp_request_set_virt() -- Sets virtual address request parameters + * + * Sets virtual address parameters required by an acomp operation + * + * @req: asynchronous compress request + * @src: virtual address pointer to input buffer + * @dst: virtual address pointer to output buffer. + * @slen: size of the input buffer + * @dlen: size of the output buffer. + */ +static inline void acomp_request_set_virt(struct acomp_req *req, + const u8 *src, u8 *dst, + unsigned int slen, + unsigned int dlen) +{ + req->svirt = src; + req->dvirt = dst; + req->slen = slen; + req->dlen = dlen; + + req->base.flags &= ~CRYPTO_ACOMP_ALLOC_OUTPUT; + req->base.flags |= CRYPTO_ACOMP_REQ_VIRT; +} + +static inline void acomp_request_chain(struct acomp_req *req, + struct acomp_req *head) +{ + crypto_request_chain(&req->base, &head->base); +} + /** * crypto_acomp_compress() -- Invoke asynchronous compress operation * @@ -244,10 +313,7 @@ static inline void acomp_request_set_params(struct acomp_req *req, * * Return: zero on success; error code in case of error */ -static inline int crypto_acomp_compress(struct acomp_req *req) -{ - return crypto_acomp_reqtfm(req)->compress(req); -} +int crypto_acomp_compress(struct acomp_req *req); /** * crypto_acomp_decompress() -- Invoke asynchronous decompress operation @@ -258,9 +324,6 @@ static inline int crypto_acomp_compress(struct acomp_req *req) * * Return: zero on success; error code in case of error */ -static inline int crypto_acomp_decompress(struct acomp_req *req) -{ - return crypto_acomp_reqtfm(req)->decompress(req); -} +int crypto_acomp_decompress(struct acomp_req *req); #endif diff --git a/include/crypto/internal/acompress.h b/include/crypto/internal/acompress.h index 8831edaafc05..b3b48dea7f2f 100644 --- a/include/crypto/internal/acompress.h +++ b/include/crypto/internal/acompress.h @@ -109,4 +109,26 @@ void crypto_unregister_acomp(struct acomp_alg *alg); int crypto_register_acomps(struct acomp_alg *algs, int count); void crypto_unregister_acomps(struct acomp_alg *algs, int count); +static inline bool acomp_request_chained(struct acomp_req *req) +{ + return crypto_request_chained(&req->base); +} + +static inline bool acomp_request_isvirt(struct acomp_req *req) +{ + return req->base.flags & CRYPTO_ACOMP_REQ_VIRT; +} + +static inline bool acomp_request_isnondma(struct acomp_req *req) +{ + return (req->base.flags & + (CRYPTO_ACOMP_REQ_NONDMA | CRYPTO_ACOMP_REQ_VIRT)) == + (CRYPTO_ACOMP_REQ_NONDMA | CRYPTO_ACOMP_REQ_VIRT); +} + +static inline bool crypto_acomp_req_chain(struct crypto_acomp *tfm) +{ + return crypto_tfm_req_chain(&tfm->base); +} + #endif From patchwork Tue Mar 4 09:25:10 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000245 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 EEC44C021B8 for ; Tue, 4 Mar 2025 09:25:19 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2B7D3280004; Tue, 4 Mar 2025 04:25:17 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 267CE280001; Tue, 4 Mar 2025 04:25:17 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 12F34280004; Tue, 4 Mar 2025 04:25:17 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id EB246280001 for ; Tue, 4 Mar 2025 04:25:16 -0500 (EST) Received: from smtpin23.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id 9BE19C196B for ; Tue, 4 Mar 2025 09:25:16 +0000 (UTC) X-FDA: 83183335032.23.992CBF3 Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf26.hostedemail.com (Postfix) with ESMTP id CB7BB140003 for ; Tue, 4 Mar 2025 09:25:14 +0000 (UTC) Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=Q9EVmGfr; spf=pass (imf26.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=1741080315; 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=eTZx4aOK1a37IAWLFenpLkzeTZn5evzAew323HFadZI=; b=mSUhtayG3wpJipDqKq1uOnWLrUZdrSd9dJl85cUl92qnmlahM7/NYuU/Il2yHISq0h9Vuf 8U4+UY+HZwG16Jt7+F9ASZcahwWIGQhFS9F0xqED1KIMI5+uNQERf+F0r0O5sINC4FIzuk 8U/tQO5WXV+VxfXPONN5HVy2vqsZBkU= ARC-Authentication-Results: i=1; imf26.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=Q9EVmGfr; spf=pass (imf26.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=1741080315; a=rsa-sha256; cv=none; b=5IqHt+qPNBc6ygr41TWvR5hAS6evqB+lUBqG43vHMVoGPrz4gUtB+LIX90F6PxtBBHvX8c JL3YvtIZ3zpyHYu4gUDj5kK0z/6arYja2mlUWxgCtQgXvewe6JOE2IN0lC4vhXbni69ZS+ I9HW2YuLoQ4pwVZ3NkDha8QXVToCNgA= 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=eTZx4aOK1a37IAWLFenpLkzeTZn5evzAew323HFadZI=; b=Q9EVmGfr4Kc06EYJbAV4sLHcdy FoN7OeMZgMecze9AfevntfnAKXf2wPZA5f3E/xSvivSSIo5xhgK0oOZmg9ikYWVq5yNmB22pSX5HF rZimQWMGwu9A7fRzsOOIo7vZujH+SbjrmAnFo6baukNb2tlFT+o6MAjbRmbEgopG137ryGIBWlwPw fdI0WpFzRlKRrGYYt2m/tJ3GyniMZSgIe6+ei6d/HVl+S9Y7fU4dsaLuMdteGW2oC3AT2y8XnJATr /o38LAr0LRziVybQBhEFIE4bMtyGPvdylsOYLVKeA1GM4d/phI1M3s8XkvBsKf+M6MzHk3tA5AtAh qu2h4bkg==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWU-003a2v-2P; Tue, 04 Mar 2025 17:25:11 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:10 +0800 Date: Tue, 04 Mar 2025 17:25:10 +0800 Message-Id: In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 4/7] crypto: testmgr - Remove NULL dst acomp tests 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: CB7BB140003 X-Stat-Signature: ny71j3bfozzajsdhzdewiyrn9bwfm9mj X-HE-Tag: 1741080314-375541 X-HE-Meta: U2FsdGVkX1/E0G0J47m/nXp/h57r7yOAc/2pg7PcG/mYwimjNU5rYXG9bcjyKGnKkeWItcGnvaD+vAdcx44RgX8X3CmhbaUpceSVeHkbY5i3j3kqP+7Wd2nvJVdgrr/M0KorBVK/WAmevO6+IB7cZBHE1UMA3DUV7HclrEFeoQIAAJZCf6+EFowuRqvMbDVp5CZc2hG3spv+W+FYVDRC0s1pncPNK2yKyJnPoN8U1rBTrPwoZIBM83f5K/wuL4NvzzWmzuxGP+XxOIi2VAZNj1Z8LDaJee4q8lMWyk6+IcLFKvKV5vXOk7SwPsmf1xYJYM5xgpdg8m6RxQUp2K1JkZT1srPW3W5vQqVg8BuH/RSMmuC0vazYwl/ERIOBFT68mbrAP4d3lF/CLWKpVj3ZNrWW2cF76G6TvEbGS9YLdS9lsEno7kwzBcoctI6nMuwsqj8Zh7KxFy5C9yYHCI0OoH0y9dSePpkstVEfPAHmV+BKH4wlbVUpvkLRRx8lDSVzkyKG0bKZEc8WNdAWhiXl/TDjdN79Tm2TMic8NYRspD6M8/2lYwNfP3cwaunhirLX8T90TEEZ9RUXtJVXc9vo4rUac/DR4a7qe0sqp8R+mBzlXHZgofKCeQqldp1YhK3mQCML5SEG7fVlUqg8DNrS/uXNnDIT8kRLtMak4ZLocDEH82HbtbZT+5MMLHNkLyqLNDBrV1r1KNZRFppyGcX90c8x4YtFLqjlfI8RV2TAw/KNikNN9Oces4arUFvMPrKz8BeikY1/X1cGmvsdd48d6kpiXMj4S+R+iKHYdiJ/KTjqHOn7//EYt8UERalybYB13aMqdYX8JFY45vCj7sCiDoEA10j+H3wxoB/3oSvqZirTvFAKn8vMeimYgfX2M2QPnnWSrh+auhr6dgu7hHq+EoSq853ECsFbpzMjmVonlD0HJta51fbBt+wVTFfPb+TW5IEJSdbUBkC113o4mJN 1LgRLZSh ohPYXsrOMfo8dwISlqPB6zzb6vGbtUqorh+NiXI0Uwnp7WVg61PPicT1sBl2VRV8V/eXIkrMvOV3qSfesUkneOs72Gx0UIkxiD/PVLzXdtkDLpniunl845j6td5wm+JFwhnvilGxXk0prfKfncbVckB5GsZ5R9bhAH4SlpuFrkxcr2fh/1RfldJ2Vo/4QoJ9mhz1n/LzgdDaDAu2XMAAU1pHsMQ== 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: In preparation for the partial removal of NULL dst acomp support, remove the tests for them. Signed-off-by: Herbert Xu --- crypto/testmgr.c | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/crypto/testmgr.c b/crypto/testmgr.c index b69877db3f33..95b973a391cc 100644 --- a/crypto/testmgr.c +++ b/crypto/testmgr.c @@ -3522,21 +3522,6 @@ static int test_acomp(struct crypto_acomp *tfm, goto out; } -#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS - crypto_init_wait(&wait); - sg_init_one(&src, input_vec, ilen); - acomp_request_set_params(req, &src, NULL, ilen, 0); - - ret = crypto_wait_req(crypto_acomp_compress(req), &wait); - if (ret) { - pr_err("alg: acomp: compression failed on NULL dst buffer test %d for %s: ret=%d\n", - i + 1, algo, -ret); - kfree(input_vec); - acomp_request_free(req); - goto out; - } -#endif - kfree(input_vec); acomp_request_free(req); } @@ -3598,20 +3583,6 @@ static int test_acomp(struct crypto_acomp *tfm, goto out; } -#ifdef CONFIG_CRYPTO_MANAGER_EXTRA_TESTS - crypto_init_wait(&wait); - acomp_request_set_params(req, &src, NULL, ilen, 0); - - ret = crypto_wait_req(crypto_acomp_decompress(req), &wait); - if (ret) { - pr_err("alg: acomp: decompression failed on NULL dst buffer test %d for %s: ret=%d\n", - i + 1, algo, -ret); - kfree(input_vec); - acomp_request_free(req); - goto out; - } -#endif - kfree(input_vec); acomp_request_free(req); } 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 { From patchwork Tue Mar 4 09:25:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000247 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 1C900C282D3 for ; Tue, 4 Mar 2025 09:25:25 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id B42D6280006; Tue, 4 Mar 2025 04:25:21 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id AF3C9280001; Tue, 4 Mar 2025 04:25:21 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 9943A280006; Tue, 4 Mar 2025 04:25:21 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 772B1280001 for ; Tue, 4 Mar 2025 04:25:21 -0500 (EST) Received: from smtpin14.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay07.hostedemail.com (Postfix) with ESMTP id 333F0161A3D for ; Tue, 4 Mar 2025 09:25:21 +0000 (UTC) X-FDA: 83183335242.14.09D6004 Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf28.hostedemail.com (Postfix) with ESMTP id 727E6C000D for ; Tue, 4 Mar 2025 09:25:18 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=SHf5JXLH; dmarc=pass (policy=quarantine) header.from=apana.org.au; spf=pass (imf28.hostedemail.com: domain of herbert@gondor.apana.org.au designates 144.6.53.87 as permitted sender) smtp.mailfrom=herbert@gondor.apana.org.au ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741080319; 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=gIqcHUXrW/VV9CB31vd0AlriCi6IJXCee7ucb3EsjSo=; b=iKg0ejTC2b3zWM7LPtYLVNkPt1RMtMeKnnQTaCvrvIESfehbt2sxk35tK0dGhK8eZGPkhU eUoJc3KlGj5aKYWIzxfFpO3Tt7qnC80ZKUcbHVWTTNnOE4d5EUGx2DWIHZRbBHz+mJ4gkL yjNSBEbXw3yWxK2WFTKqnIx+ARsFlz8= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=SHf5JXLH; dmarc=pass (policy=quarantine) header.from=apana.org.au; spf=pass (imf28.hostedemail.com: domain of herbert@gondor.apana.org.au designates 144.6.53.87 as permitted sender) smtp.mailfrom=herbert@gondor.apana.org.au ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741080319; a=rsa-sha256; cv=none; b=bzWphQkh63fTLScaNN9GEYpW9r37qznRRNowaU2JI7kzIfq1BbYVmu3G18V8JMV2gcrM3R FZo3nu3U6Ej2aJ4udU3H5nHe5Y05RlaVeMkybormtbK8Qfv/2CaXW3FDZ8IICw5eY2Mvde e15lU+tDdSM6ugjuUPKkepVNQg9Lo4g= 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=gIqcHUXrW/VV9CB31vd0AlriCi6IJXCee7ucb3EsjSo=; b=SHf5JXLHQMZKrDgv1yUviFGqGV +tUxoSsnOQNrj+h3TcgQ6jwXn3ZDN4qo0MAMCDRPQUintBhiqHM0QkqMB5VW7gszVOJqh/KBOqEPT VwqRZUA88TE9QKQON7+UosLPS8nnuHgbTfVi67vd/CKbI0jfo2CbzLS7NUeLk8FEwVVxExkd8rAM0 1Hr+4YK6pUfHqawcilKRyS1mLgRRvm//py+avvWaZipzGv474xPgy+Fx5j+/K0VsX9NUWfnrjgoUE skQ7GGAff6TlYpoz/+uvkJ1F0H1gePDQcP8OOeEt9cYBRYer2MALM4VfJCsU//okVBEv8p/S6iQAJ OlpQchcg==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWZ-003a3P-14; Tue, 04 Mar 2025 17:25:16 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:15 +0800 Date: Tue, 04 Mar 2025 17:25:15 +0800 Message-Id: <7fb4bea494ba06ec8c8f7bb3af5af2b478615edd.1741080140.git.herbert@gondor.apana.org.au> In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 6/7] crypto: scomp - Add chaining and virtual address support To: Linux Crypto Mailing List Cc: linux-mm@kvack.org, Yosry Ahmed , Kanchana P Sridhar X-Rspamd-Server: rspam04 X-Rspamd-Queue-Id: 727E6C000D X-Rspam-User: X-Stat-Signature: dauss7n6gdi7pwaijzjcogw5n55b5qja X-HE-Tag: 1741080318-827669 X-HE-Meta: U2FsdGVkX18Hh3rv7fgL2FsA61g99qbHt6ahvHBm/fCW3uPP56qt1u1XVuOOTfmvpb6VTsqzVp4hPorz7pzGPCgOTajxdxKyyUxEnXA8+zfyR33jgQ/leZkB9gipnfmGchFmu936eT7SV4w4xaCJCyFwu+EnLgVp4atJcbvyQTrUZCCJoscLCbDDIaqKiqt9ql5ZEl0a9/ad6netXfltmnA9q82ReQEdJtbMs4DS8zYBRKV13morESiXTD2YblQHSmNTiHdZZnZCh14dWhbmoTIPSXzOXWYdtb6aRWjZDS5lsE22+QqDdxl7CoX8mxLw/5d49iYpW/6bEHbsE2JSEppORW8pI1aOwEiPYwO6Gd19ty4WQnXNmOOGPQIugn58kiG5WZ2IA6uanbRb0augvZo9PhiWhMmF4zS9io628oYElrcvOUjPDAH3tSx1m69JMCxjThdwxsbsOBPS/vyxBdUp1+I6U37DSgpK9pH14UtW0tTTWtnAHXwlneCzCiTTSq78Hl/8aHCIFDi79jUE72hwJYRsMUF+Zb7g7eKZMnS+9i1+bMEQbv6l1t39BsS1Qzu6axe2jdARe8egq3ANJLQnnwa++NWhcjRE3UtrMvzxLyopmPCju50g8m629EZzmf8eDA8saf3gVMx+JDBZrg/jVL/ACeuZ261ChVswtAKLsUXN3zbaMa+kMBcQerup2EnOZgdta2HCDynIaFZFxsZ5TT/MDdcC1buR4D++BCQaPXzUIZuVwp0YD1IDuU/gXvDlY+zv/Q0r+nRbuhYcV+/XfPvvh9Z/Y4EQrFSWzg0xm6FCOilzec6y2GIKRcmWsC+rhgCOAgLxbq5Fol9p2tV+S6OlJHB+PbEZZvs54kU6NOsjS/XqLIN2xtqOOBPfJFWZcAM70Ggvcnq/MzhZdzEIxCxDRETNND8c3mUDlK/gqqtODsQM81hbXF8ghY0Cqe3gweDdA0iygOMh3KA tbgAkFrX dnQAziIcyKp5aYObixYNqiIW6KQzjD+d5ybOpeTaROiAQyaGPp3tLABTyUVLkXQ0vbkXNbEjXxWrSd/dvKDzMsEIHQcOpYQRqgrl0Lo2EfpP2csJUmw+8/DPf+WsE4R8OWdeUuUdqSP+c76MLNMI9CnOHIhUS52DlQirBZ8Vm/2n6Ym9PQFUJdgnx4eS15hZrLTNjEDRMkmgqMFw1hS/1Ojw5mw== 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: Add chaining and virtual address support to all scomp algorithms. Signed-off-by: Herbert Xu --- crypto/scompress.c | 82 +++++++++++++++++++++++++++++++--------------- 1 file changed, 56 insertions(+), 26 deletions(-) diff --git a/crypto/scompress.c b/crypto/scompress.c index d78f307343ac..8ef2d71ad908 100644 --- a/crypto/scompress.c +++ b/crypto/scompress.c @@ -116,7 +116,8 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) struct scomp_scratch *scratch; unsigned int slen = req->slen; unsigned int dlen = req->dlen; - void *src, *dst; + const u8 *src; + u8 *dst; int ret; if (!req->src || !slen) @@ -125,28 +126,32 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) if (req->dst && !dlen) return -EINVAL; - if (sg_nents(req->dst) > 1) - return -ENOSYS; - - 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); + + if (acomp_request_isvirt(req)) { + src = req->svirt; + dst = req->dvirt; + } else if (sg_nents(req->dst) > 1) + return -ENOSYS; + else if (req->dst->offset >= PAGE_SIZE) + return -ENOSYS; + else { + if (req->dst->offset + dlen > PAGE_SIZE) + dlen = PAGE_SIZE - req->dst->offset; + + src = scratch->src; + 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; + + dst = kmap_local_page(sg_page(req->dst)) + req->dst->offset; + } + spin_lock(&scratch->lock); if (src == scratch->src) - memcpy_from_sglist(src, req->src, 0, req->slen); + memcpy_from_sglist(scratch->src, req->src, 0, req->slen); if (dir) ret = crypto_scomp_compress(scomp, src, slen, @@ -157,22 +162,38 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) spin_unlock(&scratch->lock); - if (src != scratch->src) - kunmap_local(src); - kunmap_local(dst); - flush_dcache_page(sg_page(req->dst)); + if (!acomp_request_isvirt(req)) { + if (src != scratch->src) + kunmap_local(src); + kunmap_local(dst); + flush_dcache_page(sg_page(req->dst)); + } return ret; } +static int scomp_acomp_chain(struct acomp_req *req, int dir) +{ + struct acomp_req *r2; + int err; + + err = scomp_acomp_comp_decomp(req, dir); + req->base.err = err; + + list_for_each_entry(r2, &req->base.list, base.list) + r2->base.err = scomp_acomp_comp_decomp(r2, dir); + + return err; +} + static int scomp_acomp_compress(struct acomp_req *req) { - return scomp_acomp_comp_decomp(req, 1); + return scomp_acomp_chain(req, 1); } static int scomp_acomp_decompress(struct acomp_req *req) { - return scomp_acomp_comp_decomp(req, 0); + return scomp_acomp_chain(req, 0); } static void crypto_exit_scomp_ops_async(struct crypto_tfm *tfm) @@ -259,12 +280,21 @@ static const struct crypto_type crypto_scomp_type = { .tfmsize = offsetof(struct crypto_scomp, base), }; -int crypto_register_scomp(struct scomp_alg *alg) +static void scomp_prepare_alg(struct scomp_alg *alg) { struct crypto_alg *base = &alg->calg.base; comp_prepare_alg(&alg->calg); + base->cra_flags |= CRYPTO_ALG_REQ_CHAIN; +} + +int crypto_register_scomp(struct scomp_alg *alg) +{ + struct crypto_alg *base = &alg->calg.base; + + scomp_prepare_alg(alg); + base->cra_type = &crypto_scomp_type; base->cra_flags |= CRYPTO_ALG_TYPE_SCOMPRESS; From patchwork Tue Mar 4 09:25:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Herbert Xu X-Patchwork-Id: 14000248 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 B68B0C282D0 for ; Tue, 4 Mar 2025 09:25:27 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 68914280007; Tue, 4 Mar 2025 04:25:24 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 638A8280001; Tue, 4 Mar 2025 04:25:24 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4B247280007; Tue, 4 Mar 2025 04:25:24 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0016.hostedemail.com [216.40.44.16]) by kanga.kvack.org (Postfix) with ESMTP id 2CDB6280001 for ; Tue, 4 Mar 2025 04:25:24 -0500 (EST) Received: from smtpin15.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id D64071CC12C for ; Tue, 4 Mar 2025 09:25:23 +0000 (UTC) X-FDA: 83183335326.15.82BA6B6 Received: from abb.hmeau.com (abb.hmeau.com [144.6.53.87]) by imf07.hostedemail.com (Postfix) with ESMTP id BB0B24000F for ; Tue, 4 Mar 2025 09:25:21 +0000 (UTC) Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=foZ2c8SL; dmarc=pass (policy=quarantine) header.from=apana.org.au; spf=pass (imf07.hostedemail.com: domain of herbert@gondor.apana.org.au designates 144.6.53.87 as permitted sender) smtp.mailfrom=herbert@gondor.apana.org.au ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1741080322; a=rsa-sha256; cv=none; b=rJhAgXs7n959EoTnA2sIumjcfebDCqRG6SpcJKuwXAq17aBVRYvVdXEdq9IhdmiAfex1aI s1/OI+QIykSU8IABq1sqoYMCkvBQIlu8LT2IGP0COZMYKUGpyuODMOlq8Z9tbwrifOQcIm Q958K5rOyB78Sjaut5wLhV3nfq9DEfE= ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=hmeau.com header.s=formenos header.b=foZ2c8SL; dmarc=pass (policy=quarantine) header.from=apana.org.au; spf=pass (imf07.hostedemail.com: domain of herbert@gondor.apana.org.au designates 144.6.53.87 as permitted sender) smtp.mailfrom=herbert@gondor.apana.org.au ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1741080322; 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=/zhKnEevUyP3F8wMr+wshCLsYVBzBeztZgwi0df1+YA=; b=62UiPKB8K42xqV9fqdQeE+loMLAMqUqs68mTQ/uWRwUr6BxG7l2yIK6aqzGdPEHvsaRHwG LRo0PQtboh4/h8+Q875OJ9EGeNRids7HGSPjykgOTyu72PZkQsRquzTVdND0zjiAXHEu0U QpXmRDGfCCJWHgWXykRzeERNIYka1vI= 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=/zhKnEevUyP3F8wMr+wshCLsYVBzBeztZgwi0df1+YA=; b=foZ2c8SL4/qg6rgogBOLoKALSU qk/XnCClLoZBfAbF4GZDuk0KzAkyRIwN6/nUB+rVcVKHSZCP4U6KTlRqyG+TOnECGqjscVS5e5m5e be7b8PNE7M6YCpWYpLzpYePLTgebQeqgU50vKWJMl+NwP34ZWmjuddTgPgk+JflOVx/TpuYTFq/Rw 2dZYgmRK5My4/LG2msfcjVxjwqIdsS8NqRvmumCcZszKwmD+MslP97QdeNrc0tj31cRzaNQHPKohw ylbWy1AWRJp6nlae4tDdEQPhFzGzyOkgUKx175D6KkmY+JK03Zg5rBmYlwjMM4E38Hri7zrnty7JE Pllk5hEA==; Received: from loth.rohan.me.apana.org.au ([192.168.167.2]) by formenos.hmeau.com with smtp (Exim 4.96 #2 (Debian)) id 1tpOWb-003a3f-1u; Tue, 04 Mar 2025 17:25:18 +0800 Received: by loth.rohan.me.apana.org.au (sSMTP sendmail emulation); Tue, 04 Mar 2025 17:25:17 +0800 Date: Tue, 04 Mar 2025 17:25:17 +0800 Message-Id: In-Reply-To: References: From: Herbert Xu Subject: [v2 PATCH 7/7] crypto: acomp - Move stream management into scomp layer To: Linux Crypto Mailing List Cc: linux-mm@kvack.org, Yosry Ahmed , Kanchana P Sridhar X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: BB0B24000F X-Stat-Signature: zojiayyir6xj6jiznp9gz687qtr7qc6u X-Rspam-User: X-HE-Tag: 1741080321-583616 X-HE-Meta: U2FsdGVkX19XGGdIu7NZhSv9SCXEsRdf/DSpWUL9QJ4GQqcEF3kA5FnMacfPfhwVDnsb/5tJG4HXgqJ1pldbHg9Ps+V9+eh8iwtwyaEXDVcsBlCsjWnUK//C9odDj1OJ40LKwP9X5Wtl7iKmXDuRR3HSnoEBsRwlxp9OQbDzewmZm7X7O2PEHo/kYgG30rrH5239NveznTogLPBMy3tgQBp/IOXKqbbVWQdeIblt+rE+IYH87tN4JycAKrGdszZJDM5WZ00T8EoG7+W7KrLkqSx+HdgudiRIX/vFN9RceFmAo5r1lxeTmuPaOLRDjk8IXmbycETKIf+WLvbXThp2QgXrZLb722SBCpusY80w3R+0L/gyVVS9C87XE1sEQbmCZCImnyqbBaw3Yryhe3X+WNI6G21HxC0IsRzBjVAoXivi3cn+gUPqTYqJNCqICKITSAQO7SpM837BOFLOMi0NZrRLcUiRH1edBnrhNSA7wKoXJTXXxhXasybTx+vuPBCeNPG+Q5fBVN6vLvjIY7p1HNpZxSVrhkMvlfg2emWUkfrgfSj6DrJDtr7dy/p6Z/pUcHc6m4QWAuWGjEoANwWJWf8BssbCOHxWrt0hJlMBHTv99BZYoit2pwHbgo1Dt+zORmDeiLwLijtVLmEB9dmUjwj7S7HLPrM1aM1EG6DrVxk4tQOdRCRbalOEUFqUhHf1t2vHt/jBICIhWAh2f0w9MEMY8dOF3BvPT5yezdoIpU0ByDeNnAUpblRBV/6KFOD1ENvNsgja7lw/t1HMvMo6N3AfokcrlkgkxqRWxh4hxJtcsieTuwFIhkjcJYL+tFRxtPD43tGMK38hBbWV+3J38UO4Yt9eDLzxSv1a4yaAFMjz9lCVv8tmWFjkyXCETji2KehypTCnCFbWSVDWUA7Lu86yB03m95EFOLdZcmLcJbSuTR8rLBxFUTtjEBvtMcpHJAO+tecUeh6YZS+3UQE nbvCBYc0 PkWs+yjF0DIAgpxs+WcXVd4kHvTdcR/RvZ+uboG/A0y3vymiwB5+PHYtZdSpQplQMF0eiej6BAihYzmekwxlpaEdY4RYRv54MRl9CIMDqVI4DP/bmmGAyOITselb+z+teILFcHdWJHBl9YwKhOoGXH7giXxb6Cc1ynmMtMrgj7ffHUAYLZ+4MagmdlVWTjMK4yOy5NX8n+cMyEfBPhEdsqM7jlQ== 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: Rather than allocating the stream memory in the request object, move it into a per-cpu buffer managed by scomp. This takes the stress off the user from having to manage large request objects and setting up their own per-cpu buffers in order to do so. Signed-off-by: Herbert Xu --- crypto/acompress.c | 25 -------- crypto/compress.h | 2 - crypto/scompress.c | 90 +++++++++++++++++++---------- include/crypto/acompress.h | 25 +++++++- include/crypto/internal/acompress.h | 17 +----- include/crypto/internal/scompress.h | 12 +--- 6 files changed, 84 insertions(+), 87 deletions(-) diff --git a/crypto/acompress.c b/crypto/acompress.c index 8914d0c4cc75..f8e18f32478e 100644 --- a/crypto/acompress.c +++ b/crypto/acompress.c @@ -124,31 +124,6 @@ struct crypto_acomp *crypto_alloc_acomp_node(const char *alg_name, u32 type, } EXPORT_SYMBOL_GPL(crypto_alloc_acomp_node); -struct acomp_req *acomp_request_alloc(struct crypto_acomp *acomp) -{ - struct crypto_tfm *tfm = crypto_acomp_tfm(acomp); - struct acomp_req *req; - - req = __acomp_request_alloc(acomp); - if (req && (tfm->__crt_alg->cra_type != &crypto_acomp_type)) - return crypto_acomp_scomp_alloc_ctx(req); - - return req; -} -EXPORT_SYMBOL_GPL(acomp_request_alloc); - -void acomp_request_free(struct acomp_req *req) -{ - struct crypto_acomp *acomp = crypto_acomp_reqtfm(req); - struct crypto_tfm *tfm = crypto_acomp_tfm(acomp); - - if (tfm->__crt_alg->cra_type != &crypto_acomp_type) - crypto_acomp_scomp_free_ctx(req); - - __acomp_request_free(req); -} -EXPORT_SYMBOL_GPL(acomp_request_free); - static bool acomp_request_has_nondma(struct acomp_req *req) { struct acomp_req *r2; diff --git a/crypto/compress.h b/crypto/compress.h index c3cedfb5e606..f7737a1fcbbd 100644 --- a/crypto/compress.h +++ b/crypto/compress.h @@ -15,8 +15,6 @@ struct acomp_req; struct comp_alg_common; int crypto_init_scomp_ops_async(struct crypto_tfm *tfm); -struct acomp_req *crypto_acomp_scomp_alloc_ctx(struct acomp_req *req); -void crypto_acomp_scomp_free_ctx(struct acomp_req *req); void comp_prepare_alg(struct comp_alg_common *alg); diff --git a/crypto/scompress.c b/crypto/scompress.c index 8ef2d71ad908..d9cf1696bff5 100644 --- a/crypto/scompress.c +++ b/crypto/scompress.c @@ -95,13 +95,62 @@ static int crypto_scomp_alloc_scratches(void) return -ENOMEM; } +static void scomp_free_streams(struct scomp_alg *alg) +{ + struct crypto_acomp_stream __percpu *stream = alg->stream; + int i; + + for_each_possible_cpu(i) { + struct crypto_acomp_stream *ps = per_cpu_ptr(stream, i); + + if (!ps->ctx) + break; + + alg->free_ctx(ps); + } + + free_percpu(stream); +} + +static int scomp_alloc_streams(struct scomp_alg *alg) +{ + struct crypto_acomp_stream __percpu *stream; + int i; + + stream = alloc_percpu(struct crypto_acomp_stream); + if (!stream) + return -ENOMEM; + + for_each_possible_cpu(i) { + struct crypto_acomp_stream *ps = per_cpu_ptr(stream, i); + + ps->ctx = alg->alloc_ctx(); + if (IS_ERR(ps->ctx)) { + scomp_free_streams(alg); + return PTR_ERR(ps->ctx); + } + + spin_lock_init(&ps->lock); + } + + alg->stream = stream; + return 0; +} + static int crypto_scomp_init_tfm(struct crypto_tfm *tfm) { + struct scomp_alg *alg = crypto_scomp_alg(__crypto_scomp_tfm(tfm)); int ret = 0; mutex_lock(&scomp_lock); + if (!alg->stream) { + ret = scomp_alloc_streams(alg); + if (ret) + goto unlock; + } if (!scomp_scratch_users++) ret = crypto_scomp_alloc_scratches(); +unlock: mutex_unlock(&scomp_lock); return ret; @@ -112,7 +161,7 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) struct crypto_acomp *tfm = crypto_acomp_reqtfm(req); struct crypto_scomp **tfm_ctx = acomp_tfm_ctx(tfm); struct crypto_scomp *scomp = *tfm_ctx; - void **ctx = acomp_request_ctx(req); + struct crypto_acomp_stream *stream; struct scomp_scratch *scratch; unsigned int slen = req->slen; unsigned int dlen = req->dlen; @@ -148,18 +197,22 @@ static int scomp_acomp_comp_decomp(struct acomp_req *req, int dir) dst = kmap_local_page(sg_page(req->dst)) + req->dst->offset; } + stream = raw_cpu_ptr(crypto_scomp_alg(scomp)->stream); + spin_lock(&scratch->lock); + spin_lock(&stream->lock); if (src == scratch->src) memcpy_from_sglist(scratch->src, req->src, 0, req->slen); if (dir) ret = crypto_scomp_compress(scomp, src, slen, - dst, &req->dlen, *ctx); + dst, &req->dlen, stream->ctx); else ret = crypto_scomp_decompress(scomp, src, slen, - dst, &req->dlen, *ctx); + dst, &req->dlen, stream->ctx); + spin_unlock(&stream->lock); spin_unlock(&scratch->lock); if (!acomp_request_isvirt(req)) { @@ -234,40 +287,15 @@ int crypto_init_scomp_ops_async(struct crypto_tfm *tfm) return 0; } -struct acomp_req *crypto_acomp_scomp_alloc_ctx(struct acomp_req *req) +static void crypto_scomp_destroy(struct crypto_alg *alg) { - struct crypto_acomp *acomp = crypto_acomp_reqtfm(req); - struct crypto_tfm *tfm = crypto_acomp_tfm(acomp); - struct crypto_scomp **tfm_ctx = crypto_tfm_ctx(tfm); - struct crypto_scomp *scomp = *tfm_ctx; - void *ctx; - - ctx = crypto_scomp_alloc_ctx(scomp); - if (IS_ERR(ctx)) { - kfree(req); - return NULL; - } - - *req->__ctx = ctx; - - return req; -} - -void crypto_acomp_scomp_free_ctx(struct acomp_req *req) -{ - struct crypto_acomp *acomp = crypto_acomp_reqtfm(req); - struct crypto_tfm *tfm = crypto_acomp_tfm(acomp); - struct crypto_scomp **tfm_ctx = crypto_tfm_ctx(tfm); - struct crypto_scomp *scomp = *tfm_ctx; - void *ctx = *req->__ctx; - - if (ctx) - crypto_scomp_free_ctx(scomp, ctx); + scomp_free_streams(__crypto_scomp_alg(alg)); } static const struct crypto_type crypto_scomp_type = { .extsize = crypto_alg_extsize, .init_tfm = crypto_scomp_init_tfm, + .destroy = crypto_scomp_destroy, #ifdef CONFIG_PROC_FS .show = crypto_scomp_show, #endif diff --git a/include/crypto/acompress.h b/include/crypto/acompress.h index 25e193b0b8b4..5e0602d2c827 100644 --- a/include/crypto/acompress.h +++ b/include/crypto/acompress.h @@ -10,9 +10,12 @@ #define _CRYPTO_ACOMP_H #include +#include #include #include #include +#include +#include #include /* Set this bit for virtual address instead of SG list. */ @@ -83,8 +86,14 @@ struct crypto_acomp { struct crypto_tfm base; }; +struct crypto_acomp_stream { + spinlock_t lock; + void *ctx; +}; + #define COMP_ALG_COMMON { \ struct crypto_alg base; \ + struct crypto_acomp_stream __percpu *stream; \ } struct comp_alg_common COMP_ALG_COMMON; @@ -202,7 +211,16 @@ static inline int crypto_has_acomp(const char *alg_name, u32 type, u32 mask) * * Return: allocated handle in case of success or NULL in case of an error */ -struct acomp_req *acomp_request_alloc(struct crypto_acomp *tfm); +static inline struct acomp_req *acomp_request_alloc_noprof(struct crypto_acomp *tfm) +{ + struct acomp_req *req; + + req = kzalloc_noprof(sizeof(*req) + crypto_acomp_reqsize(tfm), GFP_KERNEL); + if (likely(req)) + acomp_request_set_tfm(req, tfm); + return req; +} +#define acomp_request_alloc(...) alloc_hooks(acomp_request_alloc_noprof(__VA_ARGS__)) /** * acomp_request_free() -- zeroize and free asynchronous (de)compression @@ -211,7 +229,10 @@ struct acomp_req *acomp_request_alloc(struct crypto_acomp *tfm); * * @req: request to free */ -void acomp_request_free(struct acomp_req *req); +static inline void acomp_request_free(struct acomp_req *req) +{ + kfree_sensitive(req); +} /** * acomp_request_set_callback() -- Sets an asynchronous callback diff --git a/include/crypto/internal/acompress.h b/include/crypto/internal/acompress.h index b3b48dea7f2f..2877053286e3 100644 --- a/include/crypto/internal/acompress.h +++ b/include/crypto/internal/acompress.h @@ -32,6 +32,7 @@ * * @reqsize: Context size for (de)compression requests * @base: Common crypto API algorithm data structure + * @stream: Per-cpu memory for algorithm * @calg: Cmonn algorithm data structure shared with scomp */ struct acomp_alg { @@ -68,22 +69,6 @@ static inline void acomp_request_complete(struct acomp_req *req, crypto_request_complete(&req->base, err); } -static inline struct acomp_req *__acomp_request_alloc_noprof(struct crypto_acomp *tfm) -{ - struct acomp_req *req; - - req = kzalloc_noprof(sizeof(*req) + crypto_acomp_reqsize(tfm), GFP_KERNEL); - if (likely(req)) - acomp_request_set_tfm(req, tfm); - return req; -} -#define __acomp_request_alloc(...) alloc_hooks(__acomp_request_alloc_noprof(__VA_ARGS__)) - -static inline void __acomp_request_free(struct acomp_req *req) -{ - kfree_sensitive(req); -} - /** * crypto_register_acomp() -- Register asynchronous compression algorithm * diff --git a/include/crypto/internal/scompress.h b/include/crypto/internal/scompress.h index 2a6b15c0a32d..f25aa2ea3b48 100644 --- a/include/crypto/internal/scompress.h +++ b/include/crypto/internal/scompress.h @@ -26,6 +26,7 @@ struct crypto_scomp { * @compress: Function performs a compress operation * @decompress: Function performs a de-compress operation * @base: Common crypto API algorithm data structure + * @stream: Per-cpu memory for algorithm * @calg: Cmonn algorithm data structure shared with acomp */ struct scomp_alg { @@ -69,17 +70,6 @@ static inline struct scomp_alg *crypto_scomp_alg(struct crypto_scomp *tfm) return __crypto_scomp_alg(crypto_scomp_tfm(tfm)->__crt_alg); } -static inline void *crypto_scomp_alloc_ctx(struct crypto_scomp *tfm) -{ - return crypto_scomp_alg(tfm)->alloc_ctx(); -} - -static inline void crypto_scomp_free_ctx(struct crypto_scomp *tfm, - void *ctx) -{ - return crypto_scomp_alg(tfm)->free_ctx(ctx); -} - static inline int crypto_scomp_compress(struct crypto_scomp *tfm, const u8 *src, unsigned int slen, u8 *dst, unsigned int *dlen, void *ctx)