From: Dan Williams <dan.j.williams@intel.com>
To: linux-cxl@vger.kernel.org
Cc: vishal.l.verma@intel.com
Subject: [ndctl PATCH 28/37] util: Implement common bind/unbind helpers
Date: Sun, 23 Jan 2022 16:54:17 -0800 [thread overview]
Message-ID: <164298565707.3021641.7763459936156744907.stgit@dwillia2-desk3.amr.corp.intel.com> (raw)
In-Reply-To: <164298550885.3021641.11210386002804544864.stgit@dwillia2-desk3.amr.corp.intel.com>
Refactor ndctl_{bind,unbind}() into util_{bind,unbind}() for libcxl to
reuse.
daxctl can not join the party for now as it needs to play games with
'new_id'.
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
---
ndctl/lib/libndctl.c | 103 ++++++--------------------------------------------
util/sysfs.c | 76 +++++++++++++++++++++++++++++++++++++
util/sysfs.h | 8 ++++
3 files changed, 96 insertions(+), 91 deletions(-)
diff --git a/ndctl/lib/libndctl.c b/ndctl/lib/libndctl.c
index 1374ad9e504f..98d184ba1bf8 100644
--- a/ndctl/lib/libndctl.c
+++ b/ndctl/lib/libndctl.c
@@ -1665,10 +1665,6 @@ static enum ndctl_fwa_result fwa_result_to_result(const char *result)
return NDCTL_FWA_RESULT_INVALID;
}
-static int ndctl_bind(struct ndctl_ctx *ctx, struct kmod_module *module,
- const char *devname);
-static int ndctl_unbind(struct ndctl_ctx *ctx, const char *devpath);
-
static int populate_dimm_attributes(struct ndctl_dimm *dimm,
const char *dimm_base,
const char *bus_prefix)
@@ -2305,7 +2301,7 @@ NDCTL_EXPORT int ndctl_dimm_disable(struct ndctl_dimm *dimm)
if (!ndctl_dimm_is_enabled(dimm))
return 0;
- ndctl_unbind(ctx, dimm->dimm_path);
+ util_unbind(dimm->dimm_path, ctx);
if (ndctl_dimm_is_enabled(dimm)) {
err(ctx, "%s: failed to disable\n", devname);
@@ -2324,7 +2320,7 @@ NDCTL_EXPORT int ndctl_dimm_enable(struct ndctl_dimm *dimm)
if (ndctl_dimm_is_enabled(dimm))
return 0;
- ndctl_bind(ctx, dimm->module, devname);
+ util_bind(devname, dimm->module, "nd", ctx);
if (!ndctl_dimm_is_enabled(dimm)) {
err(ctx, "%s: failed to enable\n", devname);
@@ -3573,7 +3569,7 @@ NDCTL_EXPORT int ndctl_region_enable(struct ndctl_region *region)
if (ndctl_region_is_enabled(region))
return 0;
- ndctl_bind(ctx, region->module, devname);
+ util_bind(devname, region->module, "nd", ctx);
if (!ndctl_region_is_enabled(region)) {
err(ctx, "%s: failed to enable\n", devname);
@@ -3610,7 +3606,7 @@ static int ndctl_region_disable(struct ndctl_region *region, int cleanup)
if (!ndctl_region_is_enabled(region))
return 0;
- ndctl_unbind(ctx, region->region_path);
+ util_unbind(region->region_path, ctx);
if (ndctl_region_is_enabled(region)) {
err(ctx, "%s: failed to disable\n", devname);
@@ -4373,81 +4369,6 @@ NDCTL_EXPORT struct badblock *ndctl_namespace_get_first_badblock(
return badblocks_iter_first(&ndns->bb_iter, ctx, path);
}
-static int ndctl_bind(struct ndctl_ctx *ctx, struct kmod_module *module,
- const char *devname)
-{
- DIR *dir;
- int rc = 0;
- char path[200];
- struct dirent *de;
- const int len = sizeof(path);
-
- if (!devname) {
- err(ctx, "missing devname\n");
- return -EINVAL;
- }
-
- if (module) {
- rc = kmod_module_probe_insert_module(module,
- KMOD_PROBE_APPLY_BLACKLIST, NULL, NULL, NULL,
- NULL);
- if (rc < 0) {
- err(ctx, "%s: insert failure: %d\n", __func__, rc);
- return rc;
- }
- }
-
- if (snprintf(path, len, "/sys/bus/nd/drivers") >= len) {
- err(ctx, "%s: buffer too small!\n", devname);
- return -ENXIO;
- }
-
- dir = opendir(path);
- if (!dir) {
- err(ctx, "%s: opendir(\"%s\") failed\n", devname, path);
- return -ENXIO;
- }
-
- while ((de = readdir(dir)) != NULL) {
- char *drv_path;
-
- if (de->d_ino == 0)
- continue;
- if (de->d_name[0] == '.')
- continue;
- if (asprintf(&drv_path, "%s/%s/bind", path, de->d_name) < 0) {
- err(ctx, "%s: path allocation failure\n", devname);
- continue;
- }
-
- rc = sysfs_write_attr_quiet(ctx, drv_path, devname);
- free(drv_path);
- if (rc == 0)
- break;
- }
- closedir(dir);
-
- if (rc) {
- dbg(ctx, "%s: bind failed\n", devname);
- return -ENXIO;
- }
- return 0;
-}
-
-static int ndctl_unbind(struct ndctl_ctx *ctx, const char *devpath)
-{
- const char *devname = devpath_to_devname(devpath);
- char path[200];
- const int len = sizeof(path);
-
- if (snprintf(path, len, "%s/driver/unbind", devpath) >= len) {
- err(ctx, "%s: buffer too small!\n", devname);
- return -ENXIO;
- }
-
- return sysfs_write_attr(ctx, path, devname);
-}
-
static void *add_btt(void *parent, int id, const char *btt_base);
static void *add_pfn(void *parent, int id, const char *pfn_base);
static void *add_dax(void *parent, int id, const char *dax_base);
@@ -4533,7 +4454,7 @@ NDCTL_EXPORT int ndctl_namespace_enable(struct ndctl_namespace *ndns)
if (ndctl_namespace_is_enabled(ndns))
return 0;
- rc = ndctl_bind(ctx, ndns->module, devname);
+ rc = util_bind(devname, ndns->module, "nd", ctx);
/*
* Rescan now as successfully enabling a namespace device leads
@@ -4581,7 +4502,7 @@ NDCTL_EXPORT int ndctl_namespace_disable(struct ndctl_namespace *ndns)
if (!ndctl_namespace_is_enabled(ndns))
return 0;
- ndctl_unbind(ctx, ndns->ndns_path);
+ util_unbind(ndns->ndns_path, ctx);
if (ndctl_namespace_is_enabled(ndns)) {
err(ctx, "%s: failed to disable\n", devname);
@@ -5420,7 +5341,7 @@ NDCTL_EXPORT int ndctl_btt_enable(struct ndctl_btt *btt)
if (ndctl_btt_is_enabled(btt))
return 0;
- ndctl_bind(ctx, btt->module, devname);
+ util_bind(devname, btt->module, "nd", ctx);
if (!ndctl_btt_is_enabled(btt)) {
err(ctx, "%s: failed to enable\n", devname);
@@ -5457,7 +5378,7 @@ NDCTL_EXPORT int ndctl_btt_delete(struct ndctl_btt *btt)
return 0;
}
- ndctl_unbind(ctx, btt->btt_path);
+ util_unbind(btt->btt_path, ctx);
rc = ndctl_btt_set_namespace(btt, NULL);
if (rc) {
@@ -5908,7 +5829,7 @@ NDCTL_EXPORT int ndctl_pfn_enable(struct ndctl_pfn *pfn)
if (ndctl_pfn_is_enabled(pfn))
return 0;
- ndctl_bind(ctx, pfn->module, devname);
+ util_bind(devname, pfn->module, "nd", ctx);
if (!ndctl_pfn_is_enabled(pfn)) {
err(ctx, "%s: failed to enable\n", devname);
@@ -5945,7 +5866,7 @@ NDCTL_EXPORT int ndctl_pfn_delete(struct ndctl_pfn *pfn)
return 0;
}
- ndctl_unbind(ctx, pfn->pfn_path);
+ util_unbind(pfn->pfn_path, ctx);
rc = ndctl_pfn_set_namespace(pfn, NULL);
if (rc) {
@@ -6101,7 +6022,7 @@ NDCTL_EXPORT int ndctl_dax_enable(struct ndctl_dax *dax)
if (ndctl_dax_is_enabled(dax))
return 0;
- ndctl_bind(ctx, pfn->module, devname);
+ util_bind(devname, pfn->module, "nd", ctx);
if (!ndctl_dax_is_enabled(dax)) {
err(ctx, "%s: failed to enable\n", devname);
@@ -6132,7 +6053,7 @@ NDCTL_EXPORT int ndctl_dax_delete(struct ndctl_dax *dax)
return 0;
}
- ndctl_unbind(ctx, pfn->pfn_path);
+ util_unbind(pfn->pfn_path, ctx);
rc = ndctl_dax_set_namespace(dax, NULL);
if (rc) {
diff --git a/util/sysfs.c b/util/sysfs.c
index 23330cb29002..968683b19f4e 100644
--- a/util/sysfs.c
+++ b/util/sysfs.c
@@ -145,3 +145,79 @@ struct kmod_module *__util_modalias_to_module(struct kmod_ctx *kmod_ctx,
return mod;
}
+
+int __util_bind(const char *devname, struct kmod_module *module,
+ const char *bus, struct log_ctx *ctx)
+{
+ DIR *dir;
+ int rc = 0;
+ char path[200];
+ struct dirent *de;
+ const int len = sizeof(path);
+
+ if (!devname) {
+ log_err(ctx, "missing devname\n");
+ return -EINVAL;
+ }
+
+ if (module) {
+ rc = kmod_module_probe_insert_module(module,
+ KMOD_PROBE_APPLY_BLACKLIST,
+ NULL, NULL, NULL, NULL);
+ if (rc < 0) {
+ log_err(ctx, "%s: insert failure: %d\n", __func__, rc);
+ return rc;
+ }
+ }
+
+ if (snprintf(path, len, "/sys/bus/%s/drivers", bus) >= len) {
+ log_err(ctx, "%s: buffer too small!\n", devname);
+ return -ENXIO;
+ }
+
+ dir = opendir(path);
+ if (!dir) {
+ log_err(ctx, "%s: opendir(\"%s\") failed\n", devname, path);
+ return -ENXIO;
+ }
+
+ while ((de = readdir(dir)) != NULL) {
+ char *drv_path;
+
+ if (de->d_ino == 0)
+ continue;
+ if (de->d_name[0] == '.')
+ continue;
+
+ if (asprintf(&drv_path, "%s/%s/bind", path, de->d_name) < 0) {
+ log_err(ctx, "%s: path allocation failure\n", devname);
+ continue;
+ }
+
+ rc = __sysfs_write_attr_quiet(ctx, drv_path, devname);
+ free(drv_path);
+ if (rc == 0)
+ break;
+ }
+ closedir(dir);
+
+ if (rc) {
+ log_dbg(ctx, "%s: bind failed\n", devname);
+ return -ENXIO;
+ }
+ return 0;
+}
+
+int __util_unbind(const char *devpath, struct log_ctx *ctx)
+{
+ const char *devname = devpath_to_devname(devpath);
+ char path[200];
+ const int len = sizeof(path);
+
+ if (snprintf(path, len, "%s/driver/unbind", devpath) >= len) {
+ log_err(ctx, "%s: buffer too small!\n", devname);
+ return -ENXIO;
+ }
+
+ return __sysfs_write_attr(ctx, path, devname);
+}
diff --git a/util/sysfs.h b/util/sysfs.h
index bdee4f5c291d..4c95c70558ba 100644
--- a/util/sysfs.h
+++ b/util/sysfs.h
@@ -35,4 +35,12 @@ struct kmod_module *__util_modalias_to_module(struct kmod_ctx *kmod_ctx,
struct log_ctx *log);
#define util_modalias_to_module(ctx, buf) \
__util_modalias_to_module((ctx)->kmod_ctx, buf, &(ctx)->ctx)
+
+int __util_bind(const char *devname, struct kmod_module *module, const char *bus,
+ struct log_ctx *ctx);
+#define util_bind(n, m, b, c) __util_bind(n, m, b, &(c)->ctx)
+
+int __util_unbind(const char *devpath, struct log_ctx *ctx);
+#define util_unbind(p, c) __util_unbind(p, &(c)->ctx)
+
#endif /* __UTIL_SYSFS_H__ */
next prev parent reply other threads:[~2022-01-24 0:54 UTC|newest]
Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-24 0:51 [ndctl PATCH 00/37] cxl: Full topology enumeration Dan Williams
2022-01-24 0:51 ` [ndctl PATCH 01/37] test: Add 'suite' identifiers to tests Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 02/37] ndctl: Rename util_filter to ndctl_filter Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 03/37] build: Add tags Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 04/37] json: Add support for json_object_new_uint64() Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 05/37] cxl/json: Cleanup object leak false positive Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 06/37] cxl/list: Support multiple memdev device name filter arguments Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 07/37] cxl/list: Support comma separated lists Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 08/37] cxl/list: Introduce cxl_filter_walk() Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 09/37] cxl/list: Emit device serial numbers Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 10/37] cxl/list: Add filter by serial support Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 11/37] cxl/lib: Rename nvdimm bridge to pmem Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 12/37] cxl/list: Cleanup options definitions Dan Williams
2022-01-24 0:52 ` [ndctl PATCH 13/37] Documentation: Enhance libcxl memdev API documentation Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 14/37] cxl/list: Add bus objects Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 15/37] util/json: Warn on stderr about empty list results Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 16/37] util/sysfs: Uplevel modalias lookup helper to util/ Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 17/37] cxl/list: Add port enumeration Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 18/37] cxl/list: Add --debug option Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 19/37] cxl/list: Add endpoints Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 20/37] cxl/list: Add 'host' entries for port-like objects Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 21/37] cxl/list: Add 'host' entries for memdevs Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 22/37] cxl/list: Move enabled memdevs underneath their endpoint Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 23/37] cxl/list: Filter memdev by ancestry Dan Williams
2022-01-24 0:53 ` [ndctl PATCH 24/37] cxl/memdev: Use a local logger for debug Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 25/37] cxl/memdev: Cleanup memdev filter Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 26/37] cxl/memdev: Add serial support for memdev-related commands Dan Williams
2022-02-10 1:10 ` Alison Schofield
2022-02-10 1:55 ` Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 27/37] cxl/list: Add 'numa_node' to memdev listings Dan Williams
2022-01-24 0:54 ` Dan Williams [this message]
2022-01-24 0:54 ` [ndctl PATCH 29/37] cxl/memdev: Enable / disable support Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 30/37] cxl/list: Add decoder support Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 31/37] cxl/list: Extend decoder objects with target information Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 32/37] cxl/list: Use 'physical_node' for root port attachment detection Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 33/37] cxl/list: Reuse the --target option for ports Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 34/37] cxl/list: Support filtering memdevs by decoders Dan Williams
2022-01-24 0:54 ` [ndctl PATCH 35/37] cxl/list: Support filtering memdevs by ports Dan Williams
2022-01-24 0:55 ` [ndctl PATCH 36/37] cxl/port: Add {disable,enable}-port command Dan Williams
2022-01-24 0:55 ` [ndctl PATCH 37/37] cxl/list: Filter dports and targets by memdevs Dan Williams
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=164298565707.3021641.7763459936156744907.stgit@dwillia2-desk3.amr.corp.intel.com \
--to=dan.j.williams@intel.com \
--cc=linux-cxl@vger.kernel.org \
--cc=vishal.l.verma@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).