[Devel] [PATCH RHEL9 COMMIT] fs/fuse kio: integrate pcs_krpc to kio module
Konstantin Khorenko
khorenko at virtuozzo.com
Fri Jul 12 18:59:49 MSK 2024
The commit is pushed to "branch-rh9-5.14.0-427.22.1.vz9.62.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh9-5.14.0-427.22.1.vz9.62.3
------>
commit c9f4e4fbafa6157cae727e09cf550abeec86af77
Author: Liu Kui <kui.liu at virtuozzo.com>
Date: Tue Jul 2 23:26:09 2024 +0800
fs/fuse kio: integrate pcs_krpc to kio module
Enable pcs_krpc in kio module:
- add module parameter 'pcs_krpc_support' to indicate whether pcs_krpc
is supported.
- export APIs to userspace as sub-commands of the FUSE_IOC_KIO_CALL
ioctl command on the /dev/fuse device.
https://pmc.acronis.work/browse/VSTOR-82613
Signed-off-by: Liu Kui <kui.liu at virtuozzo.com>
======
Patchset description:
fs/fuse kio: introduce pcs_krpc for merging userspace RPC in vstorage-mount with kernel RPC
Implement pcs_krpc in kio module to support using kernel RPC directly
from userspace.
https://pmc.acronis.work/browse/VSTOR-82613
Liu Kui (4):
fs/fuse kio: implement memory region to support zero-copy between
userspace and kernel.
fs/fuse kio: implement pcs_krpc - export kernel RPC to userspace
fs/fuse kio: adapt pcs_rpc to support pcs_krpc.
fs/fuse kio: integrate pcs_krpc to kio module
Feature: fuse: kRPC - single RPC for kernel and userspace
---
fs/fuse/dev.c | 19 ++++++--
fs/fuse/fuse_i.h | 2 +-
fs/fuse/kio/pcs/pcs_cluster_core.c | 4 ++
fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 94 +++++++++++++++++++++++++++++++++++++-
fs/fuse/kio/pcs/pcs_ioctl.h | 29 ++++++++++++
5 files changed, 140 insertions(+), 8 deletions(-)
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index e4a153bcc82e..01df9d4e4e70 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -2658,11 +2658,20 @@ static long fuse_dev_ioctl(struct file *file, unsigned int cmd,
if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
return -EFAULT;
- op = fuse_kio_get(NULL, req.name);
- if (op == NULL)
- return -EINVAL;
- res = op->ioctl(NULL, NULL, req.cmd, req.data, req.len);
- fuse_kio_put(op);
+
+ fud = fuse_get_dev(file);
+ if (fud) {
+ op = fud->fc->kio.op;
+ if (op == NULL)
+ return -EINVAL;
+ res = op->dev_ioctl(fud->fc, req.cmd, req.data, req.len);
+ } else {
+ op = fuse_kio_get(NULL, req.name);
+ if (op == NULL)
+ return -EINVAL;
+ res = op->ioctl(NULL, NULL, req.cmd, req.data, req.len);
+ fuse_kio_put(op);
+ }
break;
}
default:
diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h
index 0c1bd5209dbc..090871a1e356 100644
--- a/fs/fuse/fuse_i.h
+++ b/fs/fuse/fuse_i.h
@@ -649,7 +649,7 @@ struct fuse_kio_ops {
void (*inode_release)(struct fuse_inode *fi);
void (*kill_requests)(struct fuse_conn *fc, struct inode *inode);
int (*ioctl)(struct file *file, struct inode *inode, unsigned int cmd, unsigned long arg, int len);
-
+ int (*dev_ioctl)(struct fuse_conn *fc, unsigned int cmd, unsigned long arg, int len);
};
int fuse_register_kio(struct fuse_kio_ops *ops);
void fuse_unregister_kio(struct fuse_kio_ops *ops);
diff --git a/fs/fuse/kio/pcs/pcs_cluster_core.c b/fs/fuse/kio/pcs/pcs_cluster_core.c
index 8c34c60eb79a..6df2ccee9a1f 100644
--- a/fs/fuse/kio/pcs/pcs_cluster_core.c
+++ b/fs/fuse/kio/pcs/pcs_cluster_core.c
@@ -162,6 +162,8 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
cc->nilbuffer_kv.iov_len = sizeof(cc->nilbuffer);
pcs_csset_init(&cc->css);
+ pcs_mrset_init(&cc->mrs);
+ pcs_krpcset_init(&cc->krpcs);
err = pcs_mapset_init(cc);
if (err)
@@ -210,6 +212,8 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
void pcs_cc_fini(struct pcs_cluster_core *cc)
{
+ pcs_krpcset_fini(&cc->krpcs);
+ pcs_mrset_fini(&cc->mrs);
pcs_csset_fini(&cc->css);
pcs_mapset_fini(&cc->maps);
pcs_rpc_engine_fini(&cc->eng);
diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
index d326cab39625..a0452bad1fd1 100644
--- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
+++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
@@ -37,6 +37,8 @@
#include "fuse_ktrace.h"
#include "fuse_prometheus.h"
#include "pcs_net_addr.h"
+#include "pcs_mr.h"
+#include "pcs_krpc.h"
unsigned int pcs_loglevel = LOG_TRACE;
module_param(pcs_loglevel, uint, 0644);
@@ -79,6 +81,10 @@ unsigned int cpu_worker_flags = 1;
module_param(cpu_worker_flags, uint, 0444);
MODULE_PARM_DESC(cpu_worker_flags, "Set cpu worker flags");
+bool pcs_krpc_support = true;
+module_param(pcs_krpc_support, bool, 0444);
+MODULE_PARM_DESC(pcs_krpc_support, "krpc support");
+
#define sel_wq_flags(f) ((((f) & 1) ? WQ_CPU_INTENSIVE : 0) | (((f) & 2) ? WQ_UNBOUND : 0))
void (*fuse_printk_plugin)(unsigned long, const char *, ...);
@@ -1876,6 +1882,84 @@ static int kpcs_ioctl(struct file *file, struct inode *inode, unsigned int cmd,
return res;
}
+static int kpcs_dev_ioctl(struct fuse_conn *fc, unsigned int cmd, unsigned long arg, int len)
+{
+ struct pcs_fuse_cluster *pfc = fc->kio.ctx;
+ struct pcs_cluster_core *cc = &pfc->cc;
+ int res;
+
+ switch (cmd) {
+ case PCS_IOC_KRPC_CREATE:
+ {
+ struct pcs_ioc_krpc_create req;
+
+ if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+ return -EFAULT;
+
+ if (pcs_krpc_lookup(&cc->krpcs, &req.id))
+ return -EEXIST;
+
+ res = pcs_krpc_create(&cc->krpcs, &req.id, &req.addr, req.cs_flags);
+ break;
+ }
+ case PCS_IOC_KRPC_UPDATE_ADDR:
+ {
+ struct pcs_ioc_krpc_create req;
+
+ if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+ return -EFAULT;
+
+ res = pcs_krpc_update_addr(&cc->krpcs, &req.id, &req.addr, req.cs_flags);
+ break;
+ }
+
+ case PCS_IOC_KRPC_CONNECT:
+ {
+ struct pcs_ioc_krpc_connect req;
+
+ if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+ return -EFAULT;
+
+ res = pcs_krpc_connect(&cc->krpcs, &req.id);
+ break;
+ }
+ case PCS_IOC_KRPC_DESTROY:
+ {
+ struct pcs_ioc_krpc_destroy req;
+
+ if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+ return -EFAULT;
+
+ res = pcs_krpc_destroy(&cc->krpcs, &req.id);
+ break;
+ }
+ case PCS_IOC_REG_MR:
+ {
+ struct pcs_ioc_reg_mr req;
+
+ if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+ return -EFAULT;
+
+ res = pcs_reg_mr(&cc->mrs, req.start, req.len);
+ break;
+ }
+ case PCS_IOC_DEREG_MR:
+ {
+ struct pcs_ioc_dereg_mr req;
+
+ if (copy_from_user(&req, (void __user *)arg, sizeof(req)))
+ return -EFAULT;
+
+ res = pcs_dereg_mr(&cc->mrs, req.id);
+ break;
+ }
+ default:
+ res = -ENOIOCTLCMD;
+ break;
+ }
+ return res;
+}
+
static struct fuse_kio_ops kio_pcs_ops = {
.name = "pcs",
.owner = THIS_MODULE,
@@ -1892,9 +1976,9 @@ static struct fuse_kio_ops kio_pcs_ops = {
.inode_release = kpcs_inode_release,
.kill_requests = kpcs_kill_requests,
.ioctl = kpcs_ioctl,
+ .dev_ioctl = kpcs_dev_ioctl,
};
-
static int __init kpcs_mod_init(void)
{
int err = -ENOMEM;
@@ -1936,10 +2020,13 @@ static int __init kpcs_mod_init(void)
if (pcs_csa_init())
goto free_cleanup_wq;
+ if (pcs_krpc_init())
+ goto free_csa;
+
fast_path_version = PCS_FAST_PATH_VERSION.full;
if (fuse_register_kio(&kio_pcs_ops))
- goto free_csa;
+ goto free_krpc;
/* Clone relay_file_operations to set ownership */
ktrace_file_operations = relay_file_operations;
@@ -1957,6 +2044,8 @@ static int __init kpcs_mod_init(void)
pcs_fuse_req_cachep, pcs_ireq_cachep, pcs_wq);
return 0;
+free_krpc:
+ pcs_krpc_fini();
free_csa:
pcs_csa_fini();
free_cleanup_wq:
@@ -1989,6 +2078,7 @@ static void __exit kpcs_mod_exit(void)
kmem_cache_destroy(pcs_ireq_cachep);
kmem_cache_destroy(pcs_fuse_req_cachep);
pcs_csa_fini();
+ pcs_krpc_fini();
}
module_init(kpcs_mod_init);
diff --git a/fs/fuse/kio/pcs/pcs_ioctl.h b/fs/fuse/kio/pcs/pcs_ioctl.h
index 8e55be02c654..a0795d33b4f6 100644
--- a/fs/fuse/kio/pcs/pcs_ioctl.h
+++ b/fs/fuse/kio/pcs/pcs_ioctl.h
@@ -123,4 +123,33 @@ struct pcs_csa_setmap
#define PCS_CSA_IOC_SETMAP _IOR('V',38, struct pcs_csa_setmap)
#define PCS_KIO_CALL_REG _IOR('V',39, struct fuse_pcs_ioc_register)
+struct pcs_ioc_reg_mr {
+ u64 start;
+ u64 len;
+};
+#define PCS_IOC_REG_MR _IOR('V', 40, struct pcs_ioc_reg_mr)
+
+struct pcs_ioc_dereg_mr {
+ u32 id;
+};
+#define PCS_IOC_DEREG_MR _IOR('V', 41, struct pcs_ioc_dereg_mr)
+
+struct pcs_ioc_krpc_create {
+ PCS_NODE_ID_T id;
+ PCS_NET_ADDR_T addr;
+ int cs_flags;
+};
+#define PCS_IOC_KRPC_CREATE _IOR('V', 42, struct pcs_ioc_krpc_create)
+#define PCS_IOC_KRPC_UPDATE_ADDR _IOR('V', 43, struct pcs_ioc_krpc_create)
+
+struct pcs_ioc_krpc_connect {
+ PCS_NODE_ID_T id;
+};
+#define PCS_IOC_KRPC_CONNECT _IOR('V', 44, struct pcs_ioc_krpc_connect)
+
+struct pcs_ioc_krpc_destroy {
+ PCS_NODE_ID_T id;
+};
+#define PCS_IOC_KRPC_DESTROY _IOR('V', 45, struct pcs_ioc_krpc_destroy)
+
#endif /* _PCS_IOCTL_H_ */
More information about the Devel
mailing list