From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 07BA5C4345F for ; Thu, 25 Apr 2024 10:38:26 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 657C86B0089; Thu, 25 Apr 2024 06:38:26 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 606A86B008A; Thu, 25 Apr 2024 06:38:26 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 4A7DA6B0092; Thu, 25 Apr 2024 06:38:26 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 2E5AB6B0089 for ; Thu, 25 Apr 2024 06:38:26 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay09.hostedemail.com (Postfix) with ESMTP id CA81980450 for ; Thu, 25 Apr 2024 10:38:25 +0000 (UTC) X-FDA: 82047704970.25.B8275C6 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) by imf27.hostedemail.com (Postfix) with ESMTP id E088C40028 for ; Thu, 25 Apr 2024 10:38:15 +0000 (UTC) Authentication-Results: imf27.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf27.hostedemail.com: domain of shiju.jose@huawei.com designates 185.176.79.56 as permitted sender) smtp.mailfrom=shiju.jose@huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1714041496; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=R/KodjYnPwtJijASJuNiOkBqJgKFXp1j9jpIUiMDM7A=; b=1o9jDZaGRzKjnT6GxmWk1qZnzr8ZOMEDf9n2I7K5imq9W8XngWh7UiCIeky3Q/rmtVaRGC +egNVj1QL/F7swKGONirla8W5JUL4E0P0iKsFUmiGb1d+ldKK4KWcpEXAAm9ZhSTfGchdF 96UkjkDjCEJDeb11lnh8+a2pkichE9M= ARC-Authentication-Results: i=1; imf27.hostedemail.com; dkim=none; dmarc=pass (policy=quarantine) header.from=huawei.com; spf=pass (imf27.hostedemail.com: domain of shiju.jose@huawei.com designates 185.176.79.56 as permitted sender) smtp.mailfrom=shiju.jose@huawei.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1714041496; a=rsa-sha256; cv=none; b=mlNKefCVZyodgFnaSCxveoGF0H+sOyfuMpgoi6SLvxIB/gWbssXQo0vLK5yrdwk9u/CAbR xPYIwXiHPBFxSYN76G62L1rg24JZaisGIrDLZPFQJEjkwZlyLGonrCUvufgAnSBC9onhvI ayoLiaB15owCgNBLos6ckCvwEMGug90= Received: from mail.maildlp.com (unknown [172.18.186.231]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4VQC1Z4FHgz6K5vB; Thu, 25 Apr 2024 18:35:46 +0800 (CST) Received: from lhrpeml100006.china.huawei.com (unknown [7.191.160.224]) by mail.maildlp.com (Postfix) with ESMTPS id A9EFD1400DB; Thu, 25 Apr 2024 18:38:11 +0800 (CST) Received: from lhrpeml500006.china.huawei.com (7.191.161.198) by lhrpeml100006.china.huawei.com (7.191.160.224) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Thu, 25 Apr 2024 11:38:11 +0100 Received: from lhrpeml500006.china.huawei.com ([7.191.161.198]) by lhrpeml500006.china.huawei.com ([7.191.161.198]) with mapi id 15.01.2507.035; Thu, 25 Apr 2024 11:38:11 +0100 From: Shiju Jose To: fan CC: "linux-cxl@vger.kernel.org" , "linux-acpi@vger.kernel.org" , "linux-mm@kvack.org" , "dan.j.williams@intel.com" , "dave@stgolabs.net" , "Jonathan Cameron" , "dave.jiang@intel.com" , "alison.schofield@intel.com" , "vishal.l.verma@intel.com" , "ira.weiny@intel.com" , "linux-edac@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "david@redhat.com" , "Vilas.Sridharan@amd.com" , "leo.duran@amd.com" , "Yazen.Ghannam@amd.com" , "rientjes@google.com" , "jiaqiyan@google.com" , "tony.luck@intel.com" , "Jon.Grimm@amd.com" , "dave.hansen@linux.intel.com" , "rafael@kernel.org" , "lenb@kernel.org" , "naoya.horiguchi@nec.com" , "james.morse@arm.com" , "jthoughton@google.com" , "somasundaram.a@hpe.com" , "erdemaktas@google.com" , "pgonda@google.com" , "duenwen@google.com" , "mike.malvestuto@intel.com" , "gthelen@google.com" , "wschwartz@amperecomputing.com" , "dferguson@amperecomputing.com" , "wbs@os.amperecomputing.com" , tanxiaofei , "Zengtao (B)" , "kangkang.shen@futurewei.com" , wanghuiqiang , Linuxarm Subject: RE: [RFC PATCH v8 01/10] ras: scrub: Add scrub subsystem Thread-Topic: [RFC PATCH v8 01/10] ras: scrub: Add scrub subsystem Thread-Index: AQHaknlLsB7DmyDvA0iAgKJhxeY8vLF31X0AgAD1x9A= Date: Thu, 25 Apr 2024 10:38:10 +0000 Message-ID: References: <20240419164720.1765-1-shiju.jose@huawei.com> <20240419164720.1765-2-shiju.jose@huawei.com> In-Reply-To: Accept-Language: en-GB, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.126.169.103] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Stat-Signature: sfe7ttc6pc3wrc1ary7jogz1m46ndtqx X-Rspamd-Queue-Id: E088C40028 X-Rspamd-Server: rspam02 X-Rspam-User: X-HE-Tag: 1714041495-111570 X-HE-Meta: U2FsdGVkX19I2KQLe/glhrZ1WinCvQBHeGy0tani6fQNepb3FPnhIiypaqEPqLWxkZzL57p8hqUg9GQ/2T9hsnz511L7yqir5kHnOEakNi+/ylG+3fIrvsdNa8uwZDfOiz8k30FKZETgHpywZypwK9DKYzGCUyAHbpZwYnPHcvRltx5E/0tjy5JS3PgLn/NHR3WugSEFuicIvZMgJJNFUdpSWkCHfRwvkYgGw96kLUUo4trYmqR8qvhU13hWyh/V8t16DciX972unkaCeNVrn68CXC+RECQ5EnE5hluU05o5g3m5gk1fsshimXs7X/KbcO/hWr7FyQLaRWl6w60i+Ymkm32sIA4kAdVv+fqOw8/lKwlxGXUBP0kaXvK7MMu3yLrY4F+5uiWH/jWxSjWn9fMg6nYndmK1NQU45xL5c/uZGB3hbwUF7qBJHCzfNlMMCpXRRBpSJd6vtpm9xkIoeO/eRQeGfjaxyVulygJVkpNg/JbrP9tgDyUzUD/s12+zXJ3v1zMRJSz8Nefb3TxYvt9nAxcePm91CkVhP6e0BYquuIP2bopCR9qS2zMOdoYpUR0SNLyOm9u6tBDK3ixaqvVIwGojnJe4K900AhAWsnnYGLqqBzLegXWzrhqzBwK/X16DKikiM07f5hc6auQBsGp/bLX6oMxMMMtyGp89pd08FmnRuNEoRWeJyuB8OVutSSchF/OJgZPW5VHBUW0MF41j0fkd0KSSAVCC+IkskDTnbqeTpmKAa+5hj5e94b6BAO10tmZ6H0tL+WZ8wAqcOzo7wbPMZ1OXuQJ0DedeMr71VXhK8AyxZ1yhQ2MQnv/27+h3oW8/us1z2Wf+XYNvQfpMHj7/t6Lk8e7BSua0SHd8dxLjixSZO7BltC+a2QymrsBiwWMX2GnSmcTDWdsKEqirFavNzbNz X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: >-----Original Message----- >From: fan >Sent: 24 April 2024 21:26 >To: Shiju Jose >Cc: linux-cxl@vger.kernel.org; linux-acpi@vger.kernel.org; linux- >mm@kvack.org; dan.j.williams@intel.com; dave@stgolabs.net; Jonathan >Cameron ; dave.jiang@intel.com; >alison.schofield@intel.com; vishal.l.verma@intel.com; ira.weiny@intel.com; >linux-edac@vger.kernel.org; linux-kernel@vger.kernel.org; david@redhat.com= ; >Vilas.Sridharan@amd.com; leo.duran@amd.com; Yazen.Ghannam@amd.com; >rientjes@google.com; jiaqiyan@google.com; tony.luck@intel.com; >Jon.Grimm@amd.com; dave.hansen@linux.intel.com; rafael@kernel.org; >lenb@kernel.org; naoya.horiguchi@nec.com; james.morse@arm.com; >jthoughton@google.com; somasundaram.a@hpe.com; >erdemaktas@google.com; pgonda@google.com; duenwen@google.com; >mike.malvestuto@intel.com; gthelen@google.com; >wschwartz@amperecomputing.com; dferguson@amperecomputing.com; >wbs@os.amperecomputing.com; nifan.cxl@gmail.com; tanxiaofei >; Zengtao (B) ; >kangkang.shen@futurewei.com; wanghuiqiang ; >Linuxarm >Subject: Re: [RFC PATCH v8 01/10] ras: scrub: Add scrub subsystem > >On Sat, Apr 20, 2024 at 12:47:10AM +0800, shiju.jose@huawei.com wrote: >> From: Shiju Jose >> >> Add scrub subsystem supports configuring the memory scrubbers in the >> system. The scrub subsystem provides the interface for registering the >> scrub devices. The scrub control attributes are provided to the user >> in /sys/class/ras/rasX/scrub >> >> Co-developed-by: Jonathan Cameron >> Signed-off-by: Jonathan Cameron >> Signed-off-by: Shiju Jose >> --- >> .../ABI/testing/sysfs-class-scrub-configure | 47 +++ >> drivers/ras/Kconfig | 7 + >> drivers/ras/Makefile | 1 + >> drivers/ras/memory_scrub.c | 271 ++++++++++++++++++ >> include/linux/memory_scrub.h | 37 +++ >> 5 files changed, 363 insertions(+) >> create mode 100644 >> Documentation/ABI/testing/sysfs-class-scrub-configure >> create mode 100755 drivers/ras/memory_scrub.c create mode 100755 >> include/linux/memory_scrub.h >> >> diff --git a/Documentation/ABI/testing/sysfs-class-scrub-configure >> b/Documentation/ABI/testing/sysfs-class-scrub-configure >> new file mode 100644 >> index 000000000000..3ed77dbb00ad >> --- /dev/null >> +++ b/Documentation/ABI/testing/sysfs-class-scrub-configure >> @@ -0,0 +1,47 @@ >> +What: /sys/class/ras/ >> +Date: March 2024 >> +KernelVersion: 6.9 >> +Contact: linux-kernel@vger.kernel.org >> +Description: >> + The ras/ class subdirectory belongs to the >> + common ras features such as scrub subsystem. >> + >> +What: /sys/class/ras/rasX/scrub/ >> +Date: March 2024 >> +KernelVersion: 6.9 >> +Contact: linux-kernel@vger.kernel.org >> +Description: >> + The /sys/class/ras/ras{0,1,2,3,...}/scrub directories >> + correspond to each scrub device registered with the >> + scrub subsystem. >> + >> +What: /sys/class/ras/rasX/scrub/name >> +Date: March 2024 >> +KernelVersion: 6.9 >> +Contact: linux-kernel@vger.kernel.org >> +Description: >> + (RO) name of the memory scrubber >> + >> +What: /sys/class/ras/rasX/scrub/enable_background >> +Date: March 2024 >> +KernelVersion: 6.9 >> +Contact: linux-kernel@vger.kernel.org >> +Description: >> + (RW) Enable/Disable background(patrol) scrubbing if supported. >> + >> +What: /sys/class/ras/rasX/scrub/rate_available >> +Date: March 2024 >> +KernelVersion: 6.9 >> +Contact: linux-kernel@vger.kernel.org >> +Description: >> + (RO) Supported range for the scrub rate by the scrubber. >> + The scrub rate represents in hours. >> + >> +What: /sys/class/ras/rasX/scrub/rate >> +Date: March 2024 >> +KernelVersion: 6.9 >> +Contact: linux-kernel@vger.kernel.org >> +Description: >> + (RW) The scrub rate specified and it must be with in the >> + supported range by the scrubber. >> + The scrub rate represents in hours. >> diff --git a/drivers/ras/Kconfig b/drivers/ras/Kconfig index >> fc4f4bb94a4c..181701479564 100644 >> --- a/drivers/ras/Kconfig >> +++ b/drivers/ras/Kconfig >> @@ -46,4 +46,11 @@ config RAS_FMPM >> Memory will be retired during boot time and run time depending on >> platform-specific policies. >> >> +config SCRUB >> + tristate "Memory scrub driver" >> + help >> + This option selects the memory scrub subsystem, supports >> + configuring the parameters of underlying scrubbers in the >> + system for the DRAM memories. >> + >> endif >> diff --git a/drivers/ras/Makefile b/drivers/ras/Makefile index >> 11f95d59d397..89bcf0d84355 100644 >> --- a/drivers/ras/Makefile >> +++ b/drivers/ras/Makefile >> @@ -2,6 +2,7 @@ >> obj-$(CONFIG_RAS) +=3D ras.o >> obj-$(CONFIG_DEBUG_FS) +=3D debugfs.o >> obj-$(CONFIG_RAS_CEC) +=3D cec.o >> +obj-$(CONFIG_SCRUB) +=3D memory_scrub.o >> >> obj-$(CONFIG_RAS_FMPM) +=3D amd/fmpm.o >> obj-y +=3D amd/atl/ >> diff --git a/drivers/ras/memory_scrub.c b/drivers/ras/memory_scrub.c >> new file mode 100755 index 000000000000..7e995380ec3a >> --- /dev/null >> +++ b/drivers/ras/memory_scrub.c >> @@ -0,0 +1,271 @@ >> +// SPDX-License-Identifier: GPL-2.0 >> +/* >> + * Memory scrub subsystem supports configuring the registered >> + * memory scrubbers. >> + * >> + * Copyright (c) 2024 HiSilicon Limited. >> + */ >> + >> +#define pr_fmt(fmt) "MEM SCRUB: " fmt >> + >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> +#include >> + >> +/* memory scrubber config definitions */ #define SCRUB_ID_PREFIX >> +"ras" >> +#define SCRUB_ID_FORMAT SCRUB_ID_PREFIX "%d" >> + >> +static DEFINE_IDA(scrub_ida); >> + >> +struct scrub_device { >> + int id; >> + struct device dev; >> + const struct scrub_ops *ops; >> +}; >> + >> +#define to_scrub_device(d) container_of(d, struct scrub_device, dev) >> +static ssize_t enable_background_store(struct device *dev, >> + struct device_attribute *attr, >> + const char *buf, size_t len) { >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + bool enable; >> + int ret; >> + >> + ret =3D kstrtobool(buf, &enable); >> + if (ret < 0) >> + return ret; >> + >> + ret =3D scrub_dev->ops->set_enabled_bg(dev, enable); >> + if (ret) >> + return ret; >> + >> + return len; >> +} >> + >> +static ssize_t enable_background_show(struct device *dev, >> + struct device_attribute *attr, char *buf) { >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + bool enable; >> + int ret; >> + >> + ret =3D scrub_dev->ops->get_enabled_bg(dev, &enable); >> + if (ret) >> + return ret; >> + >> + return sysfs_emit(buf, "%d\n", enable); } >> + >> +static ssize_t name_show(struct device *dev, >> + struct device_attribute *attr, char *buf) { >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + int ret; >> + >> + ret =3D scrub_dev->ops->get_name(dev, buf); >> + if (ret) >> + return ret; >> + >> + return strlen(buf); >> +} >> + >> +static ssize_t rate_show(struct device *dev, struct device_attribute *a= ttr, >> + char *buf) >> +{ >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + u64 val; >> + int ret; >> + >> + ret =3D scrub_dev->ops->rate_read(dev, &val); >> + if (ret) >> + return ret; >> + >> + return sysfs_emit(buf, "0x%llx\n", val); } >> + >> +static ssize_t rate_store(struct device *dev, struct device_attribute *= attr, >> + const char *buf, size_t len) >> +{ >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + long val; >> + int ret; >> + >> + ret =3D kstrtol(buf, 10, &val); >> + if (ret < 0) >> + return ret; >> + >> + ret =3D scrub_dev->ops->rate_write(dev, val); >> + if (ret) >> + return ret; >> + >> + return len; >> +} >> + >> +static ssize_t rate_available_show(struct device *dev, >> + struct device_attribute *attr, >> + char *buf) >> +{ >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + u64 min_sr, max_sr; >> + int ret; >> + >> + ret =3D scrub_dev->ops->rate_avail_range(dev, &min_sr, &max_sr); >> + if (ret) >> + return ret; >> + >> + return sysfs_emit(buf, "0x%llx-0x%llx\n", min_sr, max_sr); } >> + >> +DEVICE_ATTR_RW(enable_background); >> +DEVICE_ATTR_RO(name); >> +DEVICE_ATTR_RW(rate); >> +DEVICE_ATTR_RO(rate_available); >> + >> +static struct attribute *scrub_attrs[] =3D { >> + &dev_attr_enable_background.attr, >> + &dev_attr_name.attr, >> + &dev_attr_rate.attr, >> + &dev_attr_rate_available.attr, >> + NULL >> +}; >> + >> +static umode_t scrub_attr_visible(struct kobject *kobj, >> + struct attribute *a, int attr_id) { >> + struct device *dev =3D kobj_to_dev(kobj); >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + const struct scrub_ops *ops =3D scrub_dev->ops; >> + >> + if (a =3D=3D &dev_attr_enable_background.attr) { >> + if (ops->set_enabled_bg && ops->get_enabled_bg) >> + return a->mode; >> + if (ops->get_enabled_bg) >> + return 0444; >> + return 0; >> + } >> + if (a =3D=3D &dev_attr_name.attr) >> + return ops->get_name ? a->mode : 0; >> + if (a =3D=3D &dev_attr_rate_available.attr) >> + return ops->rate_avail_range ? a->mode : 0; >> + if (a =3D=3D &dev_attr_rate.attr) { /* Write only makes little sense *= / >> + if (ops->rate_read && ops->rate_write) >> + return a->mode; >> + if (ops->rate_read) >> + return 0444; >> + return 0; >> + } >> + >> + return 0; >> +} >> + >> +static const struct attribute_group scrub_attr_group =3D { >> + .name =3D "scrub", >> + .attrs =3D scrub_attrs, >> + .is_visible =3D scrub_attr_visible, >> +}; >> + >> +static const struct attribute_group *scrub_attr_groups[] =3D { >> + &scrub_attr_group, >> + NULL >> +}; >> + >> +static void scrub_dev_release(struct device *dev) { >> + struct scrub_device *scrub_dev =3D to_scrub_device(dev); >> + >> + ida_free(&scrub_ida, scrub_dev->id); >> + kfree(scrub_dev); >> +} >> + >> +static struct class scrub_class =3D { >> + .name =3D "ras", >> + .dev_groups =3D scrub_attr_groups, >> + .dev_release =3D scrub_dev_release, >> +}; >> + >> +static struct device * >> +scrub_device_register(struct device *parent, void *drvdata, >> + const struct scrub_ops *ops) >> +{ >> + struct scrub_device *scrub_dev; >> + struct device *hdev; >> + int err; >> + >> + scrub_dev =3D kzalloc(sizeof(*scrub_dev), GFP_KERNEL); >> + if (!scrub_dev) >> + return ERR_PTR(-ENOMEM); >> + hdev =3D &scrub_dev->dev; >> + >> + scrub_dev->id =3D ida_alloc(&scrub_ida, GFP_KERNEL); >> + if (scrub_dev->id < 0) { >> + kfree(scrub_dev); >> + return ERR_PTR(-ENOMEM); >> + } >> + >> + scrub_dev->ops =3D ops; >> + hdev->class =3D &scrub_class; >> + hdev->parent =3D parent; >> + dev_set_drvdata(hdev, drvdata); >> + dev_set_name(hdev, SCRUB_ID_FORMAT, scrub_dev->id); > >Need to check the return value of dev_set_name? Will do, though checking return value of dev_set_name() is not common in th= e kernel. > >fan > >> + err =3D device_register(hdev); >> + if (err) { Thanks, Shiju