Received: by 2002:a25:31c3:0:0:0:0:0 with SMTP id x186csp2713095ybx; Fri, 8 Nov 2019 08:18:06 -0800 (PST) X-Google-Smtp-Source: APXvYqx332FzloBK+OGRXi9yaA9PIVTsnYw8pyX0wgnIuG6KQGcTqrgm58wrKpKJpoBO7CLBkhWY X-Received: by 2002:a50:b626:: with SMTP id b35mr11055213ede.183.1573229886300; Fri, 08 Nov 2019 08:18:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1573229886; cv=none; d=google.com; s=arc-20160816; b=YXxbyhdqEDr2M3fT8L85NeH+BeTsmXQUgxhh+cihAD+Ku9RuCTEQz6vz/WsbLq7nit dV6adKPAZ9GWxUYrekuLZ2P2os4DsvNXXvS///NHqwqbuARpVfSvYWa/EQuysk2+oeCa IgZvfJooWdX+HSD+5S9AMi9tlsLbqpHNB6wQLlSJCqVYVYVKfaztT+xXx72aJxRKgcTU wv256kTmCGgYg5P95wDvky3CBF1sFtbHqsWzbr9JuYmM06antFMU/Cmu3ho15MlLhOzH M/741LdJUYMDc4B5/rtN1jCBXsH3wpmCNe8QtN6McJcImvXvFtrxtT4zOzFjYRm5KIDD cxcg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:dkim-signature; bh=l2UYFEGLZmGQ7i41acAR9R0I3eSg77guyFjPWJWzrxs=; b=U7TzwZkH7VcJNJGYwOI6j7CJkW+TfKBhE4Q6SjaIpWwFT5RVm1l0AzY11SpCuwwYME i0yi2UwoW0uRbYJ1QVD9OGpsNdscFrmU6B81j6mP0LUqU5eMaakoe7FKLbIJGbhvQi8H 4vQ3g8JEZG1Yb+Dym7moADUTWsITatAA4FKwX76OgiWTZOOu0n7DeowW/ldfoEvYAz7N qcMVgVW/DZHQXQQ6LGB8nT8dqJwSlIqu4Ni29kjTY52NMwlI95JzKu+pMq70lc5WQ14A ISQazF+INSIR2es0ytGjUslLC8sCAHULR6G7rtqte/+kwNhxj0YEtv68GidnyLzSUmct 1Y3A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ieee.org header.s=google header.b=QWtZEAWa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ieee.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id u4si5721521edi.179.2019.11.08.08.17.42; Fri, 08 Nov 2019 08:18:06 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ieee.org header.s=google header.b=QWtZEAWa; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=ieee.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727041AbfKHQQK (ORCPT + 99 others); Fri, 8 Nov 2019 11:16:10 -0500 Received: from mail-io1-f66.google.com ([209.85.166.66]:32843 "EHLO mail-io1-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726049AbfKHQQJ (ORCPT ); Fri, 8 Nov 2019 11:16:09 -0500 Received: by mail-io1-f66.google.com with SMTP id j13so6985855ioe.0 for ; Fri, 08 Nov 2019 08:16:09 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ieee.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=l2UYFEGLZmGQ7i41acAR9R0I3eSg77guyFjPWJWzrxs=; b=QWtZEAWaspw9OXu+FdJCQiHaUA9XGmXFN1ipdRUqfNCsmai8FbLuy1zibNwebgd1pj zl8ULIA0tLBbt9SoUJnNvG7cexMTOazJymra3Mxn8oep59n/CmI9GKgtGsEqBUjfzrH3 iaGSFJUnCtNPTjatQ24fvZS1+Q6bZFjtVjLcw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=l2UYFEGLZmGQ7i41acAR9R0I3eSg77guyFjPWJWzrxs=; b=VW4t94rxNPbeeu6a4Gk6jvlZv83xjftWDr9vYdItZ7XnTcC18p9iU3kdhH/+YI7wKq VwbphEmf+GGch8w4Ru4FdL6QbNINOlH815k6MkcN/0z2gvCRTm4udBSfN74EcBx7L0s8 PROvyPAx49618LZ7KVPNOFToivoeEOe+Illk+XzD/HB0wKj0iqfgqcoi9nT4t8/fpe/c 1r3gIsm/OhI//7k5IkpMOVnhrdr3HzD05C/B2voOb/O1czxJCpOKZNJktSCOmpfZ4sjH aVG7e38p0/8Ovexpp6pxUPOVvHhFzkYuNQ83uDl4SNeLd23tvxLHVAfSasWSHLjvUODq JnRA== X-Gm-Message-State: APjAAAU9/ZJMe8t4lENtNk48QLg4rIXz39Cjb1j+qbub0FLLWuhzaCo8 V7Hk/TpTzEwMjnxyo8M9voaNPE4dB8hiRFN0/EM= X-Received: by 2002:a05:6638:9:: with SMTP id z9mr11581662jao.35.1573229768364; Fri, 08 Nov 2019 08:16:08 -0800 (PST) MIME-Version: 1.0 References: <1571111349-5041-1-git-send-email-teawater@gmail.com> <1571111349-5041-2-git-send-email-teawater@gmail.com> In-Reply-To: <1571111349-5041-2-git-send-email-teawater@gmail.com> From: Dan Streetman Date: Fri, 8 Nov 2019 11:15:31 -0500 Message-ID: Subject: Re: [PATCH 2/2] mm, zswap: Support THP To: Hui Zhu Cc: Konrad Rzeszutek Wilk , Seth Jennings , linux-kernel , Linux-MM , Hui Zhu Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 14, 2019 at 11:49 PM Hui Zhu wrote: > > This commit let zswap treats THP as continuous normal pages > in zswap_frontswap_store. > It will store them to a lot of "zswap_entry". These "zswap_entry" > will be inserted to "zswap_tree" together. why does zswap need to carry the added complexity of converting THP into separate normal sized pages? That should be done higher up in the swap layer. > > Signed-off-by: Hui Zhu > --- > mm/zswap.c | 170 +++++++++++++++++++++++++++++++++++++++---------------------- > 1 file changed, 109 insertions(+), 61 deletions(-) > > diff --git a/mm/zswap.c b/mm/zswap.c > index 46a3223..36aa10d 100644 > --- a/mm/zswap.c > +++ b/mm/zswap.c > @@ -316,11 +316,7 @@ static void zswap_rb_erase(struct rb_root *root, struct zswap_entry *entry) > } > } > > -/* > - * Carries out the common pattern of freeing and entry's zpool allocation, > - * freeing the entry itself, and decrementing the number of stored pages. > - */ > -static void zswap_free_entry(struct zswap_entry *entry) > +static void zswap_free_entry_1(struct zswap_entry *entry) > { > if (!entry->length) > atomic_dec(&zswap_same_filled_pages); > @@ -329,6 +325,15 @@ static void zswap_free_entry(struct zswap_entry *entry) > zswap_pool_put(entry->pool); > } > zswap_entry_cache_free(entry); > +} > + > +/* > + * Carries out the common pattern of freeing and entry's zpool allocation, > + * freeing the entry itself, and decrementing the number of stored pages. > + */ > +static void zswap_free_entry(struct zswap_entry *entry) > +{ > + zswap_free_entry_1(entry); > atomic_dec(&zswap_stored_pages); > zswap_update_total_size(); > } > @@ -980,15 +985,11 @@ static void zswap_fill_page(void *ptr, unsigned long value) > memset_l(page, value, PAGE_SIZE / sizeof(unsigned long)); > } > > -/********************************* > -* frontswap hooks > -**********************************/ > -/* attempts to compress and store an single page */ > -static int zswap_frontswap_store(unsigned type, pgoff_t offset, > - struct page *page) > +static int zswap_frontswap_store_1(unsigned type, pgoff_t offset, > + struct page *page, > + struct zswap_entry **entry_pointer) > { > - struct zswap_tree *tree = zswap_trees[type]; > - struct zswap_entry *entry, *dupentry; > + struct zswap_entry *entry; > struct crypto_comp *tfm; > int ret; > unsigned int hlen, dlen = PAGE_SIZE; > @@ -998,36 +999,6 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, > struct zswap_header zhdr = { .swpentry = swp_entry(type, offset) }; > gfp_t gfp; > > - /* THP isn't supported */ > - if (PageTransHuge(page)) { > - ret = -EINVAL; > - goto reject; > - } > - > - if (!zswap_enabled || !tree) { > - ret = -ENODEV; > - goto reject; > - } > - > - /* reclaim space if needed */ > - if (zswap_is_full()) { > - zswap_pool_limit_hit++; > - if (zswap_shrink()) { > - zswap_reject_reclaim_fail++; > - ret = -ENOMEM; > - goto reject; > - } > - > - /* A second zswap_is_full() check after > - * zswap_shrink() to make sure it's now > - * under the max_pool_percent > - */ > - if (zswap_is_full()) { > - ret = -ENOMEM; > - goto reject; > - } > - } > - > /* allocate entry */ > entry = zswap_entry_cache_alloc(GFP_KERNEL); > if (!entry) { > @@ -1035,6 +1006,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, > ret = -ENOMEM; > goto reject; > } > + *entry_pointer = entry; > > if (zswap_same_filled_pages_enabled) { > src = kmap_atomic(page); > @@ -1044,7 +1016,7 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, > entry->length = 0; > entry->value = value; > atomic_inc(&zswap_same_filled_pages); > - goto insert_entry; > + goto out; > } > kunmap_atomic(src); > } > @@ -1093,31 +1065,105 @@ static int zswap_frontswap_store(unsigned type, pgoff_t offset, > entry->handle = handle; > entry->length = dlen; > > -insert_entry: > +out: > + return 0; > + > +put_dstmem: > + put_cpu_var(zswap_dstmem); > + zswap_pool_put(entry->pool); > +freepage: > + zswap_entry_cache_free(entry); > +reject: > + return ret; > +} > + > +/********************************* > +* frontswap hooks > +**********************************/ > +/* attempts to compress and store an single page */ > +static int zswap_frontswap_store(unsigned type, pgoff_t offset, > + struct page *page) > +{ > + struct zswap_tree *tree = zswap_trees[type]; > + struct zswap_entry **entries = NULL, *dupentry; > + struct zswap_entry *single_entry[1]; > + int ret; > + int i, nr; > + > + if (!zswap_enabled || !tree) { > + ret = -ENODEV; > + goto reject; > + } > + > + /* reclaim space if needed */ > + if (zswap_is_full()) { > + zswap_pool_limit_hit++; > + if (zswap_shrink()) { > + zswap_reject_reclaim_fail++; > + ret = -ENOMEM; > + goto reject; > + } > + > + /* A second zswap_is_full() check after > + * zswap_shrink() to make sure it's now > + * under the max_pool_percent > + */ > + if (zswap_is_full()) { > + ret = -ENOMEM; > + goto reject; > + } > + } > + > + nr = hpage_nr_pages(page); > + > + if (unlikely(nr > 1)) { > + entries = kvmalloc(sizeof(struct zswap_entry *) * nr, > + GFP_KERNEL); > + if (!entries) { > + ret = -ENOMEM; > + goto reject; > + } > + } else > + entries = single_entry; > + > + for (i = 0; i < nr; i++) { > + ret = zswap_frontswap_store_1(type, offset + i, page + i, > + &entries[i]); > + if (ret) > + goto freepage; > + } > + > /* map */ > spin_lock(&tree->lock); > - do { > - ret = zswap_rb_insert(&tree->rbroot, entry, &dupentry); > - if (ret == -EEXIST) { > - zswap_duplicate_entry++; > - /* remove from rbtree */ > - zswap_rb_erase(&tree->rbroot, dupentry); > - zswap_entry_put(tree, dupentry); > - } > - } while (ret == -EEXIST); > + for (i = 0; i < nr; i++) { > + do { > + ret = zswap_rb_insert(&tree->rbroot, entries[i], > + &dupentry); > + if (ret == -EEXIST) { > + zswap_duplicate_entry++; > + /* remove from rbtree */ > + zswap_rb_erase(&tree->rbroot, dupentry); > + zswap_entry_put(tree, dupentry); > + } > + } while (ret == -EEXIST); > + } > spin_unlock(&tree->lock); > > /* update stats */ > - atomic_inc(&zswap_stored_pages); > + atomic_add(nr, &zswap_stored_pages); > zswap_update_total_size(); > > - return 0; > - > -put_dstmem: > - put_cpu_var(zswap_dstmem); > - zswap_pool_put(entry->pool); > + ret = 0; > freepage: > - zswap_entry_cache_free(entry); > + if (unlikely(nr > 1)) { > + if (ret) { > + int j; > + > + for (j = 0; j < i; j++) > + zswap_free_entry_1(entries[j]); > + } > + kvfree(entries); > + } > reject: > return ret; > } > @@ -1136,6 +1182,8 @@ static int zswap_frontswap_load(unsigned type, pgoff_t offset, > unsigned int dlen; > int ret; > > + BUG_ON(PageTransHuge(page)); > + > /* find */ > spin_lock(&tree->lock); > entry = zswap_entry_find_get(&tree->rbroot, offset); > -- > 2.7.4 >