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 X-Spam-Level: X-Spam-Status: No, score=-9.8 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1021ACA9EAF for ; Mon, 28 Oct 2019 02:42:16 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id D126D20663 for ; Mon, 28 Oct 2019 02:42:15 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="OC465cII"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l4s4ZIQk" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D126D20663 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=roeck-us.net Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:Message-Id:Date:Subject:To :From:Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:In-Reply-To:References: List-Owner; bh=JH77dnrQCQOiTYWjbdUX+hHh6mrAdwWoZeZEkIpwTko=; b=OC465cIIm9M7fa GUt9I9c47ZNHXVZbUtqqWk5U1DI/jEDNM7TCDL1Z6fPs187UhmBq76bsMKlvPYftt/zsCTYV4KiSz nux9yWyZUe2U0D2IifEZ+sj/UxZsjdQpuUhIpdTvOuJGPcz5f23vm8D6Z7zHSOQ9dSaxWNZPb4yXo zzvqyA3qrQgDz6O9Xfs5TboBNzdj1INirk2c9M742yhCaxtXAsfflOJYYX59fbZtJeRMV0sv27ClK QA5+NtYRjQgaaTWCUPJWwLc8DUiVHl8IfpaRb1JVsHmEpfGW7g3tDt4/a3kDrP/msB2WUtYq9Vdpq NogJL+zFqzX0kvWpGQTQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iOuyv-0006s4-FH; Mon, 28 Oct 2019 02:42:09 +0000 Received: from mail-pg1-x542.google.com ([2607:f8b0:4864:20::542]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iOuys-0006rb-Hb for linux-nvme@lists.infradead.org; Mon, 28 Oct 2019 02:42:08 +0000 Received: by mail-pg1-x542.google.com with SMTP id u23so5827156pgo.0 for ; Sun, 27 Oct 2019 19:42:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=IHo87aCT9Nc2PcJUEez5RtI7+H0wP6kuybDY/vHDZKg=; b=l4s4ZIQkFGM+FK89CM1vHnNg5C4XoK0JtLRFlXftxdKnJaMSUJ9j2pkqr2FvJirSNN fayOZ1o1vdh54VQDdwvKb8zrpTybf6ijXyCg3Up4VgSbPdNnirnh7gnos+4GxfstitgK /p7SZE1fkjbC8x12TiswGQh+atC2yDvGcUWds4pPCH5kpjuUktq8w5W4K25QyMIa9aMi IuAWmBvjvfnn0icGx+B+p0mzPlHLuJZFewgh9uJiur9uvKT9Po4CQUREFRRwpBLPDeGa AcMv9snmpvpB+a5LZkGIwKyOveuqhbCHe34GKeoYWM40EW8VZhcM00D5Qv8SDzeGxvmU Y+5A== 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 :mime-version:content-transfer-encoding; bh=IHo87aCT9Nc2PcJUEez5RtI7+H0wP6kuybDY/vHDZKg=; b=fo8PQpmFuzIBUrJguBKzWyeseJN+0ZxKT4fZ+ux5IDoyDLNXe+SON3SLl+hRDyP1tP AOngGLBVg5YERFfj/hRammfJ7asDk6kocdmeAIZ7s1kZuzh4/GSS3J/JFl+ZszkS69bv lZ2ZclKYddaupbw3XEfPZJXQHAUDvpNfIX3etvXW3IWqfUsuAGBOSD52cJgqLnjAn5FY AyT1041Dx5oe/zmakR17hwZdtwCdWJeU876F65piCG9DyHNeMHaRtoBinLzA9JFamMLQ vE8R90PC13MpnMb8sNczZCeHNfaX32o4Eh+vnHBcjYX4w4H3hKglWrbG5eV+PYv5DKR4 Dfug== X-Gm-Message-State: APjAAAViP7/SmfIMzhJNZfHULRWEIZ62jT/XV/b9BcQdxLwS1XmRRP8l Ugxy7g1IWJ5FNXAcGkoKL9Y= X-Google-Smtp-Source: APXvYqxzKe6K74wfzZdBgPWnxo11B0T0iIlKxIeWE/Nb1aJu8Ne9qYIAo/ws+sUYUT8CYUv0C2OXsg== X-Received: by 2002:a17:90a:1424:: with SMTP id j33mr4896492pja.2.1572230522865; Sun, 27 Oct 2019 19:42:02 -0700 (PDT) Received: from localhost ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id s8sm895905pfh.105.2019.10.27.19.42.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 27 Oct 2019 19:42:02 -0700 (PDT) From: Guenter Roeck To: Keith Busch Subject: [PATCH] nvme: Add hardware monitoring support Date: Sun, 27 Oct 2019 19:41:56 -0700 Message-Id: <20191028024156.23964-1-linux@roeck-us.net> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191027_194206_609878_BB2CA8A7 X-CRM114-Status: GOOD ( 22.13 ) X-BeenThere: linux-nvme@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Sagi Grimberg , linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, Jens Axboe , Chris Healy , Christoph Hellwig , Guenter Roeck Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "Linux-nvme" Errors-To: linux-nvme-bounces+linux-nvme=archiver.kernel.org@lists.infradead.org bnZtZSBkZXZpY2VzIHJlcG9ydCB0ZW1wZXJhdHVyZSBpbmZvcm1hdGlvbiBpbiB0aGUgY29udHJv bGxlciBpbmZvcm1hdGlvbgooZm9yIGxpbWl0cykgYW5kIGluIHRoZSBzbWFydCBsb2cuIEN1cnJl bnRseSwgdGhlIG9ubHkgbWVhbnMgdG8gcmV0cmlldmUKdGhpcyBpbmZvcm1hdGlvbiBpcyB0aGUg bnZtZSBjb21tYW5kIGxpbmUgaW50ZXJmYWNlLCB3aGljaCByZXF1aXJlcwpzdXBlci11c2VyIHBy aXZpbGVnZXMuCgpBdCB0aGUgc2FtZSB0aW1lLCBpdCB3b3VsZCBiZSBkZXNpcmFibGUgdG8gdXNl IE5WTUUgdGVtcGVyYXR1cmUgaW5mb3JtYXRpb24KZm9yIHRoZXJtYWwgY29udHJvbC4KClRoaXMg cGF0Y2ggYWRkcyBzdXBwb3J0IHRvIHJlYWQgTlZNRSB0ZW1wZXJhdHVyZXMgZnJvbSB0aGUga2Vy bmVsIHVzaW5nIHRoZQpod21vbiBBUEkgYW5kIGFkZHMgdGVtcGVyYXR1cmUgem9uZXMgZm9yIE5W TUUgZHJpdmVzLiBUaGUgdGhlcm1hbCBzdWJzeXN0ZW0KY2FuIHVzZSB0aGlzIGluZm9ybWF0aW9u IHRvIHNldCB0aGVybWFsIHBvbGljaWVzLCBhbmQgdXNlcnNwYWNlIGNhbiBhY2Nlc3MKaXQgdXNp bmcgbGlic2Vuc29ycyBhbmQvb3IgdGhlICJzZW5zb3JzIiBjb21tYW5kLgoKRXhhbXBsZSBvdXRw dXQgZnJvbSB0aGUgInNlbnNvcnMiIGNvbW1hbmQ6Cgpudm1lMC1wY2ktMDEwMApBZGFwdGVyOiBQ Q0kgYWRhcHRlcgpDb21wb3NpdGU6ICAgICszOS4wwrBDICAoaGlnaCA9ICs4NS4wwrBDLCBjcml0 ID0gKzg1LjDCsEMpClNlbnNvciAxOiAgICAgKzM5LjDCsEMKU2Vuc29yIDI6ICAgICArNDEuMMKw QwoKU2lnbmVkLW9mZi1ieTogR3VlbnRlciBSb2VjayA8bGludXhAcm9lY2stdXMubmV0PgotLS0K IGRyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcgICAgICB8ICAxMCArKysKIGRyaXZlcnMvbnZtZS9o b3N0L01ha2VmaWxlICAgICB8ICAgMSArCiBkcml2ZXJzL252bWUvaG9zdC9jb3JlLmMgICAgICAg fCAgIDUgKysKIGRyaXZlcnMvbnZtZS9ob3N0L252bWUtaHdtb24uYyB8IDE2MCArKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvbnZtZS9ob3N0L252bWUuaCAgICAgICB8 ICAgOCArKwogNSBmaWxlcyBjaGFuZ2VkLCAxODQgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvbnZtZS9ob3N0L252bWUtaHdtb24uYwoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvbnZtZS9ob3N0L0tjb25maWcgYi9kcml2ZXJzL252bWUvaG9zdC9LY29uZmlnCmluZGV4IDJi MzZmMDUyYmZiOS4uYWViNDllMTZlMzg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL252bWUvaG9zdC9L Y29uZmlnCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L0tjb25maWcKQEAgLTIzLDYgKzIzLDE2IEBA IGNvbmZpZyBOVk1FX01VTFRJUEFUSAogCSAgIC9kZXYvbnZtZVhuWSBkZXZpY2Ugd2lsbCBzaG93 IHVwIGZvciBlYWNoIE5WTWUgbmFtZXNwYWNlcywKIAkgICBldmVuIGlmIGl0IGlzIGFjY2Vzc2li bGUgdGhyb3VnaCBtdWx0aXBsZSBjb250cm9sbGVycy4KIAorY29uZmlnIE5WTUVfSFdNT04KKwli b29sICJOVk1FIGhhcmR3YXJlIG1vbml0b3JpbmciCisJZGVwZW5kcyBvbiAoTlZNRV9DT1JFPXkg JiYgSFdNT049eSkgfHwgKE5WTUVfQ09SRT1tICYmIEhXTU9OKQorCWhlbHAKKwkgIFRoaXMgcHJv dmlkZXMgc3VwcG9ydCBmb3IgTlZNRSBoYXJkd2FyZSBtb25pdG9yaW5nLiBJZiBlbmFibGVkLAor CSAgYSBoYXJkd2FyZSBtb25pdG9yaW5nIGRldmljZSB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2gg TlZNRSBkcml2ZQorCSAgaW4gdGhlIHN5c3RlbS4KKworCSAgSWYgdW5zdXJlLCBzYXkgTi4KKwog Y29uZmlnIE5WTUVfRkFCUklDUwogCXRyaXN0YXRlCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZt ZS9ob3N0L01ha2VmaWxlIGIvZHJpdmVycy9udm1lL2hvc3QvTWFrZWZpbGUKaW5kZXggOGE0YjY3 MWM1ZjBjLi4wM2RlNDc5N2E4NzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L01ha2Vm aWxlCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L01ha2VmaWxlCkBAIC0xNCw2ICsxNCw3IEBAIG52 bWUtY29yZS0kKENPTkZJR19UUkFDSU5HKQkJKz0gdHJhY2UubwogbnZtZS1jb3JlLSQoQ09ORklH X05WTUVfTVVMVElQQVRIKQkrPSBtdWx0aXBhdGgubwogbnZtZS1jb3JlLSQoQ09ORklHX05WTSkJ CQkrPSBsaWdodG52bS5vCiBudm1lLWNvcmUtJChDT05GSUdfRkFVTFRfSU5KRUNUSU9OX0RFQlVH X0ZTKQkrPSBmYXVsdF9pbmplY3QubworbnZtZS1jb3JlLSQoQ09ORklHX05WTUVfSFdNT04pCQkr PSBudm1lLWh3bW9uLm8KIAogbnZtZS15CQkJCQkrPSBwY2kubwogCmRpZmYgLS1naXQgYS9kcml2 ZXJzL252bWUvaG9zdC9jb3JlLmMgYi9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKaW5kZXggZmE3 YmEwOWRjYTc3Li5mYzFkNGIxNDY3MTcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvbnZtZS9ob3N0L2Nv cmUuYworKysgYi9kcml2ZXJzL252bWUvaG9zdC9jb3JlLmMKQEAgLTI3OTYsNiArMjc5Niw5IEBA IGludCBudm1lX2luaXRfaWRlbnRpZnkoc3RydWN0IG52bWVfY3RybCAqY3RybCkKIAljdHJsLT5v bmNzID0gbGUxNl90b19jcHUoaWQtPm9uY3MpOwogCWN0cmwtPm10ZmEgPSBsZTE2X3RvX2NwdShp ZC0+bXRmYSk7CiAJY3RybC0+b2FlcyA9IGxlMzJfdG9fY3B1KGlkLT5vYWVzKTsKKwljdHJsLT53 Y3RlbXAgPSBsZTE2X3RvX2NwdShpZC0+d2N0ZW1wKTsKKwljdHJsLT5jY3RlbXAgPSBsZTE2X3Rv X2NwdShpZC0+Y2N0ZW1wKTsKKwogCWF0b21pY19zZXQoJmN0cmwtPmFib3J0X2xpbWl0LCBpZC0+ YWNsICsgMSk7CiAJY3RybC0+dndjID0gaWQtPnZ3YzsKIAlpZiAoaWQtPm1kdHMpCkBAIC0yODk3 LDYgKzI5MDAsOCBAQCBpbnQgbnZtZV9pbml0X2lkZW50aWZ5KHN0cnVjdCBudm1lX2N0cmwgKmN0 cmwpCiAKIAljdHJsLT5pZGVudGlmaWVkID0gdHJ1ZTsKIAorCW52bWVfaHdtb25faW5pdChjdHJs KTsKKwogCXJldHVybiAwOwogCiBvdXRfZnJlZToKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZtZS9o b3N0L252bWUtaHdtb24uYyBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUtaHdtb24uYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmYxOTA5OGJjMzIyOAotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUtaHdtb24uYwpAQCAtMCwwICsxLDE2MCBA QAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAKKy8qCisgKiBOVk0gRXhwcmVz cyBoYXJkd2FyZSBtb25pdG9yaW5nIHN1cHBvcnQKKyAqIENvcHlyaWdodCAoYykgMjAxOSwgR3Vl bnRlciBSb2VjaworICovCisKKyNpbmNsdWRlIDxsaW51eC9od21vbi5oPgorCisjaW5jbHVkZSAi bnZtZS5oIgorCitzdHJ1Y3QgbnZtZV9od21vbl9kYXRhIHsKKwlzdHJ1Y3QgbnZtZV9jdHJsICpj dHJsOworCXN0cnVjdCBudm1lX3NtYXJ0X2xvZyBsb2c7Cit9OworCitzdGF0aWMgaW50IG52bWVf aHdtb25fZ2V0X3NtYXJ0X2xvZyhzdHJ1Y3QgbnZtZV9od21vbl9kYXRhICpkYXRhKQoreworCXJl dHVybiBudm1lX2dldF9sb2coZGF0YS0+Y3RybCwgTlZNRV9OU0lEX0FMTCwgTlZNRV9MT0dfU01B UlQsIDAsCisJCQkgICAgJmRhdGEtPmxvZywgc2l6ZW9mKGRhdGEtPmxvZyksIDApOworfQorCitz dGF0aWMgaW50IG52bWVfaHdtb25fcmVhZChzdHJ1Y3QgZGV2aWNlICpkZXYsIGVudW0gaHdtb25f c2Vuc29yX3R5cGVzIHR5cGUsCisJCQkgICB1MzIgYXR0ciwgaW50IGNoYW5uZWwsIGxvbmcgKnZh bCkKK3sKKwlzdHJ1Y3QgbnZtZV9od21vbl9kYXRhICpkYXRhID0gZGV2X2dldF9kcnZkYXRhKGRl dik7CisJc3RydWN0IG52bWVfc21hcnRfbG9nICpsb2cgPSAmZGF0YS0+bG9nOworCWludCBlcnI7 CisJaW50IHRlbXA7CisKKwllcnIgPSBudm1lX2h3bW9uX2dldF9zbWFydF9sb2coZGF0YSk7CisJ aWYgKGVycikKKwkJcmV0dXJuIGVyciA8IDAgPyBlcnIgOiAtRVBST1RPOworCisJc3dpdGNoIChh dHRyKSB7CisJY2FzZSBod21vbl90ZW1wX21heDoKKwkJKnZhbCA9IChkYXRhLT5jdHJsLT53Y3Rl bXAgLSAyNzMpICogMTAwMDsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2NyaXQ6CisJCSp2 YWwgPSAoZGF0YS0+Y3RybC0+Y2N0ZW1wIC0gMjczKSAqIDEwMDA7CisJCWJyZWFrOworCWNhc2Ug aHdtb25fdGVtcF9pbnB1dDoKKwkJaWYgKCFjaGFubmVsKQorCQkJdGVtcCA9IGxlMTZfdG9fY3B1 cCgoX19sZTE2ICopbG9nLT50ZW1wZXJhdHVyZSk7CisJCWVsc2UKKwkJCXRlbXAgPSBsZTE2X3Rv X2NwdShsb2ctPnRlbXBfc2Vuc29yW2NoYW5uZWwgLSAxXSk7CisJCSp2YWwgPSAodGVtcCAtIDI3 MykgKiAxMDAwOworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfY3JpdF9hbGFybToKKwkJKnZh bCA9ICEhKGxvZy0+Y3JpdGljYWxfd2FybmluZyAmIE5WTUVfU01BUlRfQ1JJVF9URU1QRVJBVFVS RSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWVyciA9IC1FT1BOT1RTVVBQOworCQlicmVhazsK Kwl9CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBudm1lX2h3 bW9uX3NlbnNvcl9uYW1lc1tdID0geworCSJDb21wb3NpdGUiLAorCSJTZW5zb3IgMSIsCisJIlNl bnNvciAyIiwKKwkiU2Vuc29yIDMiLAorCSJTZW5zb3IgNCIsCisJIlNlbnNvciA1IiwKKwkiU2Vu c29yIDYiLAorCSJTZW5zb3IgNyIsCisJIlNlbnNvciA4IiwKK307CisKK3N0YXRpYyBpbnQgbnZt ZV9od21vbl9yZWFkX3N0cmluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJICBlbnVtIGh3bW9u X3NlbnNvcl90eXBlcyB0eXBlLCB1MzIgYXR0ciwKKwkJCQkgIGludCBjaGFubmVsLCBjb25zdCBj aGFyICoqc3RyKQoreworCSpzdHIgPSBudm1lX2h3bW9uX3NlbnNvcl9uYW1lc1tjaGFubmVsXTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVtb2RlX3QgbnZtZV9od21vbl9pc192aXNpYmxlKGNv bnN0IHZvaWQgKl9kYXRhLAorCQkJCSAgICAgZW51bSBod21vbl9zZW5zb3JfdHlwZXMgdHlwZSwK KwkJCQkgICAgIHUzMiBhdHRyLCBpbnQgY2hhbm5lbCkKK3sKKwljb25zdCBzdHJ1Y3QgbnZtZV9o d21vbl9kYXRhICpkYXRhID0gX2RhdGE7CisKKwlzd2l0Y2ggKGF0dHIpIHsKKwljYXNlIGh3bW9u X3RlbXBfY3JpdDoKKwkJaWYgKCFjaGFubmVsICYmIGRhdGEtPmN0cmwtPmNjdGVtcCkKKwkJCXJl dHVybiAwNDQ0OworCQlicmVhazsKKwljYXNlIGh3bW9uX3RlbXBfbWF4OgorCQlpZiAoIWNoYW5u ZWwgJiYgZGF0YS0+Y3RybC0+d2N0ZW1wKQorCQkJcmV0dXJuIDA0NDQ7CisJCWJyZWFrOworCWNh c2UgaHdtb25fdGVtcF9jcml0X2FsYXJtOgorCQlpZiAoIWNoYW5uZWwpCisJCQlyZXR1cm4gMDQ0 NDsKKwkJYnJlYWs7CisJY2FzZSBod21vbl90ZW1wX2lucHV0OgorCWNhc2UgaHdtb25fdGVtcF9s YWJlbDoKKwkJaWYgKCFjaGFubmVsIHx8IGRhdGEtPmxvZy50ZW1wX3NlbnNvcltjaGFubmVsIC0g MV0pCisJCQlyZXR1cm4gMDQ0NDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQor CXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3bW9uX2NoYW5uZWxfaW5mbyAq bnZtZV9od21vbl9pbmZvW10gPSB7CisJSFdNT05fQ0hBTk5FTF9JTkZPKGNoaXAsIEhXTU9OX0Nf UkVHSVNURVJfVFopLAorCUhXTU9OX0NIQU5ORUxfSU5GTyh0ZW1wLAorCQkJICAgSFdNT05fVF9J TlBVVCB8IEhXTU9OX1RfTUFYIHwgSFdNT05fVF9DUklUIHwKKwkJCQlIV01PTl9UX0xBQkVMIHwg SFdNT05fVF9DUklUX0FMQVJNLAorCQkJICAgSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTEFCRUws CisJCQkgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKKwkJCSAgIEhXTU9OX1RfSU5Q VVQgfCBIV01PTl9UX0xBQkVMLAorCQkJICAgSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTEFCRUws CisJCQkgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCwKKwkJCSAgIEhXTU9OX1RfSU5Q VVQgfCBIV01PTl9UX0xBQkVMLAorCQkJICAgSFdNT05fVF9JTlBVVCB8IEhXTU9OX1RfTEFCRUws CisJCQkgICBIV01PTl9UX0lOUFVUIHwgSFdNT05fVF9MQUJFTCksCisJTlVMTAorfTsKKworc3Rh dGljIGNvbnN0IHN0cnVjdCBod21vbl9vcHMgbnZtZV9od21vbl9vcHMgPSB7CisJLmlzX3Zpc2li bGUgPSBudm1lX2h3bW9uX2lzX3Zpc2libGUsCisJLnJlYWQgPSBudm1lX2h3bW9uX3JlYWQsCisJ LnJlYWRfc3RyaW5nID0gbnZtZV9od21vbl9yZWFkX3N0cmluZywKK307CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgaHdtb25fY2hpcF9pbmZvIG52bWVfaHdtb25fY2hpcF9pbmZvID0geworCS5vcHMg PSAmbnZtZV9od21vbl9vcHMsCisJLmluZm8gPSBudm1lX2h3bW9uX2luZm8sCit9OworCit2b2lk IG52bWVfaHdtb25faW5pdChzdHJ1Y3QgbnZtZV9jdHJsICpjdHJsKQoreworCXN0cnVjdCBkZXZp Y2UgKmRldiA9IGN0cmwtPmRldmljZTsKKwlzdHJ1Y3QgbnZtZV9od21vbl9kYXRhICpkYXRhOwor CXN0cnVjdCBkZXZpY2UgKmh3bW9uOworCWludCBlcnI7CisKKwlkYXRhID0gZGV2bV9remFsbG9j KGRldiwgc2l6ZW9mKCpkYXRhKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFkYXRhKQorCQlyZXR1cm47 CisKKwlkYXRhLT5jdHJsID0gY3RybDsKKworCWVyciA9IG52bWVfaHdtb25fZ2V0X3NtYXJ0X2xv ZyhkYXRhKTsKKwlpZiAoZXJyKSB7CisJCWRldl93YXJuKGRldiwgIkZhaWxlZCB0byByZWFkIHNt YXJ0IGxvZyAoZXJyb3IgJWQpXG4iLCBlcnIpOworCQlyZXR1cm47CisJfQorCisJaHdtb24gPSBk ZXZtX2h3bW9uX2RldmljZV9yZWdpc3Rlcl93aXRoX2luZm8oZGV2LCBkZXZfbmFtZShkZXYpLAor CQkJCQkJICAgICBkYXRhLAorCQkJCQkJICAgICAmbnZtZV9od21vbl9jaGlwX2luZm8sCisJCQkJ CQkgICAgIE5VTEwpOworCWlmIChJU19FUlIoaHdtb24pKQorCQlkZXZfd2FybihkZXYsICJGYWls ZWQgdG8gaW5zdGFudGlhdGUgaHdtb24gZGV2aWNlXG4iKTsKK30KZGlmZiAtLWdpdCBhL2RyaXZl cnMvbnZtZS9ob3N0L252bWUuaCBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaAppbmRleCAyMmU4 NDAxMzUyYzIuLmU2NDYwYzEyMTZiYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9udm1lL2hvc3QvbnZt ZS5oCisrKyBiL2RyaXZlcnMvbnZtZS9ob3N0L252bWUuaApAQCAtMjMxLDYgKzIzMSw4IEBAIHN0 cnVjdCBudm1lX2N0cmwgewogCXUxNiBrYXM7CiAJdTggbnBzczsKIAl1OCBhcHN0YTsKKwl1MTYg d2N0ZW1wOworCXUxNiBjY3RlbXA7CiAJdTMyIG9hZXM7CiAJdTMyIGFlbl9yZXN1bHQ7CiAJdTMy IGN0cmF0dDsKQEAgLTY1Miw0ICs2NTQsMTAgQEAgc3RhdGljIGlubGluZSBzdHJ1Y3QgbnZtZV9u cyAqbnZtZV9nZXRfbnNfZnJvbV9kZXYoc3RydWN0IGRldmljZSAqZGV2KQogCXJldHVybiBkZXZf dG9fZGlzayhkZXYpLT5wcml2YXRlX2RhdGE7CiB9CiAKKyNpZiBJU19FTkFCTEVEKENPTkZJR19O Vk1FX0hXTU9OKQordm9pZCBudm1lX2h3bW9uX2luaXQoc3RydWN0IG52bWVfY3RybCAqY3RybCk7 CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIG52bWVfaHdtb25faW5pdChzdHJ1Y3QgbnZtZV9j dHJsICpjdHJsKSB7IH0KKyNlbmRpZgorCiAjZW5kaWYgLyogX05WTUVfSCAqLwotLSAKMi4xNy4x CgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KTGludXgt bnZtZSBtYWlsaW5nIGxpc3QKTGludXgtbnZtZUBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9s aXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtbnZtZQo= 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 X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9F96FCA9EAF for ; Mon, 28 Oct 2019 02:42:05 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 549F320663 for ; Mon, 28 Oct 2019 02:42:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="l4s4ZIQk" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1730148AbfJ1CmE (ORCPT ); Sun, 27 Oct 2019 22:42:04 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:38264 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729378AbfJ1CmE (ORCPT ); Sun, 27 Oct 2019 22:42:04 -0400 Received: by mail-pf1-f194.google.com with SMTP id c13so5819976pfp.5 for ; Sun, 27 Oct 2019 19:42:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=IHo87aCT9Nc2PcJUEez5RtI7+H0wP6kuybDY/vHDZKg=; b=l4s4ZIQkFGM+FK89CM1vHnNg5C4XoK0JtLRFlXftxdKnJaMSUJ9j2pkqr2FvJirSNN fayOZ1o1vdh54VQDdwvKb8zrpTybf6ijXyCg3Up4VgSbPdNnirnh7gnos+4GxfstitgK /p7SZE1fkjbC8x12TiswGQh+atC2yDvGcUWds4pPCH5kpjuUktq8w5W4K25QyMIa9aMi IuAWmBvjvfnn0icGx+B+p0mzPlHLuJZFewgh9uJiur9uvKT9Po4CQUREFRRwpBLPDeGa AcMv9snmpvpB+a5LZkGIwKyOveuqhbCHe34GKeoYWM40EW8VZhcM00D5Qv8SDzeGxvmU Y+5A== 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 :mime-version:content-transfer-encoding; bh=IHo87aCT9Nc2PcJUEez5RtI7+H0wP6kuybDY/vHDZKg=; b=HshZi/Px7i9/no40aSx9BLEy1dMQ1dDDMsPyVNVMQWg4kzAa46URgpk8QX6GW60tXE cF3yV78jvyUu651pwoiv3arvvqhkHh2dkgKHklUcj0XfPnuk4fDwFqsBtwuQRxhf6lFb LyiH5lFJMr3IerqFuHgyCSd+TjvdyqA+rmdek8pKRHRpZDJDCpDSksCeAhoGm+mfYLe1 CIa/3VukgDZrST6WrWLFlKG0ozqicEcInsRVsWdWUiStSTCDdjo9EKyA0/n+6hB/RIe3 Tyn0yb7rDbobyV66exUboi0IYSXHs4k3YuRwVxzJq5kjztpN+2YuTRKZ2ehRm1T18GKJ QVlg== X-Gm-Message-State: APjAAAWsTY89Pyc5BS4rqpw3JfFjMhXm1Yz8WzjU3N2B0ctWyY0xMka1 LcHO5KuIJUoz1q/W3EEcCBoCtpGR X-Google-Smtp-Source: APXvYqxzKe6K74wfzZdBgPWnxo11B0T0iIlKxIeWE/Nb1aJu8Ne9qYIAo/ws+sUYUT8CYUv0C2OXsg== X-Received: by 2002:a17:90a:1424:: with SMTP id j33mr4896492pja.2.1572230522865; Sun, 27 Oct 2019 19:42:02 -0700 (PDT) Received: from localhost ([2600:1700:e321:62f0:329c:23ff:fee3:9d7c]) by smtp.gmail.com with ESMTPSA id s8sm895905pfh.105.2019.10.27.19.42.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 27 Oct 2019 19:42:02 -0700 (PDT) From: Guenter Roeck To: Keith Busch Cc: Chris Healy , Jens Axboe , Christoph Hellwig , Sagi Grimberg , linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org, Guenter Roeck Subject: [PATCH] nvme: Add hardware monitoring support Date: Sun, 27 Oct 2019 19:41:56 -0700 Message-Id: <20191028024156.23964-1-linux@roeck-us.net> X-Mailer: git-send-email 2.17.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org nvme devices report temperature information in the controller information (for limits) and in the smart log. Currently, the only means to retrieve this information is the nvme command line interface, which requires super-user privileges. At the same time, it would be desirable to use NVME temperature information for thermal control. This patch adds support to read NVME temperatures from the kernel using the hwmon API and adds temperature zones for NVME drives. The thermal subsystem can use this information to set thermal policies, and userspace can access it using libsensors and/or the "sensors" command. Example output from the "sensors" command: nvme0-pci-0100 Adapter: PCI adapter Composite: +39.0°C (high = +85.0°C, crit = +85.0°C) Sensor 1: +39.0°C Sensor 2: +41.0°C Signed-off-by: Guenter Roeck --- drivers/nvme/host/Kconfig | 10 +++ drivers/nvme/host/Makefile | 1 + drivers/nvme/host/core.c | 5 ++ drivers/nvme/host/nvme-hwmon.c | 160 +++++++++++++++++++++++++++++++++ drivers/nvme/host/nvme.h | 8 ++ 5 files changed, 184 insertions(+) create mode 100644 drivers/nvme/host/nvme-hwmon.c diff --git a/drivers/nvme/host/Kconfig b/drivers/nvme/host/Kconfig index 2b36f052bfb9..aeb49e16e386 100644 --- a/drivers/nvme/host/Kconfig +++ b/drivers/nvme/host/Kconfig @@ -23,6 +23,16 @@ config NVME_MULTIPATH /dev/nvmeXnY device will show up for each NVMe namespaces, even if it is accessible through multiple controllers. +config NVME_HWMON + bool "NVME hardware monitoring" + depends on (NVME_CORE=y && HWMON=y) || (NVME_CORE=m && HWMON) + help + This provides support for NVME hardware monitoring. If enabled, + a hardware monitoring device will be created for each NVME drive + in the system. + + If unsure, say N. + config NVME_FABRICS tristate diff --git a/drivers/nvme/host/Makefile b/drivers/nvme/host/Makefile index 8a4b671c5f0c..03de4797a877 100644 --- a/drivers/nvme/host/Makefile +++ b/drivers/nvme/host/Makefile @@ -14,6 +14,7 @@ nvme-core-$(CONFIG_TRACING) += trace.o nvme-core-$(CONFIG_NVME_MULTIPATH) += multipath.o nvme-core-$(CONFIG_NVM) += lightnvm.o nvme-core-$(CONFIG_FAULT_INJECTION_DEBUG_FS) += fault_inject.o +nvme-core-$(CONFIG_NVME_HWMON) += nvme-hwmon.o nvme-y += pci.o diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c index fa7ba09dca77..fc1d4b146717 100644 --- a/drivers/nvme/host/core.c +++ b/drivers/nvme/host/core.c @@ -2796,6 +2796,9 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) ctrl->oncs = le16_to_cpu(id->oncs); ctrl->mtfa = le16_to_cpu(id->mtfa); ctrl->oaes = le32_to_cpu(id->oaes); + ctrl->wctemp = le16_to_cpu(id->wctemp); + ctrl->cctemp = le16_to_cpu(id->cctemp); + atomic_set(&ctrl->abort_limit, id->acl + 1); ctrl->vwc = id->vwc; if (id->mdts) @@ -2897,6 +2900,8 @@ int nvme_init_identify(struct nvme_ctrl *ctrl) ctrl->identified = true; + nvme_hwmon_init(ctrl); + return 0; out_free: diff --git a/drivers/nvme/host/nvme-hwmon.c b/drivers/nvme/host/nvme-hwmon.c new file mode 100644 index 000000000000..f19098bc3228 --- /dev/null +++ b/drivers/nvme/host/nvme-hwmon.c @@ -0,0 +1,160 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * NVM Express hardware monitoring support + * Copyright (c) 2019, Guenter Roeck + */ + +#include + +#include "nvme.h" + +struct nvme_hwmon_data { + struct nvme_ctrl *ctrl; + struct nvme_smart_log log; +}; + +static int nvme_hwmon_get_smart_log(struct nvme_hwmon_data *data) +{ + return nvme_get_log(data->ctrl, NVME_NSID_ALL, NVME_LOG_SMART, 0, + &data->log, sizeof(data->log), 0); +} + +static int nvme_hwmon_read(struct device *dev, enum hwmon_sensor_types type, + u32 attr, int channel, long *val) +{ + struct nvme_hwmon_data *data = dev_get_drvdata(dev); + struct nvme_smart_log *log = &data->log; + int err; + int temp; + + err = nvme_hwmon_get_smart_log(data); + if (err) + return err < 0 ? err : -EPROTO; + + switch (attr) { + case hwmon_temp_max: + *val = (data->ctrl->wctemp - 273) * 1000; + break; + case hwmon_temp_crit: + *val = (data->ctrl->cctemp - 273) * 1000; + break; + case hwmon_temp_input: + if (!channel) + temp = le16_to_cpup((__le16 *)log->temperature); + else + temp = le16_to_cpu(log->temp_sensor[channel - 1]); + *val = (temp - 273) * 1000; + break; + case hwmon_temp_crit_alarm: + *val = !!(log->critical_warning & NVME_SMART_CRIT_TEMPERATURE); + break; + default: + err = -EOPNOTSUPP; + break; + } + return err; +} + +static const char * const nvme_hwmon_sensor_names[] = { + "Composite", + "Sensor 1", + "Sensor 2", + "Sensor 3", + "Sensor 4", + "Sensor 5", + "Sensor 6", + "Sensor 7", + "Sensor 8", +}; + +static int nvme_hwmon_read_string(struct device *dev, + enum hwmon_sensor_types type, u32 attr, + int channel, const char **str) +{ + *str = nvme_hwmon_sensor_names[channel]; + return 0; +} + +static umode_t nvme_hwmon_is_visible(const void *_data, + enum hwmon_sensor_types type, + u32 attr, int channel) +{ + const struct nvme_hwmon_data *data = _data; + + switch (attr) { + case hwmon_temp_crit: + if (!channel && data->ctrl->cctemp) + return 0444; + break; + case hwmon_temp_max: + if (!channel && data->ctrl->wctemp) + return 0444; + break; + case hwmon_temp_crit_alarm: + if (!channel) + return 0444; + break; + case hwmon_temp_input: + case hwmon_temp_label: + if (!channel || data->log.temp_sensor[channel - 1]) + return 0444; + break; + default: + break; + } + return 0; +} + +static const struct hwmon_channel_info *nvme_hwmon_info[] = { + HWMON_CHANNEL_INFO(chip, HWMON_C_REGISTER_TZ), + HWMON_CHANNEL_INFO(temp, + HWMON_T_INPUT | HWMON_T_MAX | HWMON_T_CRIT | + HWMON_T_LABEL | HWMON_T_CRIT_ALARM, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL, + HWMON_T_INPUT | HWMON_T_LABEL), + NULL +}; + +static const struct hwmon_ops nvme_hwmon_ops = { + .is_visible = nvme_hwmon_is_visible, + .read = nvme_hwmon_read, + .read_string = nvme_hwmon_read_string, +}; + +static const struct hwmon_chip_info nvme_hwmon_chip_info = { + .ops = &nvme_hwmon_ops, + .info = nvme_hwmon_info, +}; + +void nvme_hwmon_init(struct nvme_ctrl *ctrl) +{ + struct device *dev = ctrl->device; + struct nvme_hwmon_data *data; + struct device *hwmon; + int err; + + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return; + + data->ctrl = ctrl; + + err = nvme_hwmon_get_smart_log(data); + if (err) { + dev_warn(dev, "Failed to read smart log (error %d)\n", err); + return; + } + + hwmon = devm_hwmon_device_register_with_info(dev, dev_name(dev), + data, + &nvme_hwmon_chip_info, + NULL); + if (IS_ERR(hwmon)) + dev_warn(dev, "Failed to instantiate hwmon device\n"); +} diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h index 22e8401352c2..e6460c1216bc 100644 --- a/drivers/nvme/host/nvme.h +++ b/drivers/nvme/host/nvme.h @@ -231,6 +231,8 @@ struct nvme_ctrl { u16 kas; u8 npss; u8 apsta; + u16 wctemp; + u16 cctemp; u32 oaes; u32 aen_result; u32 ctratt; @@ -652,4 +654,10 @@ static inline struct nvme_ns *nvme_get_ns_from_dev(struct device *dev) return dev_to_disk(dev)->private_data; } +#if IS_ENABLED(CONFIG_NVME_HWMON) +void nvme_hwmon_init(struct nvme_ctrl *ctrl); +#else +static inline void nvme_hwmon_init(struct nvme_ctrl *ctrl) { } +#endif + #endif /* _NVME_H */ -- 2.17.1