From patchwork Wed Jan 16 17:57:58 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Busch X-Patchwork-Id: 10766607 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id D938D13B4 for ; Wed, 16 Jan 2019 17:59:58 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C7F622F0EC for ; Wed, 16 Jan 2019 17:59:58 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id BC6192F0F2; Wed, 16 Jan 2019 17:59:58 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-2.9 required=2.0 tests=BAYES_00,MAILING_LIST_MULTI, RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2C8732F0EC for ; Wed, 16 Jan 2019 17:59:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9FF5F8E000B; Wed, 16 Jan 2019 12:59:43 -0500 (EST) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 9AFF38E0006; Wed, 16 Jan 2019 12:59:43 -0500 (EST) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 828AA8E000B; Wed, 16 Jan 2019 12:59:43 -0500 (EST) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pg1-f199.google.com (mail-pg1-f199.google.com [209.85.215.199]) by kanga.kvack.org (Postfix) with ESMTP id 336458E0006 for ; Wed, 16 Jan 2019 12:59:43 -0500 (EST) Received: by mail-pg1-f199.google.com with SMTP id d3so4309772pgv.23 for ; Wed, 16 Jan 2019 09:59:43 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-original-authentication-results:x-gm-message-state:from:to:cc :subject:date:message-id:in-reply-to:references; bh=AYtf+RckJM8KVQDjGkv2FMQzQJ1RDITzHw0rToiBHM8=; b=WH2uTNJWcIoVgiMAGQDd4eIrfZ6PeOGjtg6BWP5AiktDb23iTifLYWq0VFNwMWYtIx USjD122E1/nDEQurAvO/p4WlKoFbRMHzvljnLeCsE6j6/YSjHeUjjt8IImMXBOCv7ykC vIJRvd4VENdX/yFfTWyaXnl6DaMJCjW3SLX41b7518D6LguinlpDB1sXcF6BJQXRZp8C qOWSqPMGbumdEs7rRzGljcgeS0+ThSaVNpHJwcLIgPaf8/J7YNsW2QzkgsfXnww00FYn 3FwNHLBYGOnI6VpSVtpvsXWfklbuzg7Fb4Hts3eK1KJS6euV0+ZBJ6+EraJ1amC+HFpG Z/Jw== X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of keith.busch@intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=keith.busch@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Gm-Message-State: AJcUukeSQUO8kgCv4ySx+3dC7Oo0dyaN9SZXuAiU6S5ikfhUwMWC7/Yn bgFYHOJl6kv9LbzW5Yjebj7XvMCYqn4zatHOl/beRtKFgXHo9o+cZhA9FbooU89z4ukPCa/yNlf beDI7QuQnS4hzvTtrEYUv0P52TPeJkecfNCMSa8TVg1ivSwjBMzHyeagbCX2Aq+ZEeQ== X-Received: by 2002:a63:235f:: with SMTP id u31mr9946777pgm.122.1547661582816; Wed, 16 Jan 2019 09:59:42 -0800 (PST) X-Google-Smtp-Source: ALg8bN7KOHSjYcpfdETysYhFTYl/D8t9HxuCrXwNI9BC500GUnlbTFOJjXdXA8JemWifeTDMv8Ev X-Received: by 2002:a63:235f:: with SMTP id u31mr9946705pgm.122.1547661581547; Wed, 16 Jan 2019 09:59:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1547661581; cv=none; d=google.com; s=arc-20160816; b=NSqXwhzhXa4lAf4JKczfrFfQ4dDhSEPJguWRLhSDXK6+qsjaMvXQIhoHD1mMHqlda3 v/Vxzc4atZnFQPmU+hwxbTRdke5yMbLhs3kEJJaQudr71hy/gjNgTYYfgcKozCN+wevS YGxKcd9j5Z4OW7XRaqDFU8VjYXt3MdRC8/gTfVrjXt0PluO+3Im1CPHqhnOiYmyNPpaw Fa7384c0dyPLR65luyaQm1zyr9P7rqKyPA3KM+rvW2h2nFPllSQI+XAVdAiasNIpqQP4 PJCKopR987AALtaOBsebBcguC0goIbykxBuxfdN/hoey6XsB5D8iKrRh4AC/gYzm3UgV Sucw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from; bh=AYtf+RckJM8KVQDjGkv2FMQzQJ1RDITzHw0rToiBHM8=; b=qUTOaImE8T+WDkcAIeZ3710kNxc4IKoXsgoV3LhqjSYivuMEMgt92SWq0Ys5JJ+QfV ODPla2kwmnCkWn9/WdqwVQylbWrvJAj4UhPclZjDv7yoBGQijsGQQMi8PBq4VYxHKQby 1m+VOC5n5E5U+3A7fWCK5T//FyiDW7yViGVn8mhJO3GhG/WyxCwmBS4HEUJg4d2Duh84 CX+BiRjJYlOgijXIyOn/KEu2xCtSZmZDjiiaACxjvbuq5JU6ULJdAWDDj9rkdcvWB9n0 lPc38BAvHn098qWjoP5ME5a9GXVbTs+ckU49O57hv2wyI609zLBbUJiLm04XMqCGCuio 3UCQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of keith.busch@intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=keith.busch@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from mga01.intel.com (mga01.intel.com. [192.55.52.88]) by mx.google.com with ESMTPS id d18si6701527pgm.212.2019.01.16.09.59.41 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 16 Jan 2019 09:59:41 -0800 (PST) Received-SPF: pass (google.com: domain of keith.busch@intel.com designates 192.55.52.88 as permitted sender) client-ip=192.55.52.88; Authentication-Results: mx.google.com; spf=pass (google.com: domain of keith.busch@intel.com designates 192.55.52.88 as permitted sender) smtp.mailfrom=keith.busch@intel.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Jan 2019 09:59:39 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,487,1539673200"; d="scan'208";a="117227791" Received: from unknown (HELO localhost.lm.intel.com) ([10.232.112.69]) by fmsmga008.fm.intel.com with ESMTP; 16 Jan 2019 09:59:39 -0800 From: Keith Busch To: linux-kernel@vger.kernel.org, linux-acpi@vger.kernel.org, linux-mm@kvack.org Cc: Greg Kroah-Hartman , Rafael Wysocki , Dave Hansen , Dan Williams , Keith Busch Subject: [PATCHv4 07/13] node: Add heterogenous memory access attributes Date: Wed, 16 Jan 2019 10:57:58 -0700 Message-Id: <20190116175804.30196-8-keith.busch@intel.com> X-Mailer: git-send-email 2.13.6 In-Reply-To: <20190116175804.30196-1-keith.busch@intel.com> References: <20190116175804.30196-1-keith.busch@intel.com> 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: X-Virus-Scanned: ClamAV using ClamSMTP Heterogeneous memory systems provide memory nodes with different latency and bandwidth performance attributes. Provide a new kernel interface for subsystems to register the attributes under the memory target node's initiator access class. If the system provides this information, applications may query these attributes when deciding which node to request memory. The following example shows the new sysfs hierarchy for a node exporting performance attributes: # tree -P "read*|write*" /sys/devices/system/node/nodeY/classZ/ /sys/devices/system/node/nodeY/classZ/ |-- read_bandwidth |-- read_latency |-- write_bandwidth `-- write_latency The bandwidth is exported as MB/s and latency is reported in nanoseconds. Memory accesses from an initiator node that is not one of the memory's class "Z" initiator nodes may encounter different performance than reported here. When a subsystem makes use of this interface, initiators of a lower class number, "Z", have better performance relative to higher class numbers. When provided, class 0 is the highest performing access class. Signed-off-by: Keith Busch --- drivers/base/Kconfig | 8 ++++++++ drivers/base/node.c | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ include/linux/node.h | 25 +++++++++++++++++++++++++ 3 files changed, 81 insertions(+) diff --git a/drivers/base/Kconfig b/drivers/base/Kconfig index 3e63a900b330..6014980238e8 100644 --- a/drivers/base/Kconfig +++ b/drivers/base/Kconfig @@ -149,6 +149,14 @@ config DEBUG_TEST_DRIVER_REMOVE unusable. You should say N here unless you are explicitly looking to test this functionality. +config HMEM_REPORTING + bool + default y + depends on NUMA + help + Enable reporting for heterogenous memory access attributes under + their non-uniform memory nodes. + source "drivers/base/test/Kconfig" config SYS_HYPERVISOR diff --git a/drivers/base/node.c b/drivers/base/node.c index 1da5072116ab..1e909f61e8b1 100644 --- a/drivers/base/node.c +++ b/drivers/base/node.c @@ -66,6 +66,9 @@ struct node_class_nodes { unsigned class; nodemask_t initiator_nodes; nodemask_t target_nodes; +#ifdef CONFIG_HMEM_REPORTING + struct node_hmem_attrs hmem_attrs; +#endif }; #define to_class_nodes(dev) container_of(dev, struct node_class_nodes, dev) @@ -145,6 +148,51 @@ static struct node_class_nodes *node_init_node_class(struct device *parent, return NULL; } +#ifdef CONFIG_HMEM_REPORTING +#define ACCESS_ATTR(name) \ +static ssize_t name##_show(struct device *dev, \ + struct device_attribute *attr, \ + char *buf) \ +{ \ + return sprintf(buf, "%u\n", to_class_nodes(dev)->hmem_attrs.name); \ +} \ +static DEVICE_ATTR_RO(name); + +ACCESS_ATTR(read_bandwidth) +ACCESS_ATTR(read_latency) +ACCESS_ATTR(write_bandwidth) +ACCESS_ATTR(write_latency) + +static struct attribute *access_attrs[] = { + &dev_attr_read_bandwidth.attr, + &dev_attr_read_latency.attr, + &dev_attr_write_bandwidth.attr, + &dev_attr_write_latency.attr, + NULL, +}; +ATTRIBUTE_GROUPS(access); + +void node_set_perf_attrs(unsigned int nid, struct node_hmem_attrs *hmem_attrs, + unsigned class) +{ + struct node_class_nodes *c; + struct node *node; + + if (WARN_ON_ONCE(!node_online(nid))) + return; + + node = node_devices[nid]; + c = node_init_node_class(&node->dev, &node->class_list, class); + if (!c) + return; + + c->hmem_attrs = *hmem_attrs; + if (sysfs_create_groups(&c->dev.kobj, access_groups)) + pr_info("failed to add performance attribute group to node %d\n", + nid); +} +#endif + #define K(x) ((x) << (PAGE_SHIFT - 10)) static ssize_t node_read_meminfo(struct device *dev, struct device_attribute *attr, char *buf) diff --git a/include/linux/node.h b/include/linux/node.h index 8e3666c12ef2..e22940a593c2 100644 --- a/include/linux/node.h +++ b/include/linux/node.h @@ -20,6 +20,31 @@ #include #include +#ifdef CONFIG_HMEM_REPORTING +/** + * struct node_hmem_attrs - heterogeneous memory performance attributes + * + * @read_bandwidth: Read bandwidth in MB/s + * @write_bandwidth: Write bandwidth in MB/s + * @read_latency: Read latency in nanoseconds + * @write_latency: Write latency in nanoseconds + */ +struct node_hmem_attrs { + unsigned int read_bandwidth; + unsigned int write_bandwidth; + unsigned int read_latency; + unsigned int write_latency; +}; +void node_set_perf_attrs(unsigned int nid, struct node_hmem_attrs *hmem_attrs, + unsigned class); +#else +static inline void node_set_perf_attrs(unsigned int nid, + struct node_hmem_attrs *hmem_attrs, + unsigned class) +{ +} +#endif + struct node { struct device dev; struct list_head class_list;