Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp4074282yba; Sun, 19 May 2019 10:05:41 -0700 (PDT) X-Google-Smtp-Source: APXvYqyulsSH3Jtq0znbYtHF8XWm970yeJZ6yOjdTT8XoJNd4GUktsVwWr6P9B7u6F5d7BBdNy5W X-Received: by 2002:a63:1c10:: with SMTP id c16mr44216606pgc.442.1558285541679; Sun, 19 May 2019 10:05:41 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1558285541; cv=none; d=google.com; s=arc-20160816; b=WsmgF9aBHShy1wiqnjA6ZjsIw4zMFBcHo7kGpVgM6UHOFA9Zy0LP6ShNeOWF5VJZoC 5C0BGCHgOuWrRorefOquJThIPBZbN/INfPb0ES78NKXxVH7BCAqZ/9ipV0adDefeFTrb +YIIqvzLoKN6zxmpQhIVhzeitVsuHWhIbOj9kT9Vv6ZRwJ5Giv1N5jJecIa1sfxmKpa1 82lXUaLAlbg9wQYQh7rSwjObJHdSjOH6r4YafEo+KuCKNoSYv/n7SSoMCdIR86XUdg2Z EzZ0/T5f+gw1vUTDcv0io5oGOCffQ3eWPn3u4cVlTVjAMTLsUcPEcKaBBMq6JOknKTyL vZUA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=1MUML/WO6P/Y7Typ4j8YbaCvRNQ+50j7APjhTGvMt+c=; b=DVAHUwN2eniaQe+E0vP+5/6BDQEKDkMnk+w1eELca9xXppkX+jcx0riORNXSGZfFlI y0tMjm5Mxolmg0d2k8h21+SVjadbqUFrr9aX0aV4qFLQFO3nJkfjOpx9dQj6WL7pzcSI ddvMwsMRYipa8LpDVftLF8oFegEJj3m/LsmnPlG70kCw0gzWi5KKHng4HsortciBgLa1 Kk8nNOlXocsq+J1vLXRWeZb0LArjfPN/AcrnS6LJd3eAu3MTvW3pnshI3Z+cUGPQLYL/ wVGSAu2rDaig1zjUGK0wNUDAQJRmBIScZryYclP+xQ3UQflHo6xIeTTI6NzY9I+/qH7r F3sA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=dUUOM525; 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=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h3si14189052pls.213.2019.05.19.10.05.26; Sun, 19 May 2019 10:05:41 -0700 (PDT) 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=@gmail.com header.s=20161025 header.b=dUUOM525; 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=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726311AbfESREA (ORCPT + 99 others); Sun, 19 May 2019 13:04:00 -0400 Received: from mail-pg1-f193.google.com ([209.85.215.193]:40481 "EHLO mail-pg1-f193.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725777AbfESRD7 (ORCPT ); Sun, 19 May 2019 13:03:59 -0400 Received: by mail-pg1-f193.google.com with SMTP id d30so5605524pgm.7 for ; Sun, 19 May 2019 10:03:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=1MUML/WO6P/Y7Typ4j8YbaCvRNQ+50j7APjhTGvMt+c=; b=dUUOM525VZsC+/o3OpTs+gwFSq8WdJ/iqV9x1Y6KkZ4CFNGxGpVD0/ht8n0MY5+FPM p9Bt3NwKmQzv9+br+sBhHKOrowzEOMKtUQuecLDIqcQATgMIt+OaCDy07rVsj24dn1VG Gox9DyITVn5KWfZua/K9nIB3ema+EtCJ6BAtgorMHjgjF3EwRbwd9MfV/Vr5Dg+XKuf4 MIjMN1PR5/0t289K5Bkrmg5DrNfWwW+IK2edVF4wzzjqEyCTbaQetEkZnI0ibFZkM0mN z4izxiTpa0hz5V2rKuRUR746k0wxIlDVRd0V91i2b56c8ZaDtldAWa6/4hF0JcSFh1GM 9aIA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=1MUML/WO6P/Y7Typ4j8YbaCvRNQ+50j7APjhTGvMt+c=; b=tz2Y0oMqavYAO6X2m1OeEGqcH52+4V64Mq+BGkTyV+tAEbfNLza3KQSF+hgrQUTgoK P7prKrvb/yot3gQt1cjFst9Pv0woO43Vlndt4ix3PmPZNiEdTbuvpXH0VQ7Yg4iJc3G+ CdPX06hC3WFN5qg/JmZ3vWe5zfwsi5lXXBC0yfZ4l/gacv1QpRlW7qJAzMFvk9mhvbO/ UOP3TWW5ABle32xWIE+sTkpALcY79sA3sDNhMo6T2c0Q3xCt7IN8db6GWSLBgDvG1KYT Wl54LNaZaBUgDCS5QnHYmwS2O4L1b+oI8kSYLeaU265+lV8P1wn1q4nQBS7p6x+1pSSH MmVA== X-Gm-Message-State: APjAAAUUfEGsBqsNZrW8Lp/Hlz3zbSftsPqoZK0ePEiGj5eA3d+tHPVL iD3krahY6SfzKthBHirLQ7yZ1rmb X-Received: by 2002:a63:7c6:: with SMTP id 189mr69588731pgh.247.1558278446449; Sun, 19 May 2019 08:07:26 -0700 (PDT) Received: from mita-MS-7A45.lan ([240f:34:212d:1:5085:bb4a:e3a8:fc9d]) by smtp.gmail.com with ESMTPSA id g17sm2441105pfb.56.2019.05.19.08.07.23 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 19 May 2019 08:07:26 -0700 (PDT) From: Akinobu Mita To: linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org Cc: Akinobu Mita , Johannes Berg , Keith Busch , Jens Axboe , Christoph Hellwig , Sagi Grimberg , Minwoo Im , Kenneth Heitke , Chaitanya Kulkarni Subject: [PATCH v4 4/7] nvme: add basic facilities to get telemetry log page Date: Mon, 20 May 2019 00:06:55 +0900 Message-Id: <1558278418-5702-5-git-send-email-akinobu.mita@gmail.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1558278418-5702-1-git-send-email-akinobu.mita@gmail.com> References: <1558278418-5702-1-git-send-email-akinobu.mita@gmail.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This adds the required facilities to get telemetry log page. The telemetry log page structure and identifier are copied from nvme-cli. We need a facility to check log page attributes in order to know the controller supports the telemetry log pages and log page offset field for the Get Log Page command. The telemetry data area could be larger than maximum data transfer size, so we may need to split into multiple transfers with incremental page offset. Cc: Johannes Berg Cc: Keith Busch Cc: Jens Axboe Cc: Christoph Hellwig Cc: Sagi Grimberg Cc: Minwoo Im Cc: Kenneth Heitke Cc: Chaitanya Kulkarni Signed-off-by: Akinobu Mita --- * v4 - Add nvme_get_telemetry_log() to nvme core module. - Copy struct nvme_telemetry_log_page_hdr from the latest nvme-cli drivers/nvme/host/core.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++ drivers/nvme/host/nvme.h | 3 +++ include/linux/nvme.h | 32 ++++++++++++++++++++++++++ 3 files changed, 94 insertions(+) diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index 7da80f3..d352145 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -2464,6 +2464,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, return nvme_submit_sync_cmd(ctrl->admin_q, &c, log, size); } +EXPORT_SYMBOL_GPL(nvme_get_log); static int nvme_get_effects_log(struct nvme_ctrl *ctrl) { @@ -2484,6 +2485,62 @@ static int nvme_get_effects_log(struct nvme_ctrl *ctrl) return ret; } +static int nvme_get_log_blocks(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, + u8 lsp, void *buf, size_t bytes, loff_t offset) +{ + loff_t pos = 0; + u32 chunk_size; + + if (check_mul_overflow(ctrl->max_hw_sectors, 512u, &chunk_size)) + chunk_size = UINT_MAX; + + while (pos < bytes) { + size_t size = min_t(size_t, bytes - pos, chunk_size); + int ret; + + if ((offset + pos) && + !(ctrl->lpa & NVME_CTRL_LPA_EXTENDED_DATA)) + return -EINVAL; + + ret = nvme_get_log(ctrl, nsid, log_page, lsp, buf + pos, size, + offset + pos); + if (ret) + return ret; + + pos += size; + } + + return 0; +} + +int nvme_get_telemetry_log(struct nvme_ctrl *ctrl, struct bio_vec *bvecs, + size_t bytes) +{ + struct bvec_iter iter = { + .bi_size = bytes, + }; + size_t offset = 0; + + while (iter.bi_size) { + struct bio_vec bvec = mp_bvec_iter_bvec(bvecs, iter); + size_t size = min(iter.bi_size, bvec.bv_len); + void *buf = page_address(bvec.bv_page) + bvec.bv_offset; + int ret; + + ret = nvme_get_log_blocks(ctrl, NVME_NSID_ALL, + NVME_LOG_TELEMETRY_CTRL, 0, buf, size, + offset); + if (ret) + return ret; + + offset += size; + bvec_iter_advance(bvecs, &iter, size); + } + + return 0; +} +EXPORT_SYMBOL_GPL(nvme_get_telemetry_log); + /* * Initialize the cached copies of the Identify data and various controller * register in our nvme_ctrl structure. This should be called as soon as @@ -2587,6 +2644,7 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) } else ctrl->shutdown_timeout = shutdown_timeout; + ctrl->lpa = id->lpa; ctrl->npss = id->npss; ctrl->apsta = id->apsta; prev_apst_enabled = ctrl->apst_enabled; @@ -3899,6 +3957,7 @@ static inline void _nvme_check_size(void) BUILD_BUG_ON(sizeof(struct nvme_id_ctrl) != NVME_IDENTIFY_DATA_SIZE); BUILD_BUG_ON(sizeof(struct nvme_id_ns) != NVME_IDENTIFY_DATA_SIZE); BUILD_BUG_ON(sizeof(struct nvme_lba_range_type) != 64); + BUILD_BUG_ON(sizeof(struct nvme_telemetry_log_page_hdr) != 512); BUILD_BUG_ON(sizeof(struct nvme_smart_log) != 512); BUILD_BUG_ON(sizeof(struct nvme_dbbuf) != 64); BUILD_BUG_ON(sizeof(struct nvme_directive_cmd) != 64); diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 5ee75b5..56bba7a 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -195,6 +195,7 @@ struct nvme_ctrl { u32 vs; u32 sgls; u16 kas; + u8 lpa; u8 npss; u8 apsta; u32 oaes; @@ -466,6 +467,8 @@ int nvme_delete_ctrl(struct nvme_ctrl *ctrl); int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, void *log, size_t size, u64 offset); +int nvme_get_telemetry_log(struct nvme_ctrl *ctrl, struct bio_vec *bvecs, + size_t bytes); extern const struct attribute_group *nvme_ns_id_attr_groups[]; extern const struct block_device_operations nvme_ns_head_ops; diff --git a/include/linux/nvme.h b/include/linux/nvme.h index 8028ada..658ac75 100644 --- a/include/linux/nvme.h +++ b/include/linux/nvme.h @@ -294,6 +294,8 @@ enum { NVME_CTRL_OACS_DIRECTIVES = 1 << 5, NVME_CTRL_OACS_DBBUF_SUPP = 1 << 8, NVME_CTRL_LPA_CMD_EFFECTS_LOG = 1 << 1, + NVME_CTRL_LPA_EXTENDED_DATA = 1 << 2, + NVME_CTRL_LPA_TELEMETRY_LOG = 1 << 3, }; struct nvme_lbaf { @@ -396,6 +398,35 @@ enum { NVME_NIDT_UUID = 0x03, }; +/** + * struct nvme_telemetry_log_page_hdr - structure for telemetry log page + * @lpi: Log page identifier + * @iee_oui: IEEE OUI Identifier + * @dalb1: Data area 1 last block + * @dalb2: Data area 2 last block + * @dalb3: Data area 3 last block + * @ctrlavail: Controller initiated data available + * @ctrldgn: Controller initiated telemetry Data Generation Number + * @rsnident: Reason Identifier + * @telemetry_dataarea: Contains telemetry data block + * + * This structure can be used for both telemetry host-initiated log page + * and controller-initiated log page. + */ +struct nvme_telemetry_log_page_hdr { + __u8 lpi; + __u8 rsvd[4]; + __u8 iee_oui[3]; + __le16 dalb1; + __le16 dalb2; + __le16 dalb3; + __u8 rsvd1[368]; + __u8 ctrlavail; + __u8 ctrldgn; + __u8 rsnident[128]; + __u8 telemetry_dataarea[0]; +}; + struct nvme_smart_log { __u8 critical_warning; __u8 temperature[2]; @@ -832,6 +863,7 @@ enum { NVME_LOG_FW_SLOT = 0x03, NVME_LOG_CHANGED_NS = 0x04, NVME_LOG_CMD_EFFECTS = 0x05, + NVME_LOG_TELEMETRY_CTRL = 0x08, NVME_LOG_ANA = 0x0c, NVME_LOG_DISC = 0x70, NVME_LOG_RESERVATION = 0x80, -- 2.7.4