Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F142804713
D18403.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
12 KB
Referenced Files
None
Subscribers
None
D18403.diff
View Options
Index: head/sbin/nvmecontrol/devlist.c
===================================================================
--- head/sbin/nvmecontrol/devlist.c
+++ head/sbin/nvmecontrol/devlist.c
@@ -43,6 +43,9 @@
#include "nvmecontrol.h"
+#define DEVLIST_USAGE \
+" nvmecontrol devlist\n"
+
static void
devlist_usage(void)
{
@@ -64,7 +67,7 @@
return (1 << lbads);
}
-void
+static void
devlist(int argc, char *argv[])
{
struct nvme_controller_data cdata;
@@ -124,3 +127,5 @@
exit(1);
}
+
+NVME_COMMAND(top, devlist, devlist, DEVLIST_USAGE);
Index: head/sbin/nvmecontrol/firmware.c
===================================================================
--- head/sbin/nvmecontrol/firmware.c
+++ head/sbin/nvmecontrol/firmware.c
@@ -50,6 +50,10 @@
#include "nvmecontrol.h"
+#define FIRMWARE_USAGE \
+" nvmecontrol firmware [-s slot] [-f path_to_firmware] [-a] <controller id>\n"
+
+
static int
slot_has_valid_firmware(int fd, int slot)
{
@@ -178,7 +182,7 @@
exit(1);
}
-void
+static void
firmware(int argc, char *argv[])
{
int fd = -1, slot = 0;
@@ -338,3 +342,5 @@
close(fd);
exit(0);
}
+
+NVME_COMMAND(top, firmware, firmware, FIRMWARE_USAGE);
Index: head/sbin/nvmecontrol/format.c
===================================================================
--- head/sbin/nvmecontrol/format.c
+++ head/sbin/nvmecontrol/format.c
@@ -43,6 +43,9 @@
#include "nvmecontrol.h"
+#define FORMAT_USAGE \
+" nvmecontrol format [-f fmt] [-m mset] [-p pi] [-l pil] [-E] [-C] <controller id|namespace id>\n"
+
static void
format_usage(void)
{
@@ -51,7 +54,7 @@
exit(1);
}
-void
+static void
format(int argc, char *argv[])
{
struct nvme_controller_data cd;
@@ -185,3 +188,5 @@
close(fd);
exit(0);
}
+
+NVME_COMMAND(top, format, format, FORMAT_USAGE);
Index: head/sbin/nvmecontrol/identify.c
===================================================================
--- head/sbin/nvmecontrol/identify.c
+++ head/sbin/nvmecontrol/identify.c
@@ -43,6 +43,9 @@
#include "nvmecontrol.h"
#include "nvmecontrol_ext.h"
+#define IDENTIFY_USAGE \
+" nvmecontrol identify [-x [-v]] <controller id|namespace id>\n"
+
static void
print_namespace(struct nvme_namespace_data *nsdata)
{
@@ -265,7 +268,7 @@
exit(0);
}
-void
+static void
identify(int argc, char *argv[])
{
char *target;
@@ -293,3 +296,5 @@
else
identify_ns(argc, argv);
}
+
+NVME_COMMAND(top, identify, identify, IDENTIFY_USAGE);
Index: head/sbin/nvmecontrol/logpage.c
===================================================================
--- head/sbin/nvmecontrol/logpage.c
+++ head/sbin/nvmecontrol/logpage.c
@@ -48,6 +48,9 @@
#include "nvmecontrol.h"
+#define LOGPAGE_USAGE \
+" nvmecontrol logpage <-p page_id> [-b] [-v vendor] [-x] <controller id|namespace id>\n" \
+
#define DEFAULT_SIZE (4096)
#define MAX_FW_SLOTS (7)
@@ -908,7 +911,7 @@
exit(1);
}
-void
+static void
logpage(int argc, char *argv[])
{
int fd;
@@ -1031,3 +1034,5 @@
close(fd);
exit(0);
}
+
+NVME_COMMAND(top, logpage, logpage, LOGPAGE_USAGE);
Index: head/sbin/nvmecontrol/ns.c
===================================================================
--- head/sbin/nvmecontrol/ns.c
+++ head/sbin/nvmecontrol/ns.c
@@ -41,6 +41,11 @@
#include "nvmecontrol.h"
+SET_DECLARE(ns, struct nvme_function);
+
+#define NS_USAGE \
+" nvmecontrol ns (create|delete|attach|detach)\n"
+
/* handles NVME_OPC_NAMESPACE_MANAGEMENT and ATTACHMENT admin cmds */
#define NSCREATE_USAGE \
@@ -60,13 +65,10 @@
void nsattach(int argc, char *argv[]);
void nsdetach(int argc, char *argv[]);
-static struct nvme_function ns_funcs[] = {
- {"create", nscreate, NSCREATE_USAGE},
- {"delete", nsdelete, NSDELETE_USAGE},
- {"attach", nsattach, NSATTACH_USAGE},
- {"detach", nsdetach, NSDETACH_USAGE},
- {NULL, NULL, NULL},
-};
+NVME_COMMAND(ns, create, nscreate, NSCREATE_USAGE);
+NVME_COMMAND(ns, delete, nsdelete, NSDELETE_USAGE);
+NVME_COMMAND(ns, attach, nsattach, NSATTACH_USAGE);
+NVME_COMMAND(ns, detach, nsdetach, NSDETACH_USAGE);
static void
nscreate_usage(void)
@@ -466,9 +468,11 @@
exit(0);
}
-void
+static void
ns(int argc, char *argv[])
{
- dispatch(argc, argv, ns_funcs);
+ DISPATCH(argc, argv, ns);
}
+
+NVME_COMMAND(top, ns, ns, NS_USAGE);
Index: head/sbin/nvmecontrol/nvmecontrol.h
===================================================================
--- head/sbin/nvmecontrol/nvmecontrol.h
+++ head/sbin/nvmecontrol/nvmecontrol.h
@@ -31,6 +31,7 @@
#ifndef __NVMECONTROL_H__
#define __NVMECONTROL_H__
+#include <sys/linker_set.h>
#include <dev/nvme/nvme.h>
typedef void (*nvme_fn_t)(int argc, char *argv[]);
@@ -41,53 +42,15 @@
const char *usage;
};
+#define NVME_CMDSET(set, sym) DATA_SET(set, sym)
+#define NVME_COMMAND(set, nam, function, usage_str) \
+ static struct nvme_function function ## _nvme_cmd = \
+ { .name = #nam, .fn = function, .usage = usage_str }; \
+ NVME_CMDSET(set, function ## _nvme_cmd)
+
#define NVME_CTRLR_PREFIX "nvme"
#define NVME_NS_PREFIX "ns"
-#define DEVLIST_USAGE \
-" nvmecontrol devlist\n"
-
-#define IDENTIFY_USAGE \
-" nvmecontrol identify [-x [-v]] <controller id|namespace id>\n"
-
-#define PERFTEST_USAGE \
-" nvmecontrol perftest <-n num_threads> <-o read|write>\n" \
-" <-s size_in_bytes> <-t time_in_seconds>\n" \
-" <-i intr|wait> [-f refthread] [-p]\n" \
-" <namespace id>\n"
-
-#define RESET_USAGE \
-" nvmecontrol reset <controller id>\n"
-
-#define LOGPAGE_USAGE \
-" nvmecontrol logpage <-p page_id> [-b] [-v vendor] [-x] <controller id|namespace id>\n" \
-
-#define FIRMWARE_USAGE \
-" nvmecontrol firmware [-s slot] [-f path_to_firmware] [-a] <controller id>\n"
-
-#define FORMAT_USAGE \
-" nvmecontrol format [-f fmt] [-m mset] [-p pi] [-l pil] [-E] [-C] <controller id|namespace id>\n"
-
-#define POWER_USAGE \
-" nvmecontrol power [-l] [-p new-state [-w workload-hint]] <controller id>\n"
-
-#define WDC_USAGE \
-" nvmecontrol wdc (cap-diag|drive-log|get-crash-dump|purge|purge-montior)\n"
-
-#define NS_USAGE \
-" nvmecontrol ns (create|delete|attach|detach)\n"
-
-void devlist(int argc, char *argv[]);
-void identify(int argc, char *argv[]);
-void perftest(int argc, char *argv[]);
-void reset(int argc, char *argv[]);
-void logpage(int argc, char *argv[]);
-void firmware(int argc, char *argv[]);
-void format(int argc, char *argv[]);
-void power(int argc, char *argv[]);
-void wdc(int argc, char *argv[]);
-void ns(int argc, char *argv[]);
-
int open_dev(const char *str, int *fd, int show_error, int exit_on_error);
void parse_ns_str(const char *ns_str, char *ctrlr_str, uint32_t *nsid);
void read_controller_data(int fd, struct nvme_controller_data *cdata);
@@ -95,8 +58,12 @@
void print_hex(void *data, uint32_t length);
void read_logpage(int fd, uint8_t log_page, uint32_t nsid, void *payload,
uint32_t payload_size);
-void gen_usage(struct nvme_function *);
-void dispatch(int argc, char *argv[], struct nvme_function *f);
+
+void dispatch_set(int argc, char *argv[], struct nvme_function **tbl,
+ struct nvme_function **tbl_limit);
+
+#define DISPATCH(argc, argv, set) \
+ dispatch_set(argc, argv, SET_BEGIN(set), SET_LIMIT(set))
/* Utility Routines */
/*
Index: head/sbin/nvmecontrol/nvmecontrol.c
===================================================================
--- head/sbin/nvmecontrol/nvmecontrol.c
+++ head/sbin/nvmecontrol/nvmecontrol.c
@@ -47,51 +47,39 @@
#include "nvmecontrol.h"
+SET_DECLARE(top, struct nvme_function);
-static struct nvme_function funcs[] = {
- {"devlist", devlist, DEVLIST_USAGE},
- {"identify", identify, IDENTIFY_USAGE},
- {"perftest", perftest, PERFTEST_USAGE},
- {"reset", reset, RESET_USAGE},
- {"logpage", logpage, LOGPAGE_USAGE},
- {"firmware", firmware, FIRMWARE_USAGE},
- {"format", format, FORMAT_USAGE},
- {"power", power, POWER_USAGE},
- {"wdc", wdc, WDC_USAGE},
- {"ns", ns, NS_USAGE},
- {NULL, NULL, NULL},
-};
-
-void
-gen_usage(struct nvme_function *f)
+static void
+gen_usage_set(struct nvme_function **f, struct nvme_function **flimit)
{
fprintf(stderr, "usage:\n");
- while (f->name != NULL) {
- fprintf(stderr, "%s", f->usage);
+ while (f < flimit) {
+ fprintf(stderr, "%s", (*f)->usage);
f++;
}
exit(1);
}
void
-dispatch(int argc, char *argv[], struct nvme_function *tbl)
+dispatch_set(int argc, char *argv[], struct nvme_function **tbl,
+ struct nvme_function **tbl_limit)
{
- struct nvme_function *f = tbl;
+ struct nvme_function **f = tbl;
if (argv[1] == NULL) {
- gen_usage(tbl);
+ gen_usage_set(tbl, tbl_limit);
return;
}
- while (f->name != NULL) {
- if (strcmp(argv[1], f->name) == 0)
- f->fn(argc-1, &argv[1]);
+ while (f < tbl_limit) {
+ if (strcmp(argv[1], (*f)->name) == 0)
+ (*f)->fn(argc-1, &argv[1]);
f++;
}
fprintf(stderr, "Unknown command: %s\n", argv[1]);
- gen_usage(tbl);
+ gen_usage_set(tbl, tbl_limit);
}
static void
@@ -243,9 +231,9 @@
{
if (argc < 2)
- gen_usage(funcs);
+ gen_usage_set(SET_BEGIN(top), SET_LIMIT(top));
- dispatch(argc, argv, funcs);
+ DISPATCH(argc, argv, top);
return (0);
}
Index: head/sbin/nvmecontrol/perftest.c
===================================================================
--- head/sbin/nvmecontrol/perftest.c
+++ head/sbin/nvmecontrol/perftest.c
@@ -45,6 +45,12 @@
#include "nvmecontrol.h"
+#define PERFTEST_USAGE \
+" nvmecontrol perftest <-n num_threads> <-o read|write>\n" \
+" <-s size_in_bytes> <-t time_in_seconds>\n" \
+" <-i intr|wait> [-f refthread] [-p]\n" \
+" <namespace id>\n"
+
static void
print_perftest(struct nvme_io_test *io_test, bool perthread)
{
@@ -76,7 +82,7 @@
exit(1);
}
-void
+static void
perftest(int argc, char *argv[])
{
struct nvme_io_test io_test;
@@ -176,3 +182,5 @@
print_perftest(&io_test, perthread);
exit(0);
}
+
+NVME_COMMAND(top, perftest, perftest, PERFTEST_USAGE);
Index: head/sbin/nvmecontrol/power.c
===================================================================
--- head/sbin/nvmecontrol/power.c
+++ head/sbin/nvmecontrol/power.c
@@ -44,6 +44,9 @@
_Static_assert(sizeof(struct nvme_power_state) == 256 / NBBY,
"nvme_power_state size wrong");
+#define POWER_USAGE \
+" nvmecontrol power [-l] [-p new-state [-w workload-hint]] <controller id>\n"
+
static void
power_usage(void)
{
@@ -133,7 +136,7 @@
printf("Current Power Mode is %d\n", pt.cpl.cdw0);
}
-void
+static void
power(int argc, char *argv[])
{
struct nvme_controller_data cdata;
@@ -193,3 +196,5 @@
close(fd);
exit(0);
}
+
+NVME_COMMAND(top, power, power, POWER_USAGE);
Index: head/sbin/nvmecontrol/reset.c
===================================================================
--- head/sbin/nvmecontrol/reset.c
+++ head/sbin/nvmecontrol/reset.c
@@ -41,6 +41,9 @@
#include "nvmecontrol.h"
+#define RESET_USAGE \
+" nvmecontrol reset <controller id>\n"
+
static void
reset_usage(void)
{
@@ -49,7 +52,7 @@
exit(1);
}
-void
+static void
reset(int argc, char *argv[])
{
int ch, fd;
@@ -71,3 +74,5 @@
exit(0);
}
+
+NVME_COMMAND(top, reset, reset, RESET_USAGE);
Index: head/sbin/nvmecontrol/wdc.c
===================================================================
--- head/sbin/nvmecontrol/wdc.c
+++ head/sbin/nvmecontrol/wdc.c
@@ -42,6 +42,11 @@
#include "nvmecontrol.h"
+#define WDC_USAGE \
+" nvmecontrol wdc (cap-diag|drive-log|get-crash-dump|purge|purge-montior)\n"
+
+SET_DECLARE(wdc, struct nvme_function);
+
#define WDC_NVME_TOC_SIZE 8
#define WDC_NVME_CAP_DIAG_OPCODE 0xe6
@@ -51,10 +56,7 @@
#define WDC_CAP_DIAG_USAGE "\tnvmecontrol wdc cap-diag [-o path-template]\n"
-static struct nvme_function wdc_funcs[] = {
- {"cap-diag", wdc_cap_diag, WDC_CAP_DIAG_USAGE},
- {NULL, NULL, NULL},
-};
+NVME_COMMAND(wdc, cap-diag, wdc_cap_diag, WDC_CAP_DIAG_USAGE);
static void
wdc_append_serial_name(int fd, char *buf, size_t len, const char *suffix)
@@ -188,9 +190,11 @@
exit(1);
}
-void
+static void
wdc(int argc, char *argv[])
{
- dispatch(argc, argv, wdc_funcs);
+ DISPATCH(argc, argv, wdc);
}
+
+NVME_COMMAND(top, wdc, wdc, WDC_USAGE);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 24, 7:13 PM (7 h, 56 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27905379
Default Alt Text
D18403.diff (12 KB)
Attached To
Mode
D18403: Move nvmecontrol to using linker sets
Attached
Detach File
Event Timeline
Log In to Comment