From patchwork Mon Sep 21 13:25:53 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergey Senozhatsky X-Patchwork-Id: 7230291 X-Patchwork-Delegate: herbert@gondor.apana.org.au Return-Path: X-Original-To: patchwork-linux-crypto@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 268F99F30C for ; Mon, 21 Sep 2015 13:27:11 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1951220722 for ; Mon, 21 Sep 2015 13:27:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1269520721 for ; Mon, 21 Sep 2015 13:27:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756550AbbIUN1H (ORCPT ); Mon, 21 Sep 2015 09:27:07 -0400 Received: from mail-pa0-f46.google.com ([209.85.220.46]:35528 "EHLO mail-pa0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756490AbbIUN1G (ORCPT ); Mon, 21 Sep 2015 09:27:06 -0400 Received: by pacfv12 with SMTP id fv12so119310259pac.2; Mon, 21 Sep 2015 06:27:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=r4d5HgW3xV6jjhW6YsN5zhben71i4y9OReDUevwCXSI=; b=tJWhQHQoGBw5A6n6Dq47xbheQ1S7aevlbLHmp0SO0LauYgXbM7VqJ6BWmJb5O/MR0H AJtKBxmBIgZRUQoCUuuNZWAIjCZJy8OGWOa4x3y18DmveOr+F4xEKSxushFByXaTZ6R5 uF/AuegY2lnofmkF3bHCf8IlWlw15LC7GR4XpbDRyIau28H4B3fZSY7J+paRBxZYP+wW QOJNEVBzQCY0dKBMJowY8DOvYmV8m6X9XQOF4wdp1Jascgab1CYu8Q1fEdugPOHMfX6n tsVhSqmKV/Y56RndFWPSV2Fmes93EZY96+A0n9L7LdVGhe6cnwJnVdn3notUljnZpuWU 4u1g== X-Received: by 10.68.114.34 with SMTP id jd2mr25423251pbb.94.1442842026325; Mon, 21 Sep 2015 06:27:06 -0700 (PDT) Received: from swordfish.localdomain ([112.168.75.135]) by smtp.gmail.com with ESMTPSA id j16sm24644893pbq.23.2015.09.21.06.27.03 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 21 Sep 2015 06:27:05 -0700 (PDT) From: Sergey Senozhatsky To: Joonsoo Kim Cc: Andrew Morton , Minchan Kim , Herbert Xu , "David S. Miller" , Stephan Mueller , Joonsoo Kim , Sergey Senozhatsky , Sergey Senozhatsky , linux-crypto@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [RFC][PATCH 9/9] zram: use crypto CRYPTO_ALG_TFM_MAY_SHARE API Date: Mon, 21 Sep 2015 22:25:53 +0900 Message-Id: <1442841953-11588-1-git-send-email-sergey.senozhatsky@gmail.com> X-Mailer: git-send-email 2.5.3 In-Reply-To: <1442841229-8122-1-git-send-email-sergey.senozhatsky@gmail.com> References: <1442841229-8122-1-git-send-email-sergey.senozhatsky@gmail.com> Sender: linux-crypto-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-crypto@vger.kernel.org X-Spam-Status: No, score=-6.8 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_FROM, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Crypto subsystem now supports CRYPTO_ALG_TFM_MAY_SHARE API that requires special tfm_noctx. This tfm can be shared by multiple concurrent decompress user because this API doesn't rely on this tfm object except to fetch decompress function pointer. Until changing to use crypto API, zram doesn't require any zstrm on decompress so decompress is parallelized unlimitedly. But, previous patch make zram to use crypto API and this requires one zstrm on every decompress users so, in some zstrm contended situations, zram's performance would be degraded. This patch makes zram use CRYPTO_ALG_TFM_MAY_SHARE API and restore zram's performance as the time that zram doesn't use crypto API. Following is zram's read performance number. * iozone -t 4 -R -r 16K -s 60M -I +Z -i 0 -i 1 * max_stream is set to 1 * Output is in Kbytes/sec zram-base vs zram-crypto vs zram-crypto-CRYPTO_ALG_TFM_MAY_SHARE Read 10411701.88 6426911.62 9423894.38 Re-read 10017386.62 6428218.88 11000063.50 Signed-off-by: Joonsoo Kim Signed-off-by: Sergey Senozhatsky --- drivers/block/zram/zcomp.c | 27 +++++++++++++++++++++++++-- drivers/block/zram/zcomp.h | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/drivers/block/zram/zcomp.c b/drivers/block/zram/zcomp.c index 6219d4d..b768dc9 100644 --- a/drivers/block/zram/zcomp.c +++ b/drivers/block/zram/zcomp.c @@ -319,9 +319,14 @@ void zcomp_compress_end(struct zcomp *comp, struct zcomp_strm *zstrm) zcomp_strm_release(comp, zstrm); } -/* Never return NULL, may sleep */ +/* May return NULL, may sleep */ struct zcomp_strm *zcomp_decompress_begin(struct zcomp *comp) { + struct crypto_comp *tfm = comp->tfm_noctx; + + if (tfm && crypto_tfm_may_share(crypto_comp_tfm(tfm))) + return NULL; + return zcomp_strm_find(comp); } @@ -345,12 +350,18 @@ int zcomp_decompress(struct zcomp *comp, struct zcomp_strm *zstrm, unsigned int src_len, unsigned char *dst) { unsigned int size = PAGE_SIZE; + struct crypto_comp *tfm = comp->tfm_noctx; + + if (tfm && crypto_tfm_may_share(crypto_comp_tfm(tfm))) + return crypto_comp_decompress(tfm, src, src_len, dst, &size); - return crypto_comp_decompress(zstrm->tfm, src, src_len, dst, &size); + return crypto_comp_decompress(zstrm->tfm, src, src_len, dst, &size); } void zcomp_destroy(struct zcomp *comp) { + if (comp->tfm_noctx) + crypto_free_comp(comp->tfm_noctx); comp->destroy(comp); kfree(comp); } @@ -367,6 +378,7 @@ struct zcomp *zcomp_create(const char *compress, int max_strm) { struct zcomp *comp; const char *backend; + struct crypto_comp *tfm; int error; backend = find_backend(compress); @@ -386,5 +398,16 @@ struct zcomp *zcomp_create(const char *compress, int max_strm) kfree(comp); return ERR_PTR(error); } + + /* + * Prepare to use crypto decompress_noctx API. One tfm is required + * to initialize crypto algorithm properly and fetch corresponding + * function pointer. But, it is sharable for multiple concurrent + * decompress users. + */ + tfm = crypto_alloc_comp(compress, 0, 0); + if (!IS_ERR(tfm)) + comp->tfm_noctx = tfm; + return comp; } diff --git a/drivers/block/zram/zcomp.h b/drivers/block/zram/zcomp.h index 4f9df8e..c76d8e4 100644 --- a/drivers/block/zram/zcomp.h +++ b/drivers/block/zram/zcomp.h @@ -26,6 +26,7 @@ struct zcomp_strm { /* dynamic per-device compression frontend */ struct zcomp { void *stream; + struct crypto_comp *tfm_noctx; const char *backend; struct zcomp_strm *(*strm_find)(struct zcomp *comp);