all lists on lists.proxmox.com
 help / color / mirror / Atom feed
From: "Jan-Jonas Sämann" <sprinterfreak@binary-kitchen.de>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH v2 storage] Diskmanage: Use S.M.A.R.T. attributes for SSDs wearout lookup
Date: Sat, 24 Oct 2020 21:27:09 +0200	[thread overview]
Message-ID: <20201024192709.27324-2-sprinterfreak@binary-kitchen.de> (raw)
In-Reply-To: <20201024192709.27324-1-sprinterfreak@binary-kitchen.de>

This replaces a locally maintained hardware map in
get_wear_leveling_info() by commonly used register names of
smartmontool. Smartmontool maintains a labeled register database that
contains a majority of drives (including versions). The current lookup
produces false estimates, this approach hopefully provides more reliable
data.

Signed-off-by: Jan-Jonas Sämann <sprinterfreak@binary-kitchen.de>
---
 PVE/Diskmanage.pm | 58 +++++++++++++++++++++++------------------------
 1 file changed, 28 insertions(+), 30 deletions(-)

diff --git a/PVE/Diskmanage.pm b/PVE/Diskmanage.pm
index 79aafcc..20dbeeb 100644
--- a/PVE/Diskmanage.pm
+++ b/PVE/Diskmanage.pm
@@ -396,7 +396,7 @@ sub get_sysdir_info {
 }
 
 sub get_wear_leveling_info {
-    my ($smartdata, $model) = @_;
+    my ($smartdata) = @_;
     my $attributes = $smartdata->{attributes};
 
     if (defined($smartdata->{wearout})) {
@@ -405,37 +405,35 @@ sub get_wear_leveling_info {
 
     my $wearout;
 
-    my $vendormap = {
-	'kingston' => 231,
-	'samsung' => 177,
-	'intel' => 233,
-	'sandisk' => 233,
-	'crucial' => 202,
-	'default' => 233,
-    };
-
-    # find target attr id
-
-    my $attrid;
-
-    foreach my $vendor (keys %$vendormap) {
-	if ($model =~ m/$vendor/i) {
-	    $attrid = $vendormap->{$vendor};
-	    # found the attribute
-	    last;
+    # Common register names that represent percentage values of potential
+    # failure indicators used in drivedb.h of smartmontool's. Order matters,
+    # as some drives may have multiple definitions
+    my @wearoutregisters = (
+	"SSD_Life_Left",
+	"Wear_Leveling_Count",
+	"Perc_Write\/Erase_Ct_BC",
+	"Perc_Rated_Life_Remain",
+	"Remaining_Lifetime_Perc",
+	"Percent_Lifetime_Remain",
+	"Lifetime_Left",
+	"PCT_Life_Remaining",
+	"Lifetime_Remaining",
+	"Percent_Life_Remaining",
+	"Percent_Lifetime_Used",
+	"Perc_Rated_Life_Used"
+    );
+
+    # Search for S.M.A.R.T. attributes for known register
+    foreach my $register (@wearoutregisters) {
+	last if defined $wearout;
+	foreach my $attr (@$attributes) {
+	   next if $attr->{name} !~ m/$register/;
+	   # Store wearout value, invert value if register matches "Used"
+	   $wearout = ($attr->{name} =~ /Used/) ? 100 - $attr->{value} : $attr->{value};
+	   last;
 	}
     }
 
-    if (!$attrid) {
-	$attrid = $vendormap->{default};
-    }
-
-    foreach my $attr (@$attributes) {
-	next if $attr->{id} != $attrid;
-	$wearout = $attr->{value};
-	last;
-    }
-
     return $wearout;
 }
 
@@ -559,7 +557,7 @@ sub get_disks {
 
 		if (is_ssdlike($type)) {
 		    # if we have an ssd we try to get the wearout indicator
-		    my $wearval = get_wear_leveling_info($smartdata, $data->{model} || $sysdata->{model});
+		    my $wearval = get_wear_leveling_info($smartdata);
 		    $wearout = $wearval if defined($wearval);
 		}
 	    };
-- 
2.25.1




  reply	other threads:[~2020-10-24 19:27 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-10-19 22:53 [pve-devel] [PATCH] disk management: Add support for additional Crucial SSDs Jan-Jonas Sämann
2020-10-22 13:30 ` Dominik Csapak
2020-10-24 19:27   ` [pve-devel] New routine get_wear_leveling_info() Jan-Jonas Sämann
2020-10-24 19:27     ` Jan-Jonas Sämann [this message]
2020-10-27  8:08       ` [pve-devel] [PATCH v2 storage] Diskmanage: Use S.M.A.R.T. attributes for SSDs wearout lookup Thomas Lamprecht
2020-10-27 19:06         ` Jan-Jonas Sämann
2020-10-29 18:21       ` Thomas Lamprecht
2020-10-30  3:31         ` [pve-devel] Updated patch and test data Jan-Jonas Sämann
2020-10-30  3:31           ` [pve-devel] [PATCH storage v3 1/2] Update disk_tests/ssd_smart/sde data Jan-Jonas Sämann
2020-10-30  3:57             ` [pve-devel] Commit fixup Jan-Jonas Sämann
2020-10-30  3:57               ` [pve-devel] [PATCH storage v4 1/2] Update disk_tests/ssd_smart/sde data Jan-Jonas Sämann
2020-10-30 14:32                 ` [pve-devel] applied: " Thomas Lamprecht
2020-10-30  3:57               ` [pve-devel] [PATCH storage v4 2/2] Diskmanage: Use S.M.A.R.T. attributes for SSDs wearout lookup Jan-Jonas Sämann
2020-10-30 14:32                 ` [pve-devel] applied: " Thomas Lamprecht
2020-10-30  3:31           ` [pve-devel] [PATCH storage v3 " Jan-Jonas Sämann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20201024192709.27324-2-sprinterfreak@binary-kitchen.de \
    --to=sprinterfreak@binary-kitchen.de \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal