Skip to content

Commit

Permalink
plugins/solidigm: Automatic retry smaller telemetry chunk size.
Browse files Browse the repository at this point in the history
Retry to retrieve telemetry with smaller chunk size, because
some systems are failing to retrieve telemetry in 256KB chunks.

Signed-off-by: Leonardo da Cunha <[email protected]>
  • Loading branch information
lgdacunh committed Oct 5, 2024
1 parent 8b6d4f2 commit 7b4cc39
Show file tree
Hide file tree
Showing 5 changed files with 29 additions and 15 deletions.
14 changes: 6 additions & 8 deletions plugins/solidigm/solidigm-internal-logs.c
Original file line number Diff line number Diff line change
Expand Up @@ -524,8 +524,6 @@ static int ilog_ensure_dump_id_ctrl(struct ilog *ilog)

/* assuming CAP.MPSMIN is zero minimum Memory Page Size is at least 4096 bytes */
ilog->max_tx = (1 << ilog->id_ctrl.mdts) * NVME_LOG_PAGE_PDU_SIZE;
if (ilog->max_tx > DRIVER_MAX_TX_256K)
ilog->max_tx = DRIVER_MAX_TX_256K;

return err;
}
Expand Down Expand Up @@ -564,16 +562,16 @@ static int ilog_dump_telemetry(struct ilog *ilog, enum log_type ttype)
case HIT:
file_name = "lid_0x07_lsp_0x01_lsi_0x0000.bin";
log.desc = "Host Initiated Telemetry";
err = nvme_get_telemetry_log(dev_fd(ilog->dev), true, false, false, max_data_tx, da,
(struct nvme_telemetry_log **) &log.buffer,
&log.buffer_size);
err = sldgm_dynamic_telemetry(dev_fd(ilog->dev), true, false, false, max_data_tx,
da, (struct nvme_telemetry_log **) &log.buffer,
&log.buffer_size);
break;
case CIT:
file_name = "lid_0x08_lsp_0x00_lsi_0x0000.bin";
log.desc = "Controller Initiated Telemetry";
err = nvme_get_telemetry_log(dev_fd(ilog->dev), false, true, true, max_data_tx, da,
(struct nvme_telemetry_log **) &log.buffer,
&log.buffer_size);
err = sldgm_dynamic_telemetry(dev_fd(ilog->dev), false, true, true, max_data_tx,
da, (struct nvme_telemetry_log **) &log.buffer,
&log.buffer_size);
break;
default:
return -EINVAL;
Expand Down
2 changes: 1 addition & 1 deletion plugins/solidigm/solidigm-nvme.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

#include "cmd.h"

#define SOLIDIGM_PLUGIN_VERSION "1.7"
#define SOLIDIGM_PLUGIN_VERSION "1.8"

PLUGIN(NAME("solidigm", "Solidigm vendor specific extensions", SOLIDIGM_PLUGIN_VERSION),
COMMAND_LIST(
Expand Down
6 changes: 2 additions & 4 deletions plugins/solidigm/solidigm-telemetry.c
Original file line number Diff line number Diff line change
Expand Up @@ -155,11 +155,9 @@ int solidigm_get_telemetry_log(int argc, char **argv, struct command *cmd, struc
SOLIDIGM_LOG_WARNING("Failed to acquire identify ctrl %d!", err);
goto close_fd;
}
if (max_data_tx > DRIVER_MAX_TX_256K)
max_data_tx = DRIVER_MAX_TX_256K;

err = nvme_get_telemetry_log(dev_fd(dev), cfg.host_gen, cfg.ctrl_init, true,
max_data_tx, cfg.data_area, &tl.log, &tl.log_size);
err = sldgm_dynamic_telemetry(dev_fd(dev), cfg.host_gen, cfg.ctrl_init, true,
max_data_tx, cfg.data_area, &tl.log, &tl.log_size);
if (err < 0) {
SOLIDIGM_LOG_WARNING("get-telemetry-log: %s",
nvme_strerror(errno));
Expand Down
16 changes: 16 additions & 0 deletions plugins/solidigm/solidigm-util.c
Original file line number Diff line number Diff line change
Expand Up @@ -37,3 +37,19 @@ int sldgm_get_uuid_index(struct nvme_dev *dev, __u8 *index)

return sldgm_find_uuid_index(&uuid_list, index);
}

int sldgm_dynamic_telemetry(int dev_fd, bool create, bool ctrl, bool log_page,
size_t max_data_tx, enum nvme_telemetry_da da,
struct nvme_telemetry_log **log_buffer,
size_t *log_buffer_size)
{
int err;

do {
err = nvme_get_telemetry_log(dev_fd, create, ctrl, log_page, max_data_tx, da,
log_buffer, log_buffer_size);
max_data_tx /= 2;
create = false;
} while (err == -EPERM && max_data_tx >= 4096);
return err;
}
6 changes: 4 additions & 2 deletions plugins/solidigm/solidigm-util.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@

#include "nvme.h"

#define DRIVER_MAX_TX_256K (256 * 1024)

int sldgm_find_uuid_index(struct nvme_id_uuid_list *uuid_list, __u8 *index);
int sldgm_get_uuid_index(struct nvme_dev *dev, __u8 *index);
int sldgm_dynamic_telemetry(int dev_fd, bool host, bool ctrl, bool log_page,
size_t max_data_tx, enum nvme_telemetry_da da,
struct nvme_telemetry_log **log_buffer,
size_t *log_buffer_size);

0 comments on commit 7b4cc39

Please sign in to comment.