* [ndctl PATCH v4] ndctl, test: add a new unit test for monitor
@ 2018-07-10 10:04 QI Fuli
2018-07-10 15:11 ` Masayoshi Mizuma
2018-07-10 20:25 ` Masayoshi Mizuma
0 siblings, 2 replies; 4+ messages in thread
From: QI Fuli @ 2018-07-10 10:04 UTC (permalink / raw)
To: linux-nvdimm
Add a new unit test to test the following options of the monitor command.
--dimm
--bus
--region
--namespace
--logfile
--config-file
Based-on-patch-by: Yasunori Goto <y-goto@jp.fujitsu.com>
Signed-off-by: QI Fuli <qi.fuli@jp.fujitsu.com>
---
v3 -> v4:
Add list-smart-dimm() helper to list and filter smart supported dimms
v2 -> v3:
- Add filter_obj instead of hard-coded values
v1 -> v2:
- Add init()
- Add get_filter_dimm() to get the filter dimms by ndctl list command
instead of hard-cording
- Add sleep to call_notify()
.gitignore | 1 +
test/Makefile.am | 14 +++-
test/list-smart-dimm.c | 117 +++++++++++++++++++++++++++++++++
test/monitor.sh | 146 +++++++++++++++++++++++++++++++++++++++++
4 files changed, 276 insertions(+), 2 deletions(-)
create mode 100644 test/list-smart-dimm.c
create mode 100755 test/monitor.sh
diff --git a/.gitignore b/.gitignore
index 1016b3b..0baace4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -56,3 +56,4 @@ test/smart-notify
test/fio.job
test/local-write-0-verify.state
test/ack-shutdown-count-set
+test/list-smart-dimm
diff --git a/test/Makefile.am b/test/Makefile.am
index cd451e9..8c55056 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -21,7 +21,8 @@ TESTS =\
btt-pad-compat.sh \
firmware-update.sh \
ack-shutdown-count-set \
- rescan-partitions.sh
+ rescan-partitions.sh \
+ monitor.sh
check_PROGRAMS =\
libndctl \
@@ -34,7 +35,8 @@ check_PROGRAMS =\
smart-listen \
hugetlb \
daxdev-errors \
- ack-shutdown-count-set
+ ack-shutdown-count-set \
+ list-smart-dimm
if ENABLE_DESTRUCTIVE
TESTS +=\
@@ -151,3 +153,11 @@ multi_pmem_LDADD = \
$(UUID_LIBS) \
$(KMOD_LIBS) \
../libutil.a
+
+list_smart_dimm_SOURCES = \
+ list-smart-dimm.c \
+ ../util/json.c
+list_smart_dimm_LDADD = \
+ $(LIBNDCTL_LIB) \
+ $(JSON_LIBS) \
+ ../libutil.a
diff --git a/test/list-smart-dimm.c b/test/list-smart-dimm.c
new file mode 100644
index 0000000..c9982d5
--- /dev/null
+++ b/test/list-smart-dimm.c
@@ -0,0 +1,117 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/* Copyright(c) 2018, FUJITSU LIMITED. All rights reserved. */
+
+#include <stdio.h>
+#include <errno.h>
+#include <util/json.h>
+#include <util/filter.h>
+#include <json-c/json.h>
+#include <ndctl/libndctl.h>
+#include <util/parse-options.h>
+#include <ndctl.h>
+
+struct util_filter_params param;
+static int did_fail;
+static int jflag = JSON_C_TO_STRING_PRETTY;
+
+#define fail(fmt, ...) \
+do { \
+ did_fail = 1; \
+ fprintf(stderr, "ndctl-%s:%s:%d: " fmt, \
+ VERSION, __func__, __LINE__, ##__VA_ARGS__); \
+} while (0)
+
+static bool filter_region(struct ndctl_region *region,
+ struct util_filter_ctx *ctx)
+{
+ return true;
+}
+
+static void filter_dimm(struct ndctl_dimm *dimm, struct util_filter_ctx *ctx)
+{
+ struct list_filter_arg *lfa = ctx->list;
+ struct json_object *jdimm;
+
+ if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART))
+ return;
+ if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART_THRESHOLD))
+ return;
+ if (!ndctl_dimm_is_flag_supported(dimm, ND_SMART_ALARM_VALID))
+ return;
+
+ if (!lfa->jdimms) {
+ lfa->jdimms = json_object_new_array();
+ if (!lfa->jdimms) {
+ fail("\n");
+ return;
+ }
+ }
+
+ jdimm = util_dimm_to_json(dimm, lfa->flags);
+ if (!jdimm) {
+ fail("\n");
+ return;
+ }
+
+ json_object_array_add(lfa->jdimms, jdimm);
+}
+
+static bool filter_bus(struct ndctl_bus *bus, struct util_filter_ctx *ctx)
+{
+ return true;
+}
+
+static int list_display(struct list_filter_arg *lfa)
+{
+ struct json_object *jdimms = lfa->jdimms;
+
+ if (jdimms)
+ util_display_json_array(stdout, jdimms, jflag);
+ return 0;
+}
+
+int main(int argc, const char *argv[])
+{
+ struct ndctl_ctx *ctx;
+ int i, rc;
+ const struct option options[] = {
+ OPT_STRING('b', "bus", ¶m.bus, "bus-id", "filter by bus"),
+ OPT_STRING('r', "region", ¶m.region, "region-id",
+ "filter by region"),
+ OPT_STRING('d', "dimm", ¶m.dimm, "dimm-id",
+ "filter by dimm"),
+ OPT_STRING('n', "namespace", ¶m.namespace, "namespace-id",
+ "filter by namespace id"),
+ OPT_END(),
+ };
+ const char * const u[] = {
+ "list-smart-dimm [<options>]",
+ NULL
+ };
+ struct util_filter_ctx fctx = { 0 };
+ struct list_filter_arg lfa = { 0 };
+
+ rc = ndctl_new(&ctx);
+ if (rc < 0)
+ return EXIT_FAILURE;
+ argc = parse_options(argc, argv, options, u, 0);
+ for (i = 0; i < argc; i++)
+ error("unknown parameter \"%s\"\n", argv[i]);
+ if (argc)
+ usage_with_options(u, options);
+
+ fctx.filter_bus = filter_bus;
+ fctx.filter_dimm = filter_dimm;
+ fctx.filter_region = filter_region;
+ fctx.filter_namespace = NULL;
+ fctx.list = &lfa;
+ lfa.flags = 0;
+
+ rc = util_filter_walk(ctx, &fctx, ¶m);
+ if (rc)
+ return rc;
+
+ if (list_display(&lfa) || did_fail)
+ return -ENOMEM;
+ return 0;
+}
diff --git a/test/monitor.sh b/test/monitor.sh
new file mode 100755
index 0000000..1401983
--- /dev/null
+++ b/test/monitor.sh
@@ -0,0 +1,146 @@
+#!/bin/bash -Ex
+
+# SPDX-License-Identifier: GPL-2.0
+# Copyright(c) 2018, FUJITSU LIMITED. All rights reserved.
+
+rc=77
+logfile=""
+conf_file=""
+monitor_dimms=""
+monitor_regions=""
+monitor_namespace=""
+monitor_pid=65536
+
+. ./common
+
+trap 'err $LINENO' ERR
+
+check_min_kver "4.15" || do_skip "kernel $KVER may not support monitor service"
+
+start_monitor()
+{
+ logfile=$(mktemp)
+ $NDCTL monitor -l $logfile $1 &
+ monitor_pid=$!
+ truncate --size 0 $logfile #remove startup log
+}
+
+get_monitor_dimm()
+{
+ jlist=$(./list-smart-dimm -b $smart_supported_bus $1)
+ monitor_dimms=$(jq '.[]."dev"?, ."dev"?' <<<$jlist | sort | uniq | xargs)
+}
+
+call_notify()
+{
+ ./smart-notify $smart_supported_bus
+ sync; sleep 3
+}
+
+check_result()
+{
+ jlog=$(cat $logfile)
+ notify_dimms=$(jq ."dimm"."dev" <<<$jlog | sort | uniq | xargs)
+ [[ $monitor_dimms == $notify_dimms ]]
+}
+
+stop_monitor()
+{
+ kill $monitor_pid
+ rm $logfile
+}
+
+create_conf_file()
+{
+ conf_file=$(mktemp)
+ echo "dimm = $1" > $conf_file
+}
+
+test_filter_dimm()
+{
+ smart_supported_bus=$NFIT_TEST_BUS0
+ monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
+ if [ -z $monitor_dimms ]; then
+ smart_supported_bus=$NFIT_TEST_BUS1
+ monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
+ fi
+ start_monitor "-d $monitor_dimms"
+ call_notify
+ check_result
+ stop_monitor
+}
+
+test_filter_bus()
+{
+ monitor_dimms=""
+ get_monitor_dimm
+ start_monitor "-b $smart_supported_bus"
+ call_notify
+ check_result
+ stop_monitor
+}
+
+test_filter_region()
+{
+ monitor_dimms=""
+ monitor_region=""
+ count=$($NDCTL list -R -b $smart_supported_bus | jq -r .[].dev | wc -l)
+ i=0
+ while [ $i -lt $count ]; do
+ monitor_region=$($NDCTL list -R -b $smart_supported_bus | jq -r .[$i].dev)
+ get_monitor_dimm "-r $monitor_region"
+ [ ! -z $monitor_dimms ] && break
+ i=$[$i+1]
+ done
+ start_monitor "-r $monitor_region"
+ call_notify
+ check_result
+ stop_monitor
+}
+
+test_filter_namespace()
+{
+ monitor_dimms=""
+ monitor_namespace=$($NDCTL list -N -b $smart_supported_bus | jq -r .[0].dev)
+ [ -z $monitor_namespace ] && monitor_namespace="namespace1.0"
+ $NDCTL create-namespace -b $smart_supported_bus -n $monitor_namespace
+ get_monitor_dimm "-n $monitor_namespace"
+ start_monitor "-n $monitor_namespace"
+ call_notify
+ check_result
+ stop_monitor
+ $NDCTL destroy-namespace $monitor_namespace -f
+}
+
+test_conf_file()
+{
+ create_conf_file "$monitor_dimms"
+ start_monitor "-c $conf_file"
+ call_notify
+ check_result
+ stop_monitor
+ rm $conf_file
+}
+
+do_tests()
+{
+ test_filter_dimm
+ test_filter_bus
+ test_filter_region
+ test_filter_namespace
+ test_conf_file
+}
+
+init()
+{
+ $NDCTL disable-region -b $NFIT_TEST_BUS0 all
+ $NDCTL zero-labels -b $NFIT_TEST_BUS0 all
+ $NDCTL enable-region -b $NFIT_TEST_BUS0 all
+}
+
+modprobe nfit_test
+rc=1
+init
+do_tests
+_cleanup
+exit 0
--
2.18.0
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [ndctl PATCH v4] ndctl, test: add a new unit test for monitor
2018-07-10 10:04 [ndctl PATCH v4] ndctl, test: add a new unit test for monitor QI Fuli
@ 2018-07-10 15:11 ` Masayoshi Mizuma
2018-07-10 23:59 ` Qi, Fuli
2018-07-10 20:25 ` Masayoshi Mizuma
1 sibling, 1 reply; 4+ messages in thread
From: Masayoshi Mizuma @ 2018-07-10 15:11 UTC (permalink / raw)
To: qi.fuli, linux-nvdimm
Hi Qi
Thank you for creating the v4 test, but unfortunately the test has failed...
On 07/10/2018 06:04 AM, QI Fuli wrote:
> Add a new unit test to test the following options of the monitor command.
> --dimm
> --bus
> --region
> --namespace
> --logfile
> --config-file
>
> Based-on-patch-by: Yasunori Goto <y-goto@jp.fujitsu.com>
> Signed-off-by: QI Fuli <qi.fuli@jp.fujitsu.com>
> ---
> v3 -> v4:
> Add list-smart-dimm() helper to list and filter smart supported dimms
> v2 -> v3:
> - Add filter_obj instead of hard-coded values
> v1 -> v2:
> - Add init()
> - Add get_filter_dimm() to get the filter dimms by ndctl list command
> instead of hard-cording
> - Add sleep to call_notify()
>
> .gitignore | 1 +
> test/Makefile.am | 14 +++-
> test/list-smart-dimm.c | 117 +++++++++++++++++++++++++++++++++
> test/monitor.sh | 146 +++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 276 insertions(+), 2 deletions(-)
> create mode 100644 test/list-smart-dimm.c
> create mode 100755 test/monitor.sh
>
> diff --git a/.gitignore b/.gitignore
> index 1016b3b..0baace4 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -56,3 +56,4 @@ test/smart-notify
> test/fio.job
> test/local-write-0-verify.state
> test/ack-shutdown-count-set
> +test/list-smart-dimm
> diff --git a/test/Makefile.am b/test/Makefile.am
> index cd451e9..8c55056 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -21,7 +21,8 @@ TESTS =\
> btt-pad-compat.sh \
> firmware-update.sh \
> ack-shutdown-count-set \
> - rescan-partitions.sh
> + rescan-partitions.sh \
> + monitor.sh
>
> check_PROGRAMS =\
> libndctl \
> @@ -34,7 +35,8 @@ check_PROGRAMS =\
> smart-listen \
> hugetlb \
> daxdev-errors \
> - ack-shutdown-count-set
> + ack-shutdown-count-set \
> + list-smart-dimm
>
> if ENABLE_DESTRUCTIVE
> TESTS +=\
> @@ -151,3 +153,11 @@ multi_pmem_LDADD = \
> $(UUID_LIBS) \
> $(KMOD_LIBS) \
> ../libutil.a
> +
> +list_smart_dimm_SOURCES = \
> + list-smart-dimm.c \
> + ../util/json.c
> +list_smart_dimm_LDADD = \
> + $(LIBNDCTL_LIB) \
> + $(JSON_LIBS) \
> + ../libutil.a
> diff --git a/test/list-smart-dimm.c b/test/list-smart-dimm.c
> new file mode 100644
> index 0000000..c9982d5
> --- /dev/null
> +++ b/test/list-smart-dimm.c
> @@ -0,0 +1,117 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/* Copyright(c) 2018, FUJITSU LIMITED. All rights reserved. */
> +
> +#include <stdio.h>
> +#include <errno.h>
> +#include <util/json.h>
> +#include <util/filter.h>
> +#include <json-c/json.h>
> +#include <ndctl/libndctl.h>
> +#include <util/parse-options.h>
> +#include <ndctl.h>
> +
> +struct util_filter_params param;
> +static int did_fail;
> +static int jflag = JSON_C_TO_STRING_PRETTY;
> +
> +#define fail(fmt, ...) \
> +do { \
> + did_fail = 1; \
> + fprintf(stderr, "ndctl-%s:%s:%d: " fmt, \
> + VERSION, __func__, __LINE__, ##__VA_ARGS__); \
> +} while (0)
> +
> +static bool filter_region(struct ndctl_region *region,
> + struct util_filter_ctx *ctx)
> +{
> + return true;
> +}
> +
> +static void filter_dimm(struct ndctl_dimm *dimm, struct util_filter_ctx *ctx)
> +{
> + struct list_filter_arg *lfa = ctx->list;
> + struct json_object *jdimm;
> +
> + if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART))
> + return;
> + if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART_THRESHOLD))
> + return;
> + if (!ndctl_dimm_is_flag_supported(dimm, ND_SMART_ALARM_VALID))
> + return;
> +
> + if (!lfa->jdimms) {
> + lfa->jdimms = json_object_new_array();
> + if (!lfa->jdimms) {
> + fail("\n");
> + return;
> + }
> + }
> +
> + jdimm = util_dimm_to_json(dimm, lfa->flags);
> + if (!jdimm) {
> + fail("\n");
> + return;
> + }
> +
> + json_object_array_add(lfa->jdimms, jdimm);
> +}
> +
> +static bool filter_bus(struct ndctl_bus *bus, struct util_filter_ctx *ctx)
> +{
> + return true;
> +}
> +
> +static int list_display(struct list_filter_arg *lfa)
> +{
> + struct json_object *jdimms = lfa->jdimms;
> +
> + if (jdimms)
> + util_display_json_array(stdout, jdimms, jflag);
> + return 0;
> +}
> +
> +int main(int argc, const char *argv[])
> +{
> + struct ndctl_ctx *ctx;
> + int i, rc;
> + const struct option options[] = {
> + OPT_STRING('b', "bus", ¶m.bus, "bus-id", "filter by bus"),
> + OPT_STRING('r', "region", ¶m.region, "region-id",
> + "filter by region"),
> + OPT_STRING('d', "dimm", ¶m.dimm, "dimm-id",
> + "filter by dimm"),
> + OPT_STRING('n', "namespace", ¶m.namespace, "namespace-id",
> + "filter by namespace id"),
> + OPT_END(),
> + };
> + const char * const u[] = {
> + "list-smart-dimm [<options>]",
> + NULL
> + };
> + struct util_filter_ctx fctx = { 0 };
> + struct list_filter_arg lfa = { 0 };
> +
> + rc = ndctl_new(&ctx);
> + if (rc < 0)
> + return EXIT_FAILURE;
> + argc = parse_options(argc, argv, options, u, 0);
> + for (i = 0; i < argc; i++)
> + error("unknown parameter \"%s\"\n", argv[i]);
> + if (argc)
> + usage_with_options(u, options);
> +
> + fctx.filter_bus = filter_bus;
> + fctx.filter_dimm = filter_dimm;
> + fctx.filter_region = filter_region;
> + fctx.filter_namespace = NULL;
> + fctx.list = &lfa;
> + lfa.flags = 0;
> +
> + rc = util_filter_walk(ctx, &fctx, ¶m);
> + if (rc)
> + return rc;
> +
> + if (list_display(&lfa) || did_fail)
> + return -ENOMEM;
> + return 0;
> +}
> diff --git a/test/monitor.sh b/test/monitor.sh
> new file mode 100755
> index 0000000..1401983
> --- /dev/null
> +++ b/test/monitor.sh
> @@ -0,0 +1,146 @@
> +#!/bin/bash -Ex
> +
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright(c) 2018, FUJITSU LIMITED. All rights reserved.
> +
> +rc=77
> +logfile=""
> +conf_file=""
> +monitor_dimms=""
> +monitor_regions=""
> +monitor_namespace=""
> +monitor_pid=65536
> +
> +. ./common
> +
> +trap 'err $LINENO' ERR
> +
> +check_min_kver "4.15" || do_skip "kernel $KVER may not support monitor service"
> +
> +start_monitor()
> +{
> + logfile=$(mktemp)
> + $NDCTL monitor -l $logfile $1 &
> + monitor_pid=$!
> + truncate --size 0 $logfile #remove startup log
> +}
> +
> +get_monitor_dimm()
> +{
> + jlist=$(./list-smart-dimm -b $smart_supported_bus $1)
> + monitor_dimms=$(jq '.[]."dev"?, ."dev"?' <<<$jlist | sort | uniq | xargs)
> +}
> +
> +call_notify()
> +{
> + ./smart-notify $smart_supported_bus
> + sync; sleep 3
> +}
> +
> +check_result()
> +{
> + jlog=$(cat $logfile)
> + notify_dimms=$(jq ."dimm"."dev" <<<$jlog | sort | uniq | xargs)
> + [[ $monitor_dimms == $notify_dimms ]]
> +}
> +
> +stop_monitor()
> +{
> + kill $monitor_pid
> + rm $logfile
> +}
> +
> +create_conf_file()
> +{
> + conf_file=$(mktemp)
> + echo "dimm = $1" > $conf_file
> +}
> +
> +test_filter_dimm()
> +{
> + smart_supported_bus=$NFIT_TEST_BUS0
> + monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
> + if [ -z $monitor_dimms ]; then
> + smart_supported_bus=$NFIT_TEST_BUS1
> + monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
> + fi
> + start_monitor "-d $monitor_dimms"
> + call_notify
> + check_result
> + stop_monitor
> +}
> +
> +test_filter_bus()
> +{
> + monitor_dimms=""
> + get_monitor_dimm
> + start_monitor "-b $smart_supported_bus"
> + call_notify
> + check_result
> + stop_monitor
> +}
> +
> +test_filter_region()
> +{
> + monitor_dimms=""
> + monitor_region=""
> + count=$($NDCTL list -R -b $smart_supported_bus | jq -r .[].dev | wc -l)
> + i=0
> + while [ $i -lt $count ]; do
> + monitor_region=$($NDCTL list -R -b $smart_supported_bus | jq -r .[$i].dev)
> + get_monitor_dimm "-r $monitor_region"
> + [ ! -z $monitor_dimms ] && break
> + i=$[$i+1]
> + done
> + start_monitor "-r $monitor_region"
> + call_notify
> + check_result
> + stop_monitor
> +}
> +
> +test_filter_namespace()
> +{
> + monitor_dimms=""
> + monitor_namespace=$($NDCTL list -N -b $smart_supported_bus | jq -r .[0].dev)
> + [ -z $monitor_namespace ] && monitor_namespace="namespace1.0"
> + $NDCTL create-namespace -b $smart_supported_bus -n $monitor_namespace
namespace1.0 may be used by the other bus. Actually my test failed because
namespace1.0 was used by the other bus.
How about the following instead?
- monitor_namespace=$($NDCTL list -N -b $smart_supported_bus | jq -r .[0].dev)
- [ -z $monitor_namespace ] && monitor_namespace="namespace1.0"
- $NDCTL create-namespace -b $smart_supported_bus -n $monitor_namespace
+ init
+ monitor_namespace=$($NDCTL create-namespace -b $smart_supported_bus | jq -r .dev)
Thanks,
Masa
> + get_monitor_dimm "-n $monitor_namespace"
> + start_monitor "-n $monitor_namespace"
> + call_notify
> + check_result
> + stop_monitor
> + $NDCTL destroy-namespace $monitor_namespace -f
> +}
> +
> +test_conf_file()
> +{
> + create_conf_file "$monitor_dimms"
> + start_monitor "-c $conf_file"
> + call_notify
> + check_result
> + stop_monitor
> + rm $conf_file
> +}
> +
> +do_tests()
> +{
> + test_filter_dimm
> + test_filter_bus
> + test_filter_region
> + test_filter_namespace
> + test_conf_file
> +}
> +
> +init()
> +{
> + $NDCTL disable-region -b $NFIT_TEST_BUS0 all
> + $NDCTL zero-labels -b $NFIT_TEST_BUS0 all
> + $NDCTL enable-region -b $NFIT_TEST_BUS0 all
> +}
> +
> +modprobe nfit_test
> +rc=1
> +init
> +do_tests
> +_cleanup
> +exit 0
>
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [ndctl PATCH v4] ndctl, test: add a new unit test for monitor
2018-07-10 10:04 [ndctl PATCH v4] ndctl, test: add a new unit test for monitor QI Fuli
2018-07-10 15:11 ` Masayoshi Mizuma
@ 2018-07-10 20:25 ` Masayoshi Mizuma
1 sibling, 0 replies; 4+ messages in thread
From: Masayoshi Mizuma @ 2018-07-10 20:25 UTC (permalink / raw)
To: qi.fuli, linux-nvdimm
On 07/10/2018 06:04 AM, QI Fuli wrote:
> Add a new unit test to test the following options of the monitor command.
> --dimm
> --bus
> --region
> --namespace
> --logfile
> --config-file
Why don't you add '-D' option test? Like as:
test_filter_dimmevent()
{
get_monitor_dimm
monitor_dimms="$(echo $monitor_dimms | awk '{print $1}')"
start_monitor "-d $monitor_dimms -D dimm-unclean-shutdown"
$NDCTL inject-smart -U $monitor_dimms
check_result
stop_monitor
}
Thanks,
Masa
>
> Based-on-patch-by: Yasunori Goto <y-goto@jp.fujitsu.com>
> Signed-off-by: QI Fuli <qi.fuli@jp.fujitsu.com>
> ---
> v3 -> v4:
> Add list-smart-dimm() helper to list and filter smart supported dimms
> v2 -> v3:
> - Add filter_obj instead of hard-coded values
> v1 -> v2:
> - Add init()
> - Add get_filter_dimm() to get the filter dimms by ndctl list command
> instead of hard-cording
> - Add sleep to call_notify()
>
> .gitignore | 1 +
> test/Makefile.am | 14 +++-
> test/list-smart-dimm.c | 117 +++++++++++++++++++++++++++++++++
> test/monitor.sh | 146 +++++++++++++++++++++++++++++++++++++++++
> 4 files changed, 276 insertions(+), 2 deletions(-)
> create mode 100644 test/list-smart-dimm.c
> create mode 100755 test/monitor.sh
>
> diff --git a/.gitignore b/.gitignore
> index 1016b3b..0baace4 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -56,3 +56,4 @@ test/smart-notify
> test/fio.job
> test/local-write-0-verify.state
> test/ack-shutdown-count-set
> +test/list-smart-dimm
> diff --git a/test/Makefile.am b/test/Makefile.am
> index cd451e9..8c55056 100644
> --- a/test/Makefile.am
> +++ b/test/Makefile.am
> @@ -21,7 +21,8 @@ TESTS =\
> btt-pad-compat.sh \
> firmware-update.sh \
> ack-shutdown-count-set \
> - rescan-partitions.sh
> + rescan-partitions.sh \
> + monitor.sh
>
> check_PROGRAMS =\
> libndctl \
> @@ -34,7 +35,8 @@ check_PROGRAMS =\
> smart-listen \
> hugetlb \
> daxdev-errors \
> - ack-shutdown-count-set
> + ack-shutdown-count-set \
> + list-smart-dimm
>
> if ENABLE_DESTRUCTIVE
> TESTS +=\
> @@ -151,3 +153,11 @@ multi_pmem_LDADD = \
> $(UUID_LIBS) \
> $(KMOD_LIBS) \
> ../libutil.a
> +
> +list_smart_dimm_SOURCES = \
> + list-smart-dimm.c \
> + ../util/json.c
> +list_smart_dimm_LDADD = \
> + $(LIBNDCTL_LIB) \
> + $(JSON_LIBS) \
> + ../libutil.a
> diff --git a/test/list-smart-dimm.c b/test/list-smart-dimm.c
> new file mode 100644
> index 0000000..c9982d5
> --- /dev/null
> +++ b/test/list-smart-dimm.c
> @@ -0,0 +1,117 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/* Copyright(c) 2018, FUJITSU LIMITED. All rights reserved. */
> +
> +#include <stdio.h>
> +#include <errno.h>
> +#include <util/json.h>
> +#include <util/filter.h>
> +#include <json-c/json.h>
> +#include <ndctl/libndctl.h>
> +#include <util/parse-options.h>
> +#include <ndctl.h>
> +
> +struct util_filter_params param;
> +static int did_fail;
> +static int jflag = JSON_C_TO_STRING_PRETTY;
> +
> +#define fail(fmt, ...) \
> +do { \
> + did_fail = 1; \
> + fprintf(stderr, "ndctl-%s:%s:%d: " fmt, \
> + VERSION, __func__, __LINE__, ##__VA_ARGS__); \
> +} while (0)
> +
> +static bool filter_region(struct ndctl_region *region,
> + struct util_filter_ctx *ctx)
> +{
> + return true;
> +}
> +
> +static void filter_dimm(struct ndctl_dimm *dimm, struct util_filter_ctx *ctx)
> +{
> + struct list_filter_arg *lfa = ctx->list;
> + struct json_object *jdimm;
> +
> + if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART))
> + return;
> + if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART_THRESHOLD))
> + return;
> + if (!ndctl_dimm_is_flag_supported(dimm, ND_SMART_ALARM_VALID))
> + return;
> +
> + if (!lfa->jdimms) {
> + lfa->jdimms = json_object_new_array();
> + if (!lfa->jdimms) {
> + fail("\n");
> + return;
> + }
> + }
> +
> + jdimm = util_dimm_to_json(dimm, lfa->flags);
> + if (!jdimm) {
> + fail("\n");
> + return;
> + }
> +
> + json_object_array_add(lfa->jdimms, jdimm);
> +}
> +
> +static bool filter_bus(struct ndctl_bus *bus, struct util_filter_ctx *ctx)
> +{
> + return true;
> +}
> +
> +static int list_display(struct list_filter_arg *lfa)
> +{
> + struct json_object *jdimms = lfa->jdimms;
> +
> + if (jdimms)
> + util_display_json_array(stdout, jdimms, jflag);
> + return 0;
> +}
> +
> +int main(int argc, const char *argv[])
> +{
> + struct ndctl_ctx *ctx;
> + int i, rc;
> + const struct option options[] = {
> + OPT_STRING('b', "bus", ¶m.bus, "bus-id", "filter by bus"),
> + OPT_STRING('r', "region", ¶m.region, "region-id",
> + "filter by region"),
> + OPT_STRING('d', "dimm", ¶m.dimm, "dimm-id",
> + "filter by dimm"),
> + OPT_STRING('n', "namespace", ¶m.namespace, "namespace-id",
> + "filter by namespace id"),
> + OPT_END(),
> + };
> + const char * const u[] = {
> + "list-smart-dimm [<options>]",
> + NULL
> + };
> + struct util_filter_ctx fctx = { 0 };
> + struct list_filter_arg lfa = { 0 };
> +
> + rc = ndctl_new(&ctx);
> + if (rc < 0)
> + return EXIT_FAILURE;
> + argc = parse_options(argc, argv, options, u, 0);
> + for (i = 0; i < argc; i++)
> + error("unknown parameter \"%s\"\n", argv[i]);
> + if (argc)
> + usage_with_options(u, options);
> +
> + fctx.filter_bus = filter_bus;
> + fctx.filter_dimm = filter_dimm;
> + fctx.filter_region = filter_region;
> + fctx.filter_namespace = NULL;
> + fctx.list = &lfa;
> + lfa.flags = 0;
> +
> + rc = util_filter_walk(ctx, &fctx, ¶m);
> + if (rc)
> + return rc;
> +
> + if (list_display(&lfa) || did_fail)
> + return -ENOMEM;
> + return 0;
> +}
> diff --git a/test/monitor.sh b/test/monitor.sh
> new file mode 100755
> index 0000000..1401983
> --- /dev/null
> +++ b/test/monitor.sh
> @@ -0,0 +1,146 @@
> +#!/bin/bash -Ex
> +
> +# SPDX-License-Identifier: GPL-2.0
> +# Copyright(c) 2018, FUJITSU LIMITED. All rights reserved.
> +
> +rc=77
> +logfile=""
> +conf_file=""
> +monitor_dimms=""
> +monitor_regions=""
> +monitor_namespace=""
> +monitor_pid=65536
> +
> +. ./common
> +
> +trap 'err $LINENO' ERR
> +
> +check_min_kver "4.15" || do_skip "kernel $KVER may not support monitor service"
> +
> +start_monitor()
> +{
> + logfile=$(mktemp)
> + $NDCTL monitor -l $logfile $1 &
> + monitor_pid=$!
> + truncate --size 0 $logfile #remove startup log
> +}
> +
> +get_monitor_dimm()
> +{
> + jlist=$(./list-smart-dimm -b $smart_supported_bus $1)
> + monitor_dimms=$(jq '.[]."dev"?, ."dev"?' <<<$jlist | sort | uniq | xargs)
> +}
> +
> +call_notify()
> +{
> + ./smart-notify $smart_supported_bus
> + sync; sleep 3
> +}
> +
> +check_result()
> +{
> + jlog=$(cat $logfile)
> + notify_dimms=$(jq ."dimm"."dev" <<<$jlog | sort | uniq | xargs)
> + [[ $monitor_dimms == $notify_dimms ]]
> +}
> +
> +stop_monitor()
> +{
> + kill $monitor_pid
> + rm $logfile
> +}
> +
> +create_conf_file()
> +{
> + conf_file=$(mktemp)
> + echo "dimm = $1" > $conf_file
> +}
> +
> +test_filter_dimm()
> +{
> + smart_supported_bus=$NFIT_TEST_BUS0
> + monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
> + if [ -z $monitor_dimms ]; then
> + smart_supported_bus=$NFIT_TEST_BUS1
> + monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
> + fi
> + start_monitor "-d $monitor_dimms"
> + call_notify
> + check_result
> + stop_monitor
> +}
> +
> +test_filter_bus()
> +{
> + monitor_dimms=""
> + get_monitor_dimm
> + start_monitor "-b $smart_supported_bus"
> + call_notify
> + check_result
> + stop_monitor
> +}
> +
> +test_filter_region()
> +{
> + monitor_dimms=""
> + monitor_region=""
> + count=$($NDCTL list -R -b $smart_supported_bus | jq -r .[].dev | wc -l)
> + i=0
> + while [ $i -lt $count ]; do
> + monitor_region=$($NDCTL list -R -b $smart_supported_bus | jq -r .[$i].dev)
> + get_monitor_dimm "-r $monitor_region"
> + [ ! -z $monitor_dimms ] && break
> + i=$[$i+1]
> + done
> + start_monitor "-r $monitor_region"
> + call_notify
> + check_result
> + stop_monitor
> +}
> +
> +test_filter_namespace()
> +{
> + monitor_dimms=""
> + monitor_namespace=$($NDCTL list -N -b $smart_supported_bus | jq -r .[0].dev)
> + [ -z $monitor_namespace ] && monitor_namespace="namespace1.0"
> + $NDCTL create-namespace -b $smart_supported_bus -n $monitor_namespace
> + get_monitor_dimm "-n $monitor_namespace"
> + start_monitor "-n $monitor_namespace"
> + call_notify
> + check_result
> + stop_monitor
> + $NDCTL destroy-namespace $monitor_namespace -f
> +}
> +
> +test_conf_file()
> +{
> + create_conf_file "$monitor_dimms"
> + start_monitor "-c $conf_file"
> + call_notify
> + check_result
> + stop_monitor
> + rm $conf_file
> +}
> +
> +do_tests()
> +{
> + test_filter_dimm
> + test_filter_bus
> + test_filter_region
> + test_filter_namespace
> + test_conf_file
> +}
> +
> +init()
> +{
> + $NDCTL disable-region -b $NFIT_TEST_BUS0 all
> + $NDCTL zero-labels -b $NFIT_TEST_BUS0 all
> + $NDCTL enable-region -b $NFIT_TEST_BUS0 all
> +}
> +
> +modprobe nfit_test
> +rc=1
> +init
> +do_tests
> +_cleanup
> +exit 0
>
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [ndctl PATCH v4] ndctl, test: add a new unit test for monitor
2018-07-10 15:11 ` Masayoshi Mizuma
@ 2018-07-10 23:59 ` Qi, Fuli
0 siblings, 0 replies; 4+ messages in thread
From: Qi, Fuli @ 2018-07-10 23:59 UTC (permalink / raw)
To: 'Masayoshi Mizuma', linux-nvdimm
> -----Original Message-----
> From: Masayoshi Mizuma [mailto:msys.mizuma@gmail.com]
> Sent: Wednesday, July 11, 2018 12:11 AM
> To: Qi, Fuli/斉 福利 <qi.fuli@jp.fujitsu.com>; linux-nvdimm@lists.01.org
> Subject: Re: [ndctl PATCH v4] ndctl, test: add a new unit test for monitor
>
> Hi Qi
>
> Thank you for creating the v4 test, but unfortunately the test has failed...
>
> On 07/10/2018 06:04 AM, QI Fuli wrote:
> > Add a new unit test to test the following options of the monitor command.
> > --dimm
> > --bus
> > --region
> > --namespace
> > --logfile
> > --config-file
> >
> > Based-on-patch-by: Yasunori Goto <y-goto@jp.fujitsu.com>
> > Signed-off-by: QI Fuli <qi.fuli@jp.fujitsu.com>
> > ---
> > v3 -> v4:
> > Add list-smart-dimm() helper to list and filter smart supported
> > dimms
> > v2 -> v3:
> > - Add filter_obj instead of hard-coded values
> > v1 -> v2:
> > - Add init()
> > - Add get_filter_dimm() to get the filter dimms by ndctl list command
> > instead of hard-cording
> > - Add sleep to call_notify()
> >
> > .gitignore | 1 +
> > test/Makefile.am | 14 +++-
> > test/list-smart-dimm.c | 117 +++++++++++++++++++++++++++++++++
> > test/monitor.sh | 146 +++++++++++++++++++++++++++++++++++++++++
> > 4 files changed, 276 insertions(+), 2 deletions(-) create mode
> > 100644 test/list-smart-dimm.c create mode 100755 test/monitor.sh
> >
> > diff --git a/.gitignore b/.gitignore
> > index 1016b3b..0baace4 100644
> > --- a/.gitignore
> > +++ b/.gitignore
> > @@ -56,3 +56,4 @@ test/smart-notify
> > test/fio.job
> > test/local-write-0-verify.state
> > test/ack-shutdown-count-set
> > +test/list-smart-dimm
> > diff --git a/test/Makefile.am b/test/Makefile.am index
> > cd451e9..8c55056 100644
> > --- a/test/Makefile.am
> > +++ b/test/Makefile.am
> > @@ -21,7 +21,8 @@ TESTS =\
> > btt-pad-compat.sh \
> > firmware-update.sh \
> > ack-shutdown-count-set \
> > - rescan-partitions.sh
> > + rescan-partitions.sh \
> > + monitor.sh
> >
> > check_PROGRAMS =\
> > libndctl \
> > @@ -34,7 +35,8 @@ check_PROGRAMS =\
> > smart-listen \
> > hugetlb \
> > daxdev-errors \
> > - ack-shutdown-count-set
> > + ack-shutdown-count-set \
> > + list-smart-dimm
> >
> > if ENABLE_DESTRUCTIVE
> > TESTS +=\
> > @@ -151,3 +153,11 @@ multi_pmem_LDADD = \
> > $(UUID_LIBS) \
> > $(KMOD_LIBS) \
> > ../libutil.a
> > +
> > +list_smart_dimm_SOURCES = \
> > + list-smart-dimm.c \
> > + ../util/json.c
> > +list_smart_dimm_LDADD = \
> > + $(LIBNDCTL_LIB) \
> > + $(JSON_LIBS) \
> > + ../libutil.a
> > diff --git a/test/list-smart-dimm.c b/test/list-smart-dimm.c new file
> > mode 100644 index 0000000..c9982d5
> > --- /dev/null
> > +++ b/test/list-smart-dimm.c
> > @@ -0,0 +1,117 @@
> > +/* SPDX-License-Identifier: GPL-2.0 */
> > +/* Copyright(c) 2018, FUJITSU LIMITED. All rights reserved. */
> > +
> > +#include <stdio.h>
> > +#include <errno.h>
> > +#include <util/json.h>
> > +#include <util/filter.h>
> > +#include <json-c/json.h>
> > +#include <ndctl/libndctl.h>
> > +#include <util/parse-options.h>
> > +#include <ndctl.h>
> > +
> > +struct util_filter_params param;
> > +static int did_fail;
> > +static int jflag = JSON_C_TO_STRING_PRETTY;
> > +
> > +#define fail(fmt, ...) \
> > +do { \
> > + did_fail = 1; \
> > + fprintf(stderr, "ndctl-%s:%s:%d: " fmt, \
> > + VERSION, __func__, __LINE__, ##__VA_ARGS__); \ } while (0)
> > +
> > +static bool filter_region(struct ndctl_region *region,
> > + struct util_filter_ctx *ctx)
> > +{
> > + return true;
> > +}
> > +
> > +static void filter_dimm(struct ndctl_dimm *dimm, struct
> > +util_filter_ctx *ctx) {
> > + struct list_filter_arg *lfa = ctx->list;
> > + struct json_object *jdimm;
> > +
> > + if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART))
> > + return;
> > + if (!ndctl_dimm_is_cmd_supported(dimm, ND_CMD_SMART_THRESHOLD))
> > + return;
> > + if (!ndctl_dimm_is_flag_supported(dimm, ND_SMART_ALARM_VALID))
> > + return;
> > +
> > + if (!lfa->jdimms) {
> > + lfa->jdimms = json_object_new_array();
> > + if (!lfa->jdimms) {
> > + fail("\n");
> > + return;
> > + }
> > + }
> > +
> > + jdimm = util_dimm_to_json(dimm, lfa->flags);
> > + if (!jdimm) {
> > + fail("\n");
> > + return;
> > + }
> > +
> > + json_object_array_add(lfa->jdimms, jdimm); }
> > +
> > +static bool filter_bus(struct ndctl_bus *bus, struct util_filter_ctx
> > +*ctx) {
> > + return true;
> > +}
> > +
> > +static int list_display(struct list_filter_arg *lfa) {
> > + struct json_object *jdimms = lfa->jdimms;
> > +
> > + if (jdimms)
> > + util_display_json_array(stdout, jdimms, jflag);
> > + return 0;
> > +}
> > +
> > +int main(int argc, const char *argv[]) {
> > + struct ndctl_ctx *ctx;
> > + int i, rc;
> > + const struct option options[] = {
> > + OPT_STRING('b', "bus", ¶m.bus, "bus-id", "filter by bus"),
> > + OPT_STRING('r', "region", ¶m.region, "region-id",
> > + "filter by region"),
> > + OPT_STRING('d', "dimm", ¶m.dimm, "dimm-id",
> > + "filter by dimm"),
> > + OPT_STRING('n', "namespace", ¶m.namespace, "namespace-id",
> > + "filter by namespace id"),
> > + OPT_END(),
> > + };
> > + const char * const u[] = {
> > + "list-smart-dimm [<options>]",
> > + NULL
> > + };
> > + struct util_filter_ctx fctx = { 0 };
> > + struct list_filter_arg lfa = { 0 };
> > +
> > + rc = ndctl_new(&ctx);
> > + if (rc < 0)
> > + return EXIT_FAILURE;
> > + argc = parse_options(argc, argv, options, u, 0);
> > + for (i = 0; i < argc; i++)
> > + error("unknown parameter \"%s\"\n", argv[i]);
> > + if (argc)
> > + usage_with_options(u, options);
> > +
> > + fctx.filter_bus = filter_bus;
> > + fctx.filter_dimm = filter_dimm;
> > + fctx.filter_region = filter_region;
> > + fctx.filter_namespace = NULL;
> > + fctx.list = &lfa;
> > + lfa.flags = 0;
> > +
> > + rc = util_filter_walk(ctx, &fctx, ¶m);
> > + if (rc)
> > + return rc;
> > +
> > + if (list_display(&lfa) || did_fail)
> > + return -ENOMEM;
> > + return 0;
> > +}
> > diff --git a/test/monitor.sh b/test/monitor.sh new file mode 100755
> > index 0000000..1401983
> > --- /dev/null
> > +++ b/test/monitor.sh
> > @@ -0,0 +1,146 @@
> > +#!/bin/bash -Ex
> > +
> > +# SPDX-License-Identifier: GPL-2.0
> > +# Copyright(c) 2018, FUJITSU LIMITED. All rights reserved.
> > +
> > +rc=77
> > +logfile=""
> > +conf_file=""
> > +monitor_dimms=""
> > +monitor_regions=""
> > +monitor_namespace=""
> > +monitor_pid=65536
> > +
> > +. ./common
> > +
> > +trap 'err $LINENO' ERR
> > +
> > +check_min_kver "4.15" || do_skip "kernel $KVER may not support monitor service"
> > +
> > +start_monitor()
> > +{
> > + logfile=$(mktemp)
> > + $NDCTL monitor -l $logfile $1 &
> > + monitor_pid=$!
> > + truncate --size 0 $logfile #remove startup log }
> > +
> > +get_monitor_dimm()
> > +{
> > + jlist=$(./list-smart-dimm -b $smart_supported_bus $1)
> > + monitor_dimms=$(jq '.[]."dev"?, ."dev"?' <<<$jlist | sort | uniq |
> > +xargs) }
> > +
> > +call_notify()
> > +{
> > + ./smart-notify $smart_supported_bus
> > + sync; sleep 3
> > +}
> > +
> > +check_result()
> > +{
> > + jlog=$(cat $logfile)
> > + notify_dimms=$(jq ."dimm"."dev" <<<$jlog | sort | uniq | xargs)
> > + [[ $monitor_dimms == $notify_dimms ]] }
> > +
> > +stop_monitor()
> > +{
> > + kill $monitor_pid
> > + rm $logfile
> > +}
> > +
> > +create_conf_file()
> > +{
> > + conf_file=$(mktemp)
> > + echo "dimm = $1" > $conf_file
> > +}
> > +
> > +test_filter_dimm()
> > +{
> > + smart_supported_bus=$NFIT_TEST_BUS0
> > + monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq -r .[0].dev)
> > + if [ -z $monitor_dimms ]; then
> > + smart_supported_bus=$NFIT_TEST_BUS1
> > + monitor_dimms=$(./list-smart-dimm -b $smart_supported_bus | jq
> -r .[0].dev)
> > + fi
> > + start_monitor "-d $monitor_dimms"
> > + call_notify
> > + check_result
> > + stop_monitor
> > +}
> > +
> > +test_filter_bus()
> > +{
> > + monitor_dimms=""
> > + get_monitor_dimm
> > + start_monitor "-b $smart_supported_bus"
> > + call_notify
> > + check_result
> > + stop_monitor
> > +}
> > +
> > +test_filter_region()
> > +{
> > + monitor_dimms=""
> > + monitor_region=""
> > + count=$($NDCTL list -R -b $smart_supported_bus | jq -r .[].dev | wc -l)
> > + i=0
> > + while [ $i -lt $count ]; do
> > + monitor_region=$($NDCTL list -R -b $smart_supported_bus | jq
> -r .[$i].dev)
> > + get_monitor_dimm "-r $monitor_region"
> > + [ ! -z $monitor_dimms ] && break
> > + i=$[$i+1]
> > + done
> > + start_monitor "-r $monitor_region"
> > + call_notify
> > + check_result
> > + stop_monitor
> > +}
> > +
> > +test_filter_namespace()
> > +{
> > + monitor_dimms=""
>
> > + monitor_namespace=$($NDCTL list -N -b $smart_supported_bus | jq -r .[0].dev)
> > + [ -z $monitor_namespace ] && monitor_namespace="namespace1.0"
> > + $NDCTL create-namespace -b $smart_supported_bus -n
> > +$monitor_namespace
>
> namespace1.0 may be used by the other bus. Actually my test failed because
> namespace1.0 was used by the other bus.
> How about the following instead?
>
> - monitor_namespace=$($NDCTL list -N -b $smart_supported_bus | jq
> -r .[0].dev)
> - [ -z $monitor_namespace ] && monitor_namespace="namespace1.0"
> - $NDCTL create-namespace -b $smart_supported_bus -n $monitor_namespace
> + init
> + monitor_namespace=$($NDCTL create-namespace -b
> + $smart_supported_bus | jq -r .dev)
>
Hi Masa,
Thank you very much for your comments.
Yes, this is a bug.
I will fix it.
Thanks,
QI
_______________________________________________
Linux-nvdimm mailing list
Linux-nvdimm@lists.01.org
https://lists.01.org/mailman/listinfo/linux-nvdimm
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-07-10 23:59 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-10 10:04 [ndctl PATCH v4] ndctl, test: add a new unit test for monitor QI Fuli
2018-07-10 15:11 ` Masayoshi Mizuma
2018-07-10 23:59 ` Qi, Fuli
2018-07-10 20:25 ` Masayoshi Mizuma
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).