Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp5470273imu; Mon, 26 Nov 2018 00:30:55 -0800 (PST) X-Google-Smtp-Source: AFSGD/XYi13qLhrTyU8m5HWNDCk82kMeVoojzVsOiHsT+TFcYeBNJrQKnyPPOzSla8gbF7x+nR1z X-Received: by 2002:a63:7cf:: with SMTP id 198mr24261779pgh.129.1543221055933; Mon, 26 Nov 2018 00:30:55 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1543221055; cv=none; d=google.com; s=arc-20160816; b=cmZglmeVzCIuRjvxbKaY3W/bcsS7fSZGJkBNtBDOagPdmTeCxFxJqlLyyK7P+GtLHr myalP8TgSL5PRBEwhz66hcEE5fWH56w7rasUXddc2BwA+EIMkCHJoEP4E8KFLiq3tQjx s0HI+/qMKPRzXXYpnSnaA6LBtNu9pGOya9qNbHHwkhdqzW0AfeS/eReqUct0NDNOi3iw 7fYbuGZ6cZIxt6EzmL5rLRn5ZghMo3DTZTx0zmkBXWsRkgtuq6fsaEpXWHpfyCdF3yJ0 6PfB0WBilkKtgXafeo8nmgNmkfOZwZ7WXHLCzh3cqs4DtCcavs3B/9WVvRMtzGVdDkXo ObAg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=Ie6UPVbn4gUhFwtUvkVfmGwTVsUs9odsxydRk/3pJ+0=; b=YXzquLw4ms8sV/f1XhVcBvOfzydfCqut+H/l+1fGOHF05B4dAD07K6PeDrmnEGhVRY 6TyvlZ3aLob0Dht4nrJY48SCtTsPiVMPkyq1Nu4DHsLYKd1rrZq3EsbFAEIY4qvQ+aEi QqsIzFLh/Db5+FmpY9J5YpftgeJQXxNYTmQsGjUH9qM8ILBP9YzU6763a1yOYGHLjvog NhpPznbdXMdgOVxJ7ciXWvDOY0kkv57YdUj1UEKAyNaS6oeqFXNvlFnWJxAtk4ZvlMIP lQ7YSB6/f3SQwtqGVo/qNpSqGapK0+BgMsUx2d1vYtQ64CtdWl8Oe8PG+zNJWdLuqQdB 24Pw== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@gmail.com header.s=20161025 header.b=bwsR4VbB; 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=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b17si55180523pgk.581.2018.11.26.00.30.39; Mon, 26 Nov 2018 00:30:55 -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=fail header.i=@gmail.com header.s=20161025 header.b=bwsR4VbB; 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=fail (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726510AbeKZTWD (ORCPT + 99 others); Mon, 26 Nov 2018 14:22:03 -0500 Received: from mail-pg1-f195.google.com ([209.85.215.195]:41666 "EHLO mail-pg1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726200AbeKZTWC (ORCPT ); Mon, 26 Nov 2018 14:22:02 -0500 Received: by mail-pg1-f195.google.com with SMTP id 70so5815399pgh.8 for ; Mon, 26 Nov 2018 00:28:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=Ie6UPVbn4gUhFwtUvkVfmGwTVsUs9odsxydRk/3pJ+0=; b=bwsR4VbBDeQ559PuhLJEWQ/uzBSPcI3lqvAKoomG/+NDbSIkFTT/sYWaf57sEIvvz2 IggBwiETlUtqrXFMd703WJO4zAkt790pNgIC/4GkYw0QGdeL6ChJZJKPvHWcqLFVVSIy M7nQ7Zva71BsCvp6w00hk/hgtKOplbJ8gkdtbkD3sJXypZoOr/rrWmG96agni/lqvovI QP6HLdHhu9yhw/PDRIEfB4cmZrbej4SHDzYzgnPPHt9De/ynsNDnBKBt2+aBwgKYHM3O 9C+clmvPLq9M7mXhmXK1/Eyh3tbMa9vqZe4BQNRa4EGmSROJJzRIZaYQluIcXbV9Yxuh HV+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-transfer-encoding; bh=Ie6UPVbn4gUhFwtUvkVfmGwTVsUs9odsxydRk/3pJ+0=; b=C7F8WmtjHXIGvxfD0YGx6Mxy/uGRIidVSDksJPH55zwzcXTVJvm5G/Qdt1M0kAHbOi ArKmySZadH+MGSqaL/8zdZh+XmDawChZX7VEpDwgzV9MJHibhgzoMcvAjH4JoJtpMyFN SSWahWC/sO1qN6Wlwg1cDewxZ/PZxZ+ZJ1aW/6FDGbfsuAMxEcpdP8B2SXJxX25iXSyy 99GuzYIPctV3ygoZuvj3Y5dH3T1fDWHWptgdVNwYv/y+oump1rmA350rrcgDTbrvJY7n 35CnT/aBbLKfbzLpO4IoGQPrqkSGgK8gst0mOcstGBRNpQUpZyx34nyWNTHf6RQqg+N4 772Q== X-Gm-Message-State: AA+aEWYcaC/FGFcy5qJ6rLB20CSCI3icLN8TiqAw86lHItQL8E1MlBL8 M7A/IEbn4c5cDlbDCZBz7H8= X-Received: by 2002:a63:f047:: with SMTP id s7mr23786929pgj.441.1543220920302; Mon, 26 Nov 2018 00:28:40 -0800 (PST) Received: from bbox-2.seo.corp.google.com ([2401:fa00:d:0:98f1:8b3d:1f37:3e8]) by smtp.gmail.com with ESMTPSA id j197sm82846611pgc.76.2018.11.26.00.28.38 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 26 Nov 2018 00:28:39 -0800 (PST) From: Minchan Kim To: Andrew Morton Cc: LKML , Sergey Senozhatsky , Minchan Kim Subject: [PATCH v2 7/7] zram: writeback throttle Date: Mon, 26 Nov 2018 17:28:13 +0900 Message-Id: <20181126082813.81977-8-minchan@kernel.org> X-Mailer: git-send-email 2.20.0.rc0.387.gc7a69e6b6c-goog In-Reply-To: <20181126082813.81977-1-minchan@kernel.org> References: <20181126082813.81977-1-minchan@kernel.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On small memory system, there are lots of write IO so if we use flash device as swap, there would be serious flash wearout. To overcome the problem, system developers need to design write limitation strategy to guarantee flash health for entire product life. This patch creates a new konb "writeback_limit" on zram. With that, if current writeback IO count(/sys/block/zramX/io_stat) excceds the limitation, zram stops further writeback until admin can reset the limit. Signed-off-by: Minchan Kim --- Documentation/ABI/testing/sysfs-block-zram | 9 +++++ Documentation/blockdev/zram.txt | 2 + drivers/block/zram/zram_drv.c | 47 +++++++++++++++++++++- drivers/block/zram/zram_drv.h | 2 + 4 files changed, 59 insertions(+), 1 deletion(-) diff --git a/Documentation/ABI/testing/sysfs-block-zram b/Documentation/ABI/testing/sysfs-block-zram index 65fc33b2f53b..9d2339a485c8 100644 --- a/Documentation/ABI/testing/sysfs-block-zram +++ b/Documentation/ABI/testing/sysfs-block-zram @@ -121,3 +121,12 @@ Contact: Minchan Kim The bd_stat file is read-only and represents backing device's statistics (bd_count, bd_reads, bd_writes) in a format similar to block layer statistics file format. + +What: /sys/block/zram/writeback_limit +Date: November 2018 +Contact: Minchan Kim +Description: + The writeback_limit file is read-write and specifies the maximum + amount of writeback ZRAM can do. The limit could be changed + in run time and "0" means disable the limit. + No limit is the initial state. diff --git a/Documentation/blockdev/zram.txt b/Documentation/blockdev/zram.txt index 550bca77d322..41748d52712d 100644 --- a/Documentation/blockdev/zram.txt +++ b/Documentation/blockdev/zram.txt @@ -164,6 +164,8 @@ reset WO trigger device reset mem_used_max WO reset the `mem_used_max' counter (see later) mem_limit WO specifies the maximum amount of memory ZRAM can use to store the compressed data +writeback_limit WO specifies the maximum amount of write IO zram can + write out to backing device max_comp_streams RW the number of possible concurrent compress operations comp_algorithm RW show and change the compression algorithm compact WO trigger memory compaction diff --git a/drivers/block/zram/zram_drv.c b/drivers/block/zram/zram_drv.c index cceaa10301e8..07c0847b7c0f 100644 --- a/drivers/block/zram/zram_drv.c +++ b/drivers/block/zram/zram_drv.c @@ -328,6 +328,40 @@ static ssize_t idle_store(struct device *dev, } #ifdef CONFIG_ZRAM_WRITEBACK + +static ssize_t writeback_limit_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t len) +{ + struct zram *zram = dev_to_zram(dev); + u64 val; + ssize_t ret = -EINVAL; + + if (kstrtoull(buf, 10, &val)) + return ret; + + down_read(&zram->init_lock); + atomic64_set(&zram->stats.bd_wb_limit, val); + if (val == 0 || val > atomic64_read(&zram->stats.bd_writes)) + zram->stop_writeback = false; + up_read(&zram->init_lock); + ret = len; + + return ret; +} + +static ssize_t writeback_limit_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + u64 val; + struct zram *zram = dev_to_zram(dev); + + down_read(&zram->init_lock); + val = atomic64_read(&zram->stats.bd_wb_limit); + up_read(&zram->init_lock); + + return scnprintf(buf, PAGE_SIZE, "%llu\n", val); +} + static void reset_bdev(struct zram *zram) { struct block_device *bdev; @@ -592,6 +626,7 @@ static ssize_t writeback_store(struct device *dev, char mode_buf[64]; unsigned long mode = -1UL; unsigned long blk_idx = 0; + u64 wb_count, wb_limit; strlcpy(mode_buf, buf, sizeof(mode_buf)); /* ignore trailing newline */ @@ -631,6 +666,11 @@ static ssize_t writeback_store(struct device *dev, bvec.bv_len = PAGE_SIZE; bvec.bv_offset = 0; + if (zram->stop_writeback) { + ret = -EIO; + break; + } + if (!blk_idx) { blk_idx = alloc_block_bdev(zram); if (!blk_idx) { @@ -689,7 +729,7 @@ static ssize_t writeback_store(struct device *dev, continue; } - atomic64_inc(&zram->stats.bd_writes); + wb_count = atomic64_inc_return(&zram->stats.bd_writes); /* * We released zram_slot_lock so need to check if the slot was * changed. If there is freeing for the slot, we can catch it @@ -713,6 +753,9 @@ static ssize_t writeback_store(struct device *dev, zram_set_element(zram, index, blk_idx); blk_idx = 0; atomic64_inc(&zram->stats.pages_stored); + wb_limit = atomic64_read(&zram->stats.bd_wb_limit); + if (wb_limit != 0 && wb_count >= wb_limit) + zram->stop_writeback = true; next: zram_slot_unlock(zram, index); } @@ -1786,6 +1829,7 @@ static DEVICE_ATTR_RW(comp_algorithm); #ifdef CONFIG_ZRAM_WRITEBACK static DEVICE_ATTR_RW(backing_dev); static DEVICE_ATTR_WO(writeback); +static DEVICE_ATTR_RW(writeback_limit); #endif static struct attribute *zram_disk_attrs[] = { @@ -1801,6 +1845,7 @@ static struct attribute *zram_disk_attrs[] = { #ifdef CONFIG_ZRAM_WRITEBACK &dev_attr_backing_dev.attr, &dev_attr_writeback.attr, + &dev_attr_writeback_limit.attr, #endif &dev_attr_io_stat.attr, &dev_attr_mm_stat.attr, diff --git a/drivers/block/zram/zram_drv.h b/drivers/block/zram/zram_drv.h index 7cbb134fc0c9..024044e82c9b 100644 --- a/drivers/block/zram/zram_drv.h +++ b/drivers/block/zram/zram_drv.h @@ -86,6 +86,7 @@ struct zram_stats { atomic64_t bd_count; /* no. of pages in backing device */ atomic64_t bd_reads; /* no. of reads from backing device */ atomic64_t bd_writes; /* no. of writes from backing device */ + atomic64_t bd_wb_limit; /* writeback limit of backing device */ #endif }; @@ -113,6 +114,7 @@ struct zram { */ bool claim; /* Protected by bdev->bd_mutex */ struct file *backing_dev; + bool stop_writeback; #ifdef CONFIG_ZRAM_WRITEBACK struct block_device *bdev; unsigned int old_block_size; -- 2.20.0.rc0.387.gc7a69e6b6c-goog