1
0
Fork 0

Adding upstream version 2.0.

Signed-off-by: Daniel Baumann <daniel@debian.org>
This commit is contained in:
Daniel Baumann 2025-02-16 12:15:30 +01:00
parent 50aec1e4c5
commit 1b3a431c1d
Signed by: daniel
GPG key ID: FBB4F0E80A80222F
521 changed files with 21541 additions and 21644 deletions

View file

@ -5,16 +5,12 @@
#include <unistd.h>
#include <inttypes.h>
#include "linux/nvme_ioctl.h"
#include "common.h"
#include "nvme.h"
#include "nvme-print.h"
#include "nvme-ioctl.h"
#include "libnvme.h"
#include "plugin.h"
#include "argconfig.h"
#include "suffix.h"
#include "linux/types.h"
#include "nvme-print.h"
#define CREATE_CMD
#include "intel-nvme.h"
@ -351,8 +347,8 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
struct config {
__u32 namespace_id;
int raw_binary;
int json;
bool raw_binary;
bool json;
};
struct config cfg = {
@ -370,8 +366,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
if (fd < 0)
return fd;
err = nvme_get_log(fd, cfg.namespace_id, 0xca, false,
NVME_NO_LOG_LSP, sizeof(smart_log), &smart_log);
err = nvme_get_log_simple(fd, 0xca, sizeof(smart_log), &smart_log);
if (!err) {
if (cfg.json)
show_intel_smart_log_jsn(&smart_log, cfg.namespace_id, devicename);
@ -381,8 +376,7 @@ static int get_additional_smart_log(int argc, char **argv, struct command *cmd,
d_raw((unsigned char *)&smart_log, sizeof(smart_log));
}
else if (err > 0)
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
return err;
}
@ -395,7 +389,7 @@ static int get_market_log(int argc, char **argv, struct command *cmd, struct plu
int err, fd;
struct config {
int raw_binary;
bool raw_binary;
};
struct config cfg = {
@ -410,16 +404,14 @@ static int get_market_log(int argc, char **argv, struct command *cmd, struct plu
if (fd < 0)
return fd;
err = nvme_get_log(fd, NVME_NSID_ALL, 0xdd, false,
NVME_NO_LOG_LSP, sizeof(log), log);
err = nvme_get_log_simple(fd, 0xdd, sizeof(log), log);
if (!err) {
if (!cfg.raw_binary)
printf("Intel Marketing Name Log:\n%s\n", log);
else
d_raw((unsigned char *)&log, sizeof(log));
} else if (err > 0)
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
return err;
}
@ -457,7 +449,7 @@ static int get_temp_stats_log(int argc, char **argv, struct command *cmd, struct
const char *desc = "Get Temperature Statistics log and show it.";
const char *raw = "dump output in binary format";
struct config {
int raw_binary;
bool raw_binary;
};
struct config cfg = {
@ -472,16 +464,14 @@ static int get_temp_stats_log(int argc, char **argv, struct command *cmd, struct
if (fd < 0)
return fd;
err = nvme_get_log(fd, NVME_NSID_ALL, 0xc5, false,
NVME_NO_LOG_LSP, sizeof(stats), &stats);
err = nvme_get_log_simple(fd, 0xc5, sizeof(stats), &stats);
if (!err) {
if (!cfg.raw_binary)
show_temp_stats(&stats);
else
d_raw((unsigned char *)&stats, sizeof(stats));
} else if (err > 0)
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
return err;
}
@ -497,10 +487,13 @@ struct __attribute__((__packed__)) optane_lat_stats {
__u64 data[9];
};
#define MEDIA_MAJOR_IDX 0
#define MEDIA_MINOR_IDX 1
#define MEDIA_MAX_LEN 2
#define OPTANE_V1000_BUCKET_LEN 8
#define MEDIA_MAJOR_IDX 0
#define MEDIA_MINOR_IDX 1
#define MEDIA_MAX_LEN 2
#define OPTANE_V1000_BUCKET_LEN 8
#define OPTANE_V1000_BUCKET_LEN 8
#define NAND_LAT_STATS_LEN 4868
static struct intel_lat_stats stats;
static struct optane_lat_stats v1000_stats;
@ -529,7 +522,7 @@ enum FormatUnit {
#define US_IN_S 1000000
#define US_IN_MS 1000
static const enum FormatUnit get_seconds_magnitude(__u32 microseconds)
static enum FormatUnit get_seconds_magnitude(__u32 microseconds)
{
if (microseconds > US_IN_S)
return S;
@ -539,7 +532,7 @@ static const enum FormatUnit get_seconds_magnitude(__u32 microseconds)
return US;
}
static const float convert_seconds(__u32 microseconds)
static float convert_seconds(__u32 microseconds)
{
float divisor = 1.0;
@ -567,13 +560,15 @@ enum inf_bound_type {
* either of "-INF" or "+INF", respectively.
*/
static void set_unit_string(char *buffer, __u32 microseconds,
enum FormatUnit unit, enum inf_bound_type bound_type)
enum FormatUnit unit,
enum inf_bound_type bound_type)
{
char *string;
if (bound_type != NOINF) {
snprintf(buffer, 5, "%s", bound_type ? "+INF" : "-INF");
snprintf(buffer, BUFSIZE, "%s", bound_type ? "+INF" : "-INF");
return;
}
char *string;
switch (unit) {
case US:
@ -589,8 +584,9 @@ static void set_unit_string(char *buffer, __u32 microseconds,
string = "_s";
break;
}
snprintf(buffer, 11, "%4.2f%s",
convert_seconds(microseconds), string);
snprintf(buffer, BUFSIZE, "%4.2f%s", convert_seconds(microseconds),
string);
}
static void init_buffer(char *buffer, size_t size)
@ -660,12 +656,11 @@ static void show_lat_stats_linear(struct intel_lat_stats *stats,
/*
* For 4.0-4.5 revision.
*/
#define LATENCY_STATS_V4_BASE_BITS 6
#define LATENCY_STATS_V4_BASE_VAL (1 << LATENCY_STATS_V4_BASE_BITS)
static int lat_stats_log_scale(int i)
{
static const int LATENCY_STATS_V4_BASE_BITS = 6;
static const int LATENCY_STATS_V4_BASE_VAL = (
1 << LATENCY_STATS_V4_BASE_BITS);
// if (i < 128)
if (i < (LATENCY_STATS_V4_BASE_VAL << 1))
return i;
@ -715,8 +710,7 @@ static void json_add_bucket(struct intel_lat_stats *stats,
init_buffer(buffer, BUFSIZE);
json_object_add_value_object(bucket_list,
"bucket", bucket);
json_object_array_add(bucket_list, bucket);
json_object_add_value_int(bucket, "id", id);
set_unit_string(buffer, lower_us,
@ -739,8 +733,7 @@ static void json_add_bucket_optane(struct json_object *bucket_list, __u32 id,
init_buffer(buffer, BUFSIZE);
json_object_add_value_object(bucket_list,
"bucket", bucket);
json_object_array_add(bucket_list, bucket);
json_object_add_value_int(bucket, "id", id);
set_unit_string(buffer, lower_us,
@ -775,7 +768,7 @@ static void json_lat_stats_3_0(struct intel_lat_stats *stats,
int write)
{
struct json_object *root = json_create_object();
struct json_object *bucket_list = json_create_object();
struct json_object *bucket_list = json_object_new_array();
lat_stats_make_json_root(root, bucket_list, write);
@ -794,7 +787,7 @@ static void json_lat_stats_4_0(struct intel_lat_stats *stats,
int write)
{
struct json_object *root = json_create_object();
struct json_object *bucket_list = json_create_object();
struct json_object *bucket_list = json_object_new_array();
lat_stats_make_json_root(root, bucket_list, write);
@ -847,11 +840,11 @@ static void show_lat_stats_4_0(struct intel_lat_stats *stats)
}
}
static void jason_lat_stats_v1000_0(struct optane_lat_stats *stats, int write)
static void json_lat_stats_v1000_0(struct optane_lat_stats *stats, int write)
{
int i;
struct json_object *root = json_create_object();
struct json_object *bucket_list = json_create_object();
struct json_object *bucket_list = json_object_new_array();
lat_stats_make_json_root(root, bucket_list, write);
@ -951,7 +944,7 @@ static void json_lat_stats(int write)
case 1000:
switch (media_version[MEDIA_MINOR_IDX]) {
case 0:
jason_lat_stats_v1000_0(&v1000_stats, write);
json_lat_stats_v1000_0(&v1000_stats, write);
break;
default:
printf("Unsupported minor revision (%u.%u)\n",
@ -998,6 +991,7 @@ static void show_lat_stats(int write)
case 3:
case 4:
case 5:
case 6:
show_lat_stats_4_0(&stats);
break;
default:
@ -1028,6 +1022,7 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
{
int err, fd;
__u8 data[NAND_LAT_STATS_LEN];
const char *desc = "Get Intel Latency Statistics log and show it.";
const char *raw = "Dump output in binary format";
@ -1035,9 +1030,9 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
const char *write = "Get write statistics (read default)";
struct config {
int raw_binary;
int json;
int write;
bool raw_binary;
bool json;
bool write;
};
struct config cfg = {
@ -1054,10 +1049,15 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
if (fd < 0)
return fd;
/* Query maj and minor version first */
err = nvme_get_log(fd, NVME_NSID_ALL, cfg.write ? 0xc2 : 0xc1,
false, NVME_NO_LOG_LSP, sizeof(media_version),
media_version);
/* For optate, latency stats are deleted every time their LID is pulled.
* Therefore, we query the longest lat_stats log page first.
*/
err = nvme_get_log_simple(fd, cfg.write ? 0xc2 : 0xc1,
sizeof(data), &data);
media_version[0] = (data[1] << 8) | data[0];
media_version[1] = (data[3] << 8) | data[2];
if (err)
goto close_fd;
@ -1065,11 +1065,23 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
__u32 thresholds[OPTANE_V1000_BUCKET_LEN] = {0};
__u32 result;
err = nvme_get_feature(fd, 0, 0xf7, 0, cfg.write ? 0x1 : 0x0, 0,
sizeof(thresholds), thresholds, &result);
struct nvme_get_features_args args = {
.args_size = sizeof(args),
.fd = fd,
.fid = 0xf7,
.nsid = 0,
.sel = 0,
.cdw11 = cfg.write ? 0x1 : 0x0,
.uuidx = 0,
.data_len = sizeof(thresholds),
.data = thresholds,
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
.result = &result,
};
err = nvme_get_features(&args);
if (err) {
fprintf(stderr, "Quering thresholds failed. NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
fprintf(stderr, "Quering thresholds failed. ");
nvme_show_status(err);
goto close_fd;
}
@ -1083,13 +1095,14 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
}
err = nvme_get_log(fd, NVME_NSID_ALL, cfg.write ? 0xc2 : 0xc1,
false, NVME_NO_LOG_LSP, sizeof(v1000_stats),
&v1000_stats);
/* Move counter values to optate stats struct which has a
* smaller size
*/
memcpy(&v1000_stats, (struct optane_lat_stats *)data,
sizeof(struct optane_lat_stats));
} else {
err = nvme_get_log(fd, NVME_NSID_ALL, cfg.write ? 0xc2 : 0xc1,
false, NVME_NO_LOG_LSP, sizeof(stats),
&stats);
memcpy(&stats, (struct intel_lat_stats *)data,
sizeof(struct intel_lat_stats));
}
if (!err) {
@ -1097,11 +1110,16 @@ static int get_lat_stats_log(int argc, char **argv, struct command *cmd, struct
json_lat_stats(cfg.write);
else if (!cfg.raw_binary)
show_lat_stats(cfg.write);
else
d_raw((unsigned char *)&stats, sizeof(stats));
else {
if (media_version[0] == 1000)
d_raw((unsigned char *)&v1000_stats,
sizeof(v1000_stats));
else
d_raw((unsigned char *)&stats,
sizeof(stats));
}
} else if (err > 0)
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
close_fd:
close(fd);
return err;
@ -1213,7 +1231,7 @@ static int read_entire_cmd(struct nvme_passthru_cmd *cmd, int total_size,
dword_tfer = min(max_tfer, total_size);
while (total_size > 0) {
err = nvme_submit_admin_passthru(ioctl_fd, cmd);
err = nvme_submit_admin_passthru(ioctl_fd, cmd, NULL);
if (err) {
fprintf(stderr,
"failed on cmd.data_len %u cmd.cdw13 %u cmd.cdw12 %x cmd.cdw10 %u err %x remaining size %d\n",
@ -1478,8 +1496,7 @@ static int get_internal_log(int argc, char **argv, struct command *command,
err = 0;
out:
if (err > 0) {
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
} else if (err < 0) {
perror("intel log");
err = EIO;
@ -1518,8 +1535,8 @@ static int enable_lat_stats_tracking(int argc, char **argv,
};
const struct argconfig_commandline_options command_line_options[] = {
{"enable", 'e', "", CFG_NONE, &cfg.enable, no_argument, enable_desc},
{"disable", 'd', "", CFG_NONE, &cfg.disable, no_argument, disable_desc},
{"enable", 'e', "", CFG_FLAG, &cfg.enable, no_argument, enable_desc},
{"disable", 'd', "", CFG_FLAG, &cfg.disable, no_argument, disable_desc},
{NULL}
};
@ -1540,10 +1557,40 @@ static int enable_lat_stats_tracking(int argc, char **argv,
if (fd < 0)
return fd;
struct nvme_get_features_args args_get = {
.args_size = sizeof(args_get),
.fd = fd,
.fid = fid,
.nsid = nsid,
.sel = sel,
.cdw11 = cdw11,
.uuidx = 0,
.data_len = data_len,
.data = buf,
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
.result = &result,
};
struct nvme_set_features_args args_set = {
.args_size = sizeof(args_set),
.fd = fd,
.fid = fid,
.nsid = nsid,
.cdw11 = option,
.cdw12 = cdw12,
.save = save,
.uuidx = 0,
.cdw15 = 0,
.data_len = data_len,
.data = buf,
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
.result = &result,
};
switch (option) {
case None:
err = nvme_get_feature(fd, nsid, fid, sel, cdw11, 0, data_len, buf,
&result);
err = nvme_get_features(&args_get);
if (!err) {
printf(
"Latency Statistics Tracking (FID 0x%X) is currently (%i).\n",
@ -1555,11 +1602,9 @@ static int enable_lat_stats_tracking(int argc, char **argv,
break;
case True:
case False:
err = nvme_set_feature(fd, nsid, fid, option, cdw12, save, 0,
data_len, buf, &result);
err = nvme_set_features(&args_set);
if (err > 0) {
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
} else if (err < 0) {
perror("Enable latency tracking");
fprintf(stderr, "Command failed while parsing.\n");
@ -1590,12 +1635,12 @@ static int set_lat_stats_thresholds(int argc, char **argv,
__u32 result;
struct config {
int write;
bool write;
char *bucket_thresholds;
};
struct config cfg = {
.write = 0,
.write = false,
.bucket_thresholds = "",
};
@ -1615,12 +1660,11 @@ static int set_lat_stats_thresholds(int argc, char **argv,
* valid buckets a user is allowed to modify. Read or write doesn't
* matter
*/
err = nvme_get_log(fd, NVME_NSID_ALL, 0xc2,
false, NVME_NO_LOG_LSP, sizeof(media_version),
media_version);
err = nvme_get_log_simple(fd, 0xc2,
sizeof(media_version), media_version);
if (err) {
fprintf(stderr, "Querying media version failed. NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
fprintf(stderr, "Querying media version failed. ");
nvme_show_status(err);
goto close_fd;
}
@ -1635,13 +1679,25 @@ static int set_lat_stats_thresholds(int argc, char **argv,
}
err = nvme_set_feature(fd, nsid, fid, cfg.write ? 0x1 : 0x0,
cdw12, save, 0, OPTANE_V1000_BUCKET_LEN,
thresholds, &result);
struct nvme_set_features_args args = {
.args_size = sizeof(args),
.fd = fd,
.fid = fid,
.nsid = nsid,
.cdw11 = cfg.write ? 0x1 : 0x0,
.cdw12 = cdw12,
.save = save,
.uuidx = 0,
.cdw15 = 0,
.data_len = sizeof(thresholds),
.data = thresholds,
.timeout = NVME_DEFAULT_IOCTL_TIMEOUT,
.result = &result,
};
err = nvme_set_features(&args);
if (err > 0) {
fprintf(stderr, "NVMe Status:%s(%x)\n",
nvme_status_to_string(err), err);
nvme_show_status(err);
} else if (err < 0) {
perror("Enable latency tracking");
fprintf(stderr, "Command failed while parsing.\n");