From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751210AbdBON4l (ORCPT ); Wed, 15 Feb 2017 08:56:41 -0500 Received: from mail-by2nam03on0059.outbound.protection.outlook.com ([104.47.42.59]:8644 "EHLO NAM03-BY2-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750760AbdBON4i (ORCPT ); Wed, 15 Feb 2017 08:56:38 -0500 Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Prasad.Athreya@cavium.com; Subject: Re: [RFC PATCH v1 1/1] mm: zswap - Add crypto acomp/scomp framework support To: Seth Jennings , Mahipal Challa References: <1487086821-5880-1-git-send-email-Mahipal.Challa@cavium.com> <1487086821-5880-2-git-send-email-Mahipal.Challa@cavium.com> Cc: herbert@gondor.apana.org.au, davem@davemloft.net, linux-crypto@vger.kernel.org, LKML , Linux-MM , pathreya@cavium.com, vnair@cavium.com, Mahipal Challa , Vishnu Nair From: Narayana Prasad Athreya Message-ID: <58A45E4A.8080508@caviumnetworks.com> Date: Wed, 15 Feb 2017 19:27:30 +0530 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.4.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Originating-IP: [14.140.2.178] X-ClientProxiedBy: MWHPR07CA0030.namprd07.prod.outlook.com (10.169.230.16) To BN1PR07MB055.namprd07.prod.outlook.com (10.255.224.151) X-MS-Office365-Filtering-Correlation-Id: 77352a71-3563-4284-8ed3-08d455aa73bd X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:(22001);SRVR:BN1PR07MB055; X-Microsoft-Exchange-Diagnostics: 1;BN1PR07MB055;3:junHXwo5dRfTVKe0+d4BEGmbRxswHtsrrP5BXasXiWsPgquFITaNeK8OBcpR8kpJnqXU2ROYsd7t8QofYQCKF0+BZeFkaTZU8Fq5EAjUF6EXlAFYzGwYmNmm+9cv9HQCKj3vsmKJdKDuBHah8zbzMLm0Xq5fgNspi2BttV9ELgBXZ0ecF4pu9NU6GrjGWlUQ6tafv30cIngrGN5gvNLx8D//kEIpNHwCS40l9dzfAdHkBhV/4LKK/sQCwAxpoWdXkUdKeMvBFcILximr2Fj4sA==;25:spuRaelypGGdYcLbbtabXUfRVbhvarxZ00gT+h9GDDHcOfJ4c7cBcbmUAa67wqvB1iz74gCvPI6zhnHFOJd/BoYUKBvZSWlTZc3JXUGgstwVGXd7UX8stv3N5wZoJVkEmsFEtwRRcsEsYS6bFon8uFM9tKqxGJzFlFvEb52PbnuzX55oIvTN0TjQgkhmIHXID751hbPTfUhm8QU/JQdM1h4Y+krv3WSMLy/HT3mWyStwr7LwrWGaXtLbT4NBJa9fS+W2gr+9GVnsSMANXn/c8oFD1Y3phT+DvccysT+mKuj0PFo/dCXI3IEJRT9XZv0mkV+oRl1AL2UpJnJns/5mPHle5LuJIrA+gllbM4jKkTfcuMyh/HJWRvHu1bd/zPq23kRuzV8YG4i2mgGpVkwNb71VbeFmoJfX1hAhGD6H6gm27MYqZixS+dFooo7jfjRMg/E9egDqvizaEXBOZIlplw== X-Microsoft-Exchange-Diagnostics: 1;BN1PR07MB055;31:vhHwM5XKkczoGI66eQPw9gNuIMXkcio1RbuwksuXomieEUMztNEXRjIcJv0q59L5PikGwOAgjFWlFlf9EwMZHTtpg+oUYlmemZEOUR/rOko53F7X5mPt1O5sQP7dfiibfr4Att3/SUJuTWU0f1q/du8atWMzRAMJtksBCqaa8/Fw3RTlwsSXQkDTfs1OfiIbKMWRmFoPOfcBfaaQjSdrPZqGLCVj7x5Nw6+dFVC6xk4=;20:7W7aVNNOZDw/8Dz+j6T7N5x1zAEHQkJMtgaOcKx0SLjvL3v2wgd4gJNimHT23lKRxcszWqQ63n0OyT6N9HlMK9bTiiQvL1R+fErYcaRGqrZLpEfh5lhLuzkZcr4Qkqp4ZyjXNhZD8R5yoyzxWFfGb3yuxk2zqRYWWHe1fgg653HZwvet+2i7qJd9kMkLm0geHPcNpD0DCcH12SnRbsNoa12mL6GPqSSlKdSSB+/UkL5yoQne/n4IZjg+p76kJWCY2MawOkrTz5mnMmiHvFU2LizWtfxmdSBnhSzATE2kj38jmTzh0D49n5Twi+0YYYvYL7e9lwCsGWzzUa/XvouS9LHhu+6sKNoobfMx4TThZ/7SpA71udN4PIS+rbzJByJoQi/na5j9ll2KrHKBIaqC/G/icykJ73nTC12fOiP1dul9KPrH+EMpWfWiY69KL+Wq3NrZXp8cCqc5YmFSD9AfcdRWaO9tns53U3+0I04PbayC4Qu30dR8KCEFVikjkAijjDpa9Jz3SGAlpzHBxLCo9FCd4ZK8Zxy2mygD+M5nI5aO7HUggDFtY8RREdvpoNxGxSOokz6fUrmAnmsBfOymTNo8Yg8FYumaA5ef2xuWNK8= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0;PCL:0;RULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(3002001)(10201501046)(6041248)(20161123560025)(20161123558025)(20161123555025)(20161123562025)(20161123564025)(6072148);SRVR:BN1PR07MB055;BCL:0;PCL:0;RULEID:;SRVR:BN1PR07MB055; X-Microsoft-Exchange-Diagnostics: 1;BN1PR07MB055;4:Ysm5FOa6fg8ECh3+h6gsWMGD6fYx2YcqBdt5c/AxDvTfKlZr8SDCnTcOh2oKnCVW/je6cjnKLXHeIAx/xLUZwhIXJkMpD2buGL3CSHAWyv5yzSlCpcBHNHiSShAO9wcdYmxnNToMO6ZnbIu8clwYoYjlPlupt4ovJHGjCbTIbW/1K7Uku++RSQ+Xo3/eek+XI26qVLJ38lWWHkNvdQ716LvEG/g+WtRPBi45rbN37Yzc3uDTU7/0g3FwG/Aa46PLcEXYZxxfoMUJgOx3/7+yHpMYUQe2m3qLGxS4gPLincxylJHWefB/RfQky9shhTneEuNVdeAX/YTdujsaFsigO3SmfD+bwJI+IeRy7HAqZazGx+F4A+nVmhsk25mpc0V6y4pGk8UPBQzdsIgDZi3n5VaTjEdTUDsqi4yPnA/8UFDonwz922vFBgn+5LIBqJSlp6rnM1YvfNEpI6/RkZNkNmV+xG6HnHUmVUxYw/6bopFV0QvbLTO7Eqo2e4oNuYjcu5zGxnJSwRV4bCx4YyILbXEsnudVlWG2iO8K5pmfB0WvQCxjavrihW0k0C3um9LE1gdIcxyV46Jacv7dst3leUcV68tlNPmFLbCJFzPeAmg= X-Forefront-PRVS: 021975AE46 X-Forefront-Antispam-Report: SFV:NSPM;SFS:(10009020)(4630300001)(6049001)(6009001)(7916002)(39450400003)(189002)(24454002)(199003)(377454003)(42882006)(101416001)(2950100002)(83506001)(65956001)(68736007)(66066001)(6486002)(59896002)(47776003)(77096006)(23676002)(575784001)(107886003)(8676002)(6246003)(229853002)(81166006)(389900002)(65816999)(81156014)(92566002)(90366009)(42186005)(33656002)(38730400002)(4326007)(5660300001)(2906002)(65806001)(53936002)(6666003)(106356001)(105586002)(50986999)(189998001)(76176999)(25786008)(230700001)(36756003)(87266999)(54356999)(305945005)(4001350100001)(5009440100003)(54906002)(3846002)(64126003)(6116002)(50466002)(7736002)(80316001)(97736004)(7099028)(110426004)(217873001);DIR:OUT;SFP:1101;SCL:1;SRVR:BN1PR07MB055;H:[10.90.207.71];FPR:;SPF:None;PTR:InfoNoRecords;MX:1;A:1;LANG:en; X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtCTjFQUjA3TUIwNTU7MjM6dzlueHQyVzZxbHNtcnNVcGpWT2Z6VmpObGtQ?= =?utf-8?B?WE1FSHhXOUU1RW1ITU9OeS94em1OKzlBZ2dHSEl1dVNWTjQ5a0NPNkhzeTlp?= =?utf-8?B?MFJHbVdrK2lobXVIQ1J3K1AwNWV6THNMNW9FMTNCVnordlBBSXh4emNDQThZ?= =?utf-8?B?d2JnNk9pN05FdTlMNVhvMUkrQVcvaFVYNXQ5VGFtQ25KTFc4TUpPV3JmMnNy?= =?utf-8?B?Ri9PbWVlU0hseXFmTm1jdHc0OU9YZXc3QXhzbERueEZ6VjBnYTQ2SmRJcVhF?= =?utf-8?B?ZTB6bTR5c1lmVDdhR3B3eFlsZW1vVXdqL3d5djZ6UFU4MnlrMXVqU21PM1Yz?= =?utf-8?B?MEg5QmgvV0NycEJZeVNOVXdhdXhMcUNJdHJYMnpIQWEwRy9XT3hDRHQvKzgx?= =?utf-8?B?VU9FMDcvZjRDMUlvZHJ5ZXl4OHlIcE9BWE1YbndIS2tIeG02TGs1Y0hNb2pC?= =?utf-8?B?MU1IU2p1bU14MGZOTTU0WGgzMTl0SlFFZGRsMUtrd2lIVmQ1Y2QwWlJ0bUpZ?= =?utf-8?B?Qk1sdllIYUxWR2JNUjA5d2JPdUtzU1h2cVV1VjRudjZyYTlDbjhPcmE4NEZG?= =?utf-8?B?aGJRVC82aTVOdmh0S2d0T0N6a3VKSXhRTnRDcEVyRkVhQyt0dXlYVnBhV0JC?= =?utf-8?B?OXBJblczdFpFb0NTRHpmMEdVVU5NRUtBTGtiZlEyTVVZUzIzREFIVmwxMENr?= =?utf-8?B?OUdwNWNRazY4T2hNZE12Tjl1alZlOFB6bzRWaWtaTmZkdTd1Y2VVUytYa0FB?= =?utf-8?B?eWZtWXh6VzJ4bElyUHcxdUQ5QTlZVUdDcWtEOXlCZERleGpKeXhTcVJNVkNo?= =?utf-8?B?R1E2Rlh4c3NBQzBta1lGcTl0dXNxQVp6Tzd4NUs5RXFqaDNnQnRsSnhJN29h?= =?utf-8?B?MjYvYTh2VW1KWlZGYXNjcFd6TS9NT2F0QWhDQ081UndMelFZMzZRNWc3T2FX?= =?utf-8?B?SnovOEcvblJkUEFpR2QrSDlxVVNnS2cwTGk2ZnFjbjc2Qnk5b0FLNkdnWG5Z?= =?utf-8?B?YWlMU2tDRGc3YjJjemkyT1NtTWl0Y3k5Vzd3V1F4cURrTVZjaEdNMkZOT2d4?= =?utf-8?B?aGhBTlJ2MURDM2pRQmhTc3NBb3FDMFcrNWc1L2J3eGJQNDgxL3VxK2h1TGcv?= =?utf-8?B?NERZemFjM0JnSC9EUHg3eFVGdHVwdEp3ajhmTXNpTXN4SlVCNlVvdGdBTU1y?= =?utf-8?B?SjJ1ZWIrckhpeDdLaGQzdGFzTjZhMjdtWUNsZUh4VWNmTTVRVlRmLzN5Z2RS?= =?utf-8?B?eDRDaWhmdG5VSTVUNDYxbG9qZDd0aDNlZjc1cm5VSTBsQ2lGMjBraC9PclRm?= =?utf-8?B?dThJUzgwbldvWUhSOUpoSmV4YUg2cXFEU0lZcUFmVTRJTFR2cHN6OU5mdlFm?= =?utf-8?B?bWtzODFycWo3WUFJd1FZZXREVk9uV0NzTVJRalhTR0dqaU9NNkNBZFBtZFQz?= =?utf-8?B?Ymh0UmlzSVg3Nm1FbDBxcVd4VHBMWUJUeGsvd2ZFaE95UzVjMjAxdEZQMkZI?= =?utf-8?B?Y2ZielJjd05UeHkvRzZqR09VcUJMdmxlMVkzUUZhdjN2VlRMZlZtZ3pqZEtt?= =?utf-8?B?ZXR2V1FRZGQyOFhkMXAyNjl1eW9rZzJ5OEkvWXlUcFlmbkRPYlpyUXh0aW4r?= =?utf-8?B?SklNUk1Xa1FkTmVYd2FVOW4ydURkdWFBcjMvN1hWT001WlpleFlnd0lqNnBG?= =?utf-8?B?aVc2RHhrd0FyT25OUERzckZ0V2krZXpFVlBFbDNSeFdhNklqY1Z2RjRBZ0FN?= =?utf-8?B?K1FHcUdrRytnd0NOTmhwQytNak0rVmFaR05JdkFRRDNMdlVsVWJtVVQ4RmNE?= =?utf-8?B?SzR3VEpGT1lSVlNETjljU0N1V0tnYTFpamQrNi9tMkUvcWFUN2c5TzNXQ00w?= =?utf-8?B?cXVGY0lhT3NRQzVHTlZnMkZSeHBwSWt0Vk1UQ20zdUs3ZTFBR2NyaFhTOU9S?= =?utf-8?B?QjRaMHJQajlnVEdqeXdrWDI5Yjd2UkVVY2pWYXZzeTdQYTlDSWsyeUl6V2kv?= =?utf-8?B?UVhWd0VTQ3N4bldNVmtlWGJTNEkvMmxKQ2hOVlhVUkpxTFhmYllteldlQnRi?= =?utf-8?B?TE40SDgyRDFhOGxDNmM3ZzZIb0FaOU1lb05abDk0TFBNYWlUNGZBbGJ1UlVu?= =?utf-8?B?dz09?= X-Microsoft-Exchange-Diagnostics: 1;BN1PR07MB055;6:lXAvqn9X3HLomKmt7uC5PpRN4UszWYUu045VG2qBVSmUzvu9f3QiQKJz1oC0d6O+Ku29s+/RtGP/uU+1iHakNvgfcm41NYR8X8kWmPa+JztbB1bN0w2jZRewutUXhgWV6H4YZcv1FGQ10tAnXBHcUMJXsdw9rLiV4lH2FExnavA0NJQ6zUe/aQFDwrweI68/YaQevYdW9V4kjzxsmx3QfBDQZ5FtRvviqK0ssd5ylqgIVzZ7ISLomyyRCUPxJ2jjn2cDxXiDntALZbOAEUR5TUhOsbqa4n/U24G9UBQ/PBW2TjRWff1cb33R3EDiB9vxoO0ycOvPJSp3+cJz9i1LoFDUSkWYAyjgagyUgIiZ/aujAQ5Xom7fVECXd7RXgPgHQbHxVjpyhQZvkDH/Q7K7KA==;5:Pspvg5ivbIuA8j81sV5jh0BpLZTq0R/1TArNk9vBT9Lc+WOY2k1M0DEXCO3CR7TLKyrw54M1ZQdO+dE5wdEiCyJ50qDQovyPZXHdiK5qWtp8z3cOaV9IF0Up8zYql0ejtfiD3UdDzkiW2nS2TGJq+w==;24:foe5HRGRsfAD/MODJtYCalosTPvI/5SoMsrUDoQ7IJ6Nz482dXRHte9fkIzeVCfejVeIjBXTtaWt+ZzwvOuzYTXwMSGrvBAws+vz+bYGLL0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1;BN1PR07MB055;7:HUSu00YqIIn2Ln3aaHoOY2Clpxf78SX7PavI3eX/FfAytYPQ0i57iSvvoCRQ5kiXbsJLSDS6j86o/3ltPFraTJsr8WtQ+G0w4aL5pv9732jXN+Si8avggRpGdZjSRMRZoyX4Qn2+U5wdAu5zGzx6SZFQDigqMy3YxUiGP1urUgc/FsZCzguddQkcR6QdRJK+v/BMyrDel+xi/uwClvDT7CGtDpuPhWP22fD029g+HSoirJmrPTqs5xxIeI0OEA6izBZRBzmhOHZbLibNfv8u9NMGfDPDILmOfQpybzFIlpMpyqCe0BUH9e9Wcc1eMndt76VGeZOR7o1NvonsC6m/sJe7VGfCw7sltzzx5J48/q0hiVOjv5/N/bMsED9vQSaib+AWQve8xBYHn0YoIhcaTmk9Nxy+aS1hvMOsuBJq28GV3/nbCDv8Tlg5XMtP6JSmLd74VgRkgIiC2QSRhAIfE1YJmTqSjKwJSV6dTQ6BXJt0jWjwOfnEYJ94lF3m27fQx5SQqBqgq2CTIc95vYlGmw== X-OriginatorOrg: caviumnetworks.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 15 Feb 2017 13:56:28.7761 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN1PR07MB055 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org > I assume all of these crypto_acomp_[compress|decompress] calls are > actually synchronous, > not asynchronous as the name suggests. Otherwise, this would blow up > quite spectacularly > since all the resources we use in the call get derefed/unmapped below. > > Could an async algorithm be implement/used that would break this assumption? The callback is set to NULL using acomp_request_set_callback(). This implies synchronous mode of operation. So the underlying implementation must complete the operation synchronously. Prasad On Tuesday 14 February 2017 09:50 PM, Seth Jennings wrote: > On Tue, Feb 14, 2017 at 9:40 AM, Mahipal Challa > wrote: >> This adds the support for kernel's crypto new acomp/scomp framework >> to zswap. >> >> Signed-off-by: Mahipal Challa >> Signed-off-by: Vishnu Nair >> --- >> mm/zswap.c | 129 +++++++++++++++++++++++++++++++++++++++++++++++-------------- >> 1 file changed, 99 insertions(+), 30 deletions(-) >> >> diff --git a/mm/zswap.c b/mm/zswap.c >> index 067a0d6..d08631b 100644 >> --- a/mm/zswap.c >> +++ b/mm/zswap.c >> @@ -33,6 +33,8 @@ >> #include >> #include >> #include >> +#include >> +#include >> #include >> #include >> >> @@ -114,7 +116,8 @@ static int zswap_compressor_param_set(const char *, >> >> struct zswap_pool { >> struct zpool *zpool; >> - struct crypto_comp * __percpu *tfm; >> + struct crypto_acomp * __percpu *acomp; >> + struct acomp_req * __percpu *acomp_req; >> struct kref kref; >> struct list_head list; >> struct work_struct work; >> @@ -379,30 +382,49 @@ static int zswap_dstmem_dead(unsigned int cpu) >> static int zswap_cpu_comp_prepare(unsigned int cpu, struct hlist_node *node) >> { >> struct zswap_pool *pool = hlist_entry(node, struct zswap_pool, node); >> - struct crypto_comp *tfm; >> + struct crypto_acomp *acomp; >> + struct acomp_req *acomp_req; >> >> - if (WARN_ON(*per_cpu_ptr(pool->tfm, cpu))) >> + if (WARN_ON(*per_cpu_ptr(pool->acomp, cpu))) >> return 0; >> + if (WARN_ON(*per_cpu_ptr(pool->acomp_req, cpu))) >> + return 0; >> + >> + acomp = crypto_alloc_acomp(pool->tfm_name, 0, 0); >> + if (IS_ERR_OR_NULL(acomp)) { >> + pr_err("could not alloc crypto acomp %s : %ld\n", >> + pool->tfm_name, PTR_ERR(acomp)); >> + return -ENOMEM; >> + } >> + *per_cpu_ptr(pool->acomp, cpu) = acomp; >> >> - tfm = crypto_alloc_comp(pool->tfm_name, 0, 0); >> - if (IS_ERR_OR_NULL(tfm)) { >> - pr_err("could not alloc crypto comp %s : %ld\n", >> - pool->tfm_name, PTR_ERR(tfm)); >> + acomp_req = acomp_request_alloc(acomp); >> + if (IS_ERR_OR_NULL(acomp_req)) { >> + pr_err("could not alloc crypto acomp %s : %ld\n", >> + pool->tfm_name, PTR_ERR(acomp)); >> return -ENOMEM; >> } >> - *per_cpu_ptr(pool->tfm, cpu) = tfm; >> + *per_cpu_ptr(pool->acomp_req, cpu) = acomp_req; >> + >> return 0; >> } >> >> static int zswap_cpu_comp_dead(unsigned int cpu, struct hlist_node *node) >> { >> struct zswap_pool *pool = hlist_entry(node, struct zswap_pool, node); >> - struct crypto_comp *tfm; >> + struct crypto_acomp *acomp; >> + struct acomp_req *acomp_req; >> + >> + acomp_req = *per_cpu_ptr(pool->acomp_req, cpu); >> + if (!IS_ERR_OR_NULL(acomp_req)) >> + acomp_request_free(acomp_req); >> + *per_cpu_ptr(pool->acomp_req, cpu) = NULL; >> + >> + acomp = *per_cpu_ptr(pool->acomp, cpu); >> + if (!IS_ERR_OR_NULL(acomp)) >> + crypto_free_acomp(acomp); >> + *per_cpu_ptr(pool->acomp, cpu) = NULL; >> >> - tfm = *per_cpu_ptr(pool->tfm, cpu); >> - if (!IS_ERR_OR_NULL(tfm)) >> - crypto_free_comp(tfm); >> - *per_cpu_ptr(pool->tfm, cpu) = NULL; >> return 0; >> } >> >> @@ -503,8 +525,14 @@ static struct zswap_pool *zswap_pool_create(char *type, char *compressor) >> pr_debug("using %s zpool\n", zpool_get_type(pool->zpool)); >> >> strlcpy(pool->tfm_name, compressor, sizeof(pool->tfm_name)); >> - pool->tfm = alloc_percpu(struct crypto_comp *); >> - if (!pool->tfm) { >> + pool->acomp = alloc_percpu(struct crypto_acomp *); >> + if (!pool->acomp) { >> + pr_err("percpu alloc failed\n"); >> + goto error; >> + } >> + >> + pool->acomp_req = alloc_percpu(struct acomp_req *); >> + if (!pool->acomp_req) { >> pr_err("percpu alloc failed\n"); >> goto error; >> } >> @@ -526,7 +554,8 @@ static struct zswap_pool *zswap_pool_create(char *type, char *compressor) >> return pool; >> >> error: >> - free_percpu(pool->tfm); >> + free_percpu(pool->acomp_req); >> + free_percpu(pool->acomp); >> if (pool->zpool) >> zpool_destroy_pool(pool->zpool); >> kfree(pool); >> @@ -566,7 +595,8 @@ static void zswap_pool_destroy(struct zswap_pool *pool) >> zswap_pool_debug("destroying", pool); >> >> cpuhp_state_remove_instance(CPUHP_MM_ZSWP_POOL_PREPARE, &pool->node); >> - free_percpu(pool->tfm); >> + free_percpu(pool->acomp_req); >> + free_percpu(pool->acomp); >> zpool_destroy_pool(pool->zpool); >> kfree(pool); >> } >> @@ -763,7 +793,8 @@ static int zswap_writeback_entry(struct zpool *pool, unsigned long handle) >> pgoff_t offset; >> struct zswap_entry *entry; >> struct page *page; >> - struct crypto_comp *tfm; >> + struct scatterlist input, output; >> + struct acomp_req *req; >> u8 *src, *dst; >> unsigned int dlen; >> int ret; >> @@ -803,14 +834,23 @@ static int zswap_writeback_entry(struct zpool *pool, unsigned long handle) >> >> case ZSWAP_SWAPCACHE_NEW: /* page is locked */ >> /* decompress */ >> + req = *get_cpu_ptr(entry->pool->acomp_req); >> dlen = PAGE_SIZE; >> src = (u8 *)zpool_map_handle(entry->pool->zpool, entry->handle, >> ZPOOL_MM_RO) + sizeof(struct zswap_header); >> dst = kmap_atomic(page); >> - tfm = *get_cpu_ptr(entry->pool->tfm); >> - ret = crypto_comp_decompress(tfm, src, entry->length, >> - dst, &dlen); >> - put_cpu_ptr(entry->pool->tfm); >> + >> + sg_init_one(&input, src, entry->length); >> + sg_init_one(&output, dst, dlen); >> + acomp_request_set_params(req, &input, &output, entry->length, >> + dlen); >> + acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, >> + NULL, NULL); >> + >> + ret = crypto_acomp_decompress(req); > I assume all of these crypto_acomp_[compress|decompress] calls are > actually synchronous, > not asynchronous as the name suggests. Otherwise, this would blow up > quite spectacularly > since all the resources we use in the call get derefed/unmapped below. > > Could an async algorithm be implement/used that would break this assumption? > > Seth > >> + >> + dlen = req->dlen; >> + put_cpu_ptr(entry->pool->acomp_req); >> kunmap_atomic(dst); >> zpool_unmap_handle(entry->pool->zpool, entry->handle); >> BUG_ON(ret); >> @@ -886,7 +926,8 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, >> { >> struct zswap_tree *tree = zswap_trees[type]; >> struct zswap_entry *entry, *dupentry; >> - struct crypto_comp *tfm; >> + struct scatterlist input, output; >> + struct acomp_req *req; >> int ret; >> unsigned int dlen = PAGE_SIZE, len; >> unsigned long handle; >> @@ -925,12 +966,27 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, >> } >> >> /* compress */ >> + req = *get_cpu_ptr(entry->pool->acomp_req); >> + if (!req) { >> + put_cpu_ptr(entry->pool->acomp_req); >> + ret = -EINVAL; >> + goto freepage; >> + } >> + >> dst = get_cpu_var(zswap_dstmem); >> - tfm = *get_cpu_ptr(entry->pool->tfm); >> src = kmap_atomic(page); >> - ret = crypto_comp_compress(tfm, src, PAGE_SIZE, dst, &dlen); >> + >> + sg_init_one(&input, src, PAGE_SIZE); >> + /* zswap_dstmem is of size (PAGE_SIZE * 2). Reflect same in sg_list */ >> + sg_init_one(&output, dst, PAGE_SIZE * 2); >> + acomp_request_set_params(req, &input, &output, PAGE_SIZE, dlen); >> + acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, NULL, >> + NULL); >> + >> + ret = crypto_acomp_compress(req); >> kunmap_atomic(src); >> - put_cpu_ptr(entry->pool->tfm); >> + put_cpu_ptr(entry->pool->acomp_req); >> + dlen = req->dlen; >> if (ret) { >> ret = -EINVAL; >> goto put_dstmem; >> @@ -998,7 +1054,8 @@ static int zswap_frontswap_load(unsigned type, pgoff_t offset, >> { >> struct zswap_tree *tree = zswap_trees[type]; >> struct zswap_entry *entry; >> - struct crypto_comp *tfm; >> + struct scatterlist input, output; >> + struct acomp_req *req; >> u8 *src, *dst; >> unsigned int dlen; >> int ret; >> @@ -1014,13 +1071,25 @@ static int zswap_frontswap_load(unsigned type, pgoff_t offset, >> spin_unlock(&tree->lock); >> >> /* decompress */ >> + req = *get_cpu_ptr(entry->pool->acomp_req); >> + if (!req) { >> + put_cpu_ptr(entry->pool->acomp_req); >> + return -1; >> + } >> dlen = PAGE_SIZE; >> src = (u8 *)zpool_map_handle(entry->pool->zpool, entry->handle, >> ZPOOL_MM_RO) + sizeof(struct zswap_header); >> dst = kmap_atomic(page); >> - tfm = *get_cpu_ptr(entry->pool->tfm); >> - ret = crypto_comp_decompress(tfm, src, entry->length, dst, &dlen); >> - put_cpu_ptr(entry->pool->tfm); >> + >> + sg_init_one(&input, src, entry->length); >> + sg_init_one(&output, dst, dlen); >> + acomp_request_set_params(req, &input, &output, entry->length, dlen); >> + acomp_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG, NULL, >> + NULL); >> + >> + ret = crypto_acomp_decompress(req); >> + >> + put_cpu_ptr(entry->pool->acomp_req); >> kunmap_atomic(dst); >> zpool_unmap_handle(entry->pool->zpool, entry->handle); >> BUG_ON(ret); >> -- >> 1.8.3.1 >> > . >