From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932242AbbHGOZH (ORCPT ); Fri, 7 Aug 2015 10:25:07 -0400 Received: from mail-ig0-f174.google.com ([209.85.213.174]:33252 "EHLO mail-ig0-f174.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753323AbbHGOZG (ORCPT ); Fri, 7 Aug 2015 10:25:06 -0400 MIME-Version: 1.0 In-Reply-To: <20150807063056.GG1891@swordfish> References: <1438782403-29496-1-git-send-email-ddstreet@ieee.org> <1438782403-29496-3-git-send-email-ddstreet@ieee.org> <20150807063056.GG1891@swordfish> From: Dan Streetman Date: Fri, 7 Aug 2015 10:24:45 -0400 X-Google-Sender-Auth: JKzTdUIF_zO-N0Fo_2Ly1dzfirU Message-ID: Subject: Re: [PATCH 2/3] zswap: dynamic pool creation To: Sergey Senozhatsky Cc: Seth Jennings , Andrew Morton , Linux-MM , linux-kernel Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Fri, Aug 7, 2015 at 2:30 AM, Sergey Senozhatsky wrote: > Hello, > > On (08/05/15 09:46), Dan Streetman wrote: > [..] >> -enum comp_op { >> - ZSWAP_COMPOP_COMPRESS, >> - ZSWAP_COMPOP_DECOMPRESS >> +struct zswap_pool { >> + struct zpool *zpool; >> + struct kref kref; >> + struct list_head list; >> + struct rcu_head rcu_head; >> + struct notifier_block notifier; >> + char tfm_name[CRYPTO_MAX_ALG_NAME]; > > do you need to keep a second CRYPTO_MAX_ALG_NAME copy? shouldn't it > be `tfm->__crt_alg->cra_name`, which is what > crypto_tfm_alg_name(struct crypto_tfm *tfm) > does? well, we don't absolutely have to keep a copy of tfm_name. However, ->tfm is a __percpu variable, so each time we want to check the pool's tfm name, we would need to do: crypto_comp_name(this_cpu_ptr(pool->tfm)) nothing wrong with that really, just adds a bit more code each time we want to check the tfm name. I'll send a patch to change it. > >> + struct crypto_comp * __percpu *tfm; >> }; > > ->tfm will be access pretty often, right? did you intentionally put it > at the bottom offset of `struct zswap_pool'? no it wasn't intentional; does moving it up provide a benefit? > > [..] >> +static struct zswap_pool *__zswap_pool_current(void) >> { >> - return totalram_pages * zswap_max_pool_percent / 100 < >> - DIV_ROUND_UP(zswap_pool_total_size, PAGE_SIZE); >> + struct zswap_pool *pool; >> + >> + pool = list_first_or_null_rcu(&zswap_pools, typeof(*pool), list); >> + WARN_ON(!pool); >> + >> + return pool; >> +} >> + >> +static struct zswap_pool *zswap_pool_current(void) >> +{ >> + assert_spin_locked(&zswap_pools_lock); >> + >> + return __zswap_pool_current(); >> +} > > this one seems to be used only once. do you want to replace > that single usage (well, if it's really needed) it's actually used twice, in __zswap_pool_empty() and __zswap_param_set(). The next patch adds __zswap_param_set(). > > WARN_ON(pool == zswap_pool_current()); > with > WARN_ON(pool == __zswap_pool_current); > > ? > > you can then drop zswap_pool_current()... and probably rename > __zswap_pool_current() to zswap_pool_current(). > > -ss > >> +static struct zswap_pool *zswap_pool_current_get(void) >> +{ >> + struct zswap_pool *pool; >> + >> + rcu_read_lock(); >> + >> + pool = __zswap_pool_current(); >> + if (!pool || !zswap_pool_get(pool)) >> + pool = NULL; >> + >> + rcu_read_unlock(); >> + >> + return pool; >> +} >> + >> +static struct zswap_pool *zswap_pool_last_get(void) >> +{ >> + struct zswap_pool *pool, *last = NULL; >> + >> + rcu_read_lock(); >> + >> + list_for_each_entry_rcu(pool, &zswap_pools, list) >> + last = pool; >> + if (!WARN_ON(!last) && !zswap_pool_get(last)) >> + last = NULL; >> + >> + rcu_read_unlock(); >> + >> + return last; >> +}