@@ -2186,184 +2186,6 @@ static int check_smart_threshold(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
}
#endif
-#ifdef HAVE_NDCTL_ARS
-static int check_ars_cap(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
- struct check_cmd *check)
-{
- struct ndctl_cmd *cmd;
- int rc;
-
- if (check->cmd != NULL) {
- fprintf(stderr, "%s: dimm: %#x expected a NULL command, by default\n",
- __func__, ndctl_dimm_get_handle(dimm));
- return -ENXIO;
- }
-
- cmd = ndctl_bus_cmd_new_ars_cap(bus, 0, SZ_4K);
- if (!cmd) {
- fprintf(stderr, "%s: bus: %s failed to create cmd\n",
- __func__, ndctl_bus_get_provider(bus));
- return -ENOTTY;
- }
-
- rc = ndctl_cmd_submit(cmd);
- if (rc) {
- fprintf(stderr, "%s: bus: %s failed to submit cmd: %d\n",
- __func__, ndctl_bus_get_provider(bus), rc);
- ndctl_cmd_unref(cmd);
- return rc;
- }
-
- if (ndctl_cmd_ars_cap_get_size(cmd) < sizeof(struct nd_cmd_ars_status)) {
- fprintf(stderr, "%s: bus: %s expect size >= %zd got: %d\n",
- __func__, ndctl_bus_get_provider(bus),
- sizeof(struct nd_cmd_ars_status),
- ndctl_cmd_ars_cap_get_size(cmd));
- ndctl_cmd_unref(cmd);
- return -ENXIO;
- }
-
- check->cmd = cmd;
- return 0;
-}
-
-static int check_ars_start(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
- struct check_cmd *check)
-{
- struct ndctl_cmd *cmd_ars_cap = check_cmds[ND_CMD_ARS_CAP].cmd;
- struct ndctl_cmd *cmd;
- int rc;
-
- if (check->cmd != NULL) {
- fprintf(stderr, "%s: dimm: %#x expected a NULL command, by default\n",
- __func__, ndctl_dimm_get_handle(dimm));
- return -ENXIO;
- }
-
- cmd = ndctl_bus_cmd_new_ars_start(cmd_ars_cap, ND_ARS_PERSISTENT);
- if (!cmd) {
- fprintf(stderr, "%s: bus: %s failed to create cmd\n",
- __func__, ndctl_bus_get_provider(bus));
- return -ENOTTY;
- }
-
- rc = ndctl_cmd_submit(cmd);
- if (rc) {
- fprintf(stderr, "%s: bus: %s failed to submit cmd: %d\n",
- __func__, ndctl_bus_get_provider(bus), rc);
- ndctl_cmd_unref(cmd);
- return rc;
- }
-
- check->cmd = cmd;
- return 0;
-}
-
-static int check_ars_status(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
- struct check_cmd *check)
-{
- struct ndctl_cmd *cmd_ars_cap = check_cmds[ND_CMD_ARS_CAP].cmd;
- struct ndctl_cmd *cmd;
- unsigned long tmo = 5;
- unsigned int i;
- int rc;
-
- if (check->cmd != NULL) {
- fprintf(stderr, "%s: dimm: %#x expected a NULL command, by default\n",
- __func__, ndctl_dimm_get_handle(dimm));
- return -ENXIO;
- }
-
- retry:
- cmd = ndctl_bus_cmd_new_ars_status(cmd_ars_cap);
- if (!cmd) {
- fprintf(stderr, "%s: bus: %s failed to create cmd\n",
- __func__, ndctl_bus_get_provider(bus));
- return -ENOTTY;
- }
-
- rc = ndctl_cmd_submit(cmd);
- if (rc) {
- fprintf(stderr, "%s: bus: %s failed to submit cmd: %d\n",
- __func__, ndctl_bus_get_provider(bus), rc);
- ndctl_cmd_unref(cmd);
- return rc;
- }
-
- if (!tmo) {
- fprintf(stderr, "%s: bus: %s ars timeout\n", __func__,
- ndctl_bus_get_provider(bus));
- return -EIO;
- }
-
- if (ndctl_cmd_ars_in_progress(cmd)) {
- tmo--;
- sleep(1);
- goto retry;
- }
-
- for (i = 0; i < ndctl_cmd_ars_num_records(cmd); i++) {
- fprintf(stderr, "%s: record[%d].addr: 0x%llx\n", __func__, i,
- ndctl_cmd_ars_get_record_addr(cmd, i));
- fprintf(stderr, "%s: record[%d].length: 0x%llx\n", __func__, i,
- ndctl_cmd_ars_get_record_len(cmd, i));
- }
-
- check->cmd = cmd;
- return 0;
-}
-
-#ifdef HAVE_NDCTL_CLEAR_ERROR
-static int check_clear_error(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
- struct check_cmd *check)
-{
- struct ndctl_cmd *ars_cap = check_cmds[ND_CMD_ARS_CAP].cmd;
- struct ndctl_cmd *clear_err;
- unsigned long long cleared;
- struct ndctl_range range;
- int rc;
-
- if (check->cmd != NULL) {
- fprintf(stderr, "%s: expected a NULL command, by default\n",
- __func__);
- return -ENXIO;
- }
-
- if (ndctl_cmd_ars_cap_get_range(ars_cap, &range)) {
- fprintf(stderr, "failed to get ars_cap range\n");
- return -ENXIO;
- }
-
- clear_err = ndctl_bus_cmd_new_clear_error(range.address, SZ_4K,
- ars_cap);
- if (!clear_err) {
- fprintf(stderr, "%s: bus: %s failed to create cmd\n",
- __func__, ndctl_bus_get_provider(bus));
- return -ENOTTY;
- }
-
- rc = ndctl_cmd_submit(clear_err);
- if (rc) {
- fprintf(stderr, "%s: bus: %s failed to submit cmd: %d\n",
- __func__, ndctl_bus_get_provider(bus), rc);
- ndctl_cmd_unref(clear_err);
- return rc;
- }
-
- cleared = ndctl_cmd_clear_error_get_cleared(clear_err);
- if (cleared != SZ_4K) {
- fprintf(stderr, "%s: bus: %s expected to clear: %d actual: %lld\n",
- __func__, ndctl_bus_get_provider(bus), SZ_4K,
- cleared);
- return -ENXIO;
- }
-
- check->cmd = clear_err;
- return 0;
-}
-#endif /* HAVE_NDCTL_CLEAR_ERROR */
-#endif /* HAVE_NDCTL_ARS */
-
#define BITS_PER_LONG 32
static int check_commands(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
unsigned long bus_commands, unsigned long dimm_commands,
@@ -2387,16 +2209,7 @@ static int check_commands(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
.test = test,
},
};
- static struct check_cmd __check_bus_cmds[] = {
-#ifdef HAVE_NDCTL_ARS
- [ND_CMD_ARS_CAP] = { check_ars_cap },
- [ND_CMD_ARS_START] = { check_ars_start },
- [ND_CMD_ARS_STATUS] = { check_ars_status },
-#ifdef HAVE_NDCTL_CLEAR_ERROR
- [ND_CMD_CLEAR_ERROR] = { check_clear_error },
-#endif
-#endif
- };
+
unsigned int i, rc = 0;
/*
@@ -2441,34 +2254,6 @@ static int check_commands(struct ndctl_bus *bus, struct ndctl_dimm *dimm,
if (!ndctl_test_attempt(test, KERNEL_VERSION(4, 6, 0)))
goto out;
- /* Check Bus commands */
- check_cmds = __check_bus_cmds;
- for (i = 1; i < BITS_PER_LONG; i++) {
- struct check_cmd *check = &check_cmds[i];
-
- if ((bus_commands & (1UL << i)) == 0)
- continue;
- if (!ndctl_bus_is_cmd_supported(bus, i)) {
- fprintf(stderr, "%s: bus: %s expected cmd: %s supported\n",
- __func__,
- ndctl_bus_get_provider(bus),
- ndctl_bus_get_cmd_name(bus, i));
- return -ENXIO;
- }
-
- if (!check->check_fn)
- continue;
- rc = check->check_fn(bus, dimm, check);
- if (rc)
- break;
- }
-
- for (i = 1; i < ARRAY_SIZE(__check_bus_cmds); i++) {
- if (__check_bus_cmds[i].cmd)
- ndctl_cmd_unref(__check_bus_cmds[i].cmd);
- __check_bus_cmds[i].cmd = NULL;
- }
-
out:
return rc;
}
With the addition of support to clear poison list and badblocks on a per region level, the bus checking functions will be moved to devdax-error test to test directly on device dax. The command issued to active pmem are expected to fail. Signed-off-by: Dave Jiang <dave.jiang@intel.com> --- test/libndctl.c | 217 ------------------------------------------------------- 1 file changed, 1 insertion(+), 216 deletions(-)