* [PATCH] ceph: eliminate req->r_wait_for_completion from ceph_mds_request
@ 2022-02-03 18:38 Jeff Layton
2022-02-07 7:56 ` Xiubo Li
0 siblings, 1 reply; 2+ messages in thread
From: Jeff Layton @ 2022-02-03 18:38 UTC (permalink / raw)
To: ceph-devel; +Cc: idryomov
...and instead just pass the wait function on the stack.
Make ceph_mdsc_wait_request non-static, and add an argument for wait for
completion. Then have ceph_lock_message call ceph_mdsc_submit_request,
and ceph_mdsc_wait_request and pass in the pointer to
ceph_lock_wait_for_completion.
While we're in there, rearrange some fields in ceph_mds_request, so we
save a total of 24 bytes per.
Signed-off-by: Jeff Layton <jlayton@kernel.org>
---
fs/ceph/locks.c | 8 ++++----
fs/ceph/mds_client.c | 11 ++++++-----
fs/ceph/mds_client.h | 9 +++++----
3 files changed, 15 insertions(+), 13 deletions(-)
v2: actually change ceph_mdsc_do_request to ceph_mdsc_submit_request
diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c
index d1f154aec249..3e2843e86e27 100644
--- a/fs/ceph/locks.c
+++ b/fs/ceph/locks.c
@@ -111,10 +111,10 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct inode *inode,
req->r_args.filelock_change.length = cpu_to_le64(length);
req->r_args.filelock_change.wait = wait;
- if (wait)
- req->r_wait_for_completion = ceph_lock_wait_for_completion;
-
- err = ceph_mdsc_do_request(mdsc, inode, req);
+ err = ceph_mdsc_submit_request(mdsc, inode, req);
+ if (!err)
+ err = ceph_mdsc_wait_request(mdsc, req, wait ?
+ ceph_lock_wait_for_completion : NULL);
if (!err && operation == CEPH_MDS_OP_GETFILELOCK) {
fl->fl_pid = -le64_to_cpu(req->r_reply_info.filelock_reply->pid);
if (CEPH_LOCK_SHARED == req->r_reply_info.filelock_reply->type)
diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
index 5937cbfafd31..72ba22de2b46 100644
--- a/fs/ceph/mds_client.c
+++ b/fs/ceph/mds_client.c
@@ -2974,15 +2974,16 @@ int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, struct inode *dir,
return err;
}
-static int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
- struct ceph_mds_request *req)
+int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
+ struct ceph_mds_request *req,
+ ceph_mds_request_wait_callback_t wait_func)
{
int err;
/* wait */
dout("do_request waiting\n");
- if (!req->r_timeout && req->r_wait_for_completion) {
- err = req->r_wait_for_completion(mdsc, req);
+ if (wait_func) {
+ err = wait_func(mdsc, req);
} else {
long timeleft = wait_for_completion_killable_timeout(
&req->r_completion,
@@ -3039,7 +3040,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
/* issue */
err = ceph_mdsc_submit_request(mdsc, dir, req);
if (!err)
- err = ceph_mdsc_wait_request(mdsc, req);
+ err = ceph_mdsc_wait_request(mdsc, req, NULL);
dout("do_request %p done, result %d\n", req, err);
return err;
}
diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
index 97c7f7bfa55f..ab12f3ce81a3 100644
--- a/fs/ceph/mds_client.h
+++ b/fs/ceph/mds_client.h
@@ -274,8 +274,8 @@ struct ceph_mds_request {
union ceph_mds_request_args r_args;
int r_fmode; /* file mode, if expecting cap */
- const struct cred *r_cred;
int r_request_release_offset;
+ const struct cred *r_cred;
struct timespec64 r_stamp;
/* for choosing which mds to send this request to */
@@ -296,12 +296,11 @@ struct ceph_mds_request {
struct ceph_msg *r_reply;
struct ceph_mds_reply_info_parsed r_reply_info;
int r_err;
-
+ u32 r_readdir_offset;
struct page *r_locked_page;
int r_dir_caps;
int r_num_caps;
- u32 r_readdir_offset;
unsigned long r_timeout; /* optional. jiffies, 0 is "wait forever" */
unsigned long r_started; /* start time to measure timeout against */
@@ -329,7 +328,6 @@ struct ceph_mds_request {
struct completion r_completion;
struct completion r_safe_completion;
ceph_mds_request_callback_t r_callback;
- ceph_mds_request_wait_callback_t r_wait_for_completion;
struct list_head r_unsafe_item; /* per-session unsafe list item */
long long r_dir_release_cnt;
@@ -507,6 +505,9 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode);
extern int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc,
struct inode *dir,
struct ceph_mds_request *req);
+int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
+ struct ceph_mds_request *req,
+ ceph_mds_request_wait_callback_t wait_func);
extern int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
struct inode *dir,
struct ceph_mds_request *req);
--
2.34.1
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH] ceph: eliminate req->r_wait_for_completion from ceph_mds_request
2022-02-03 18:38 [PATCH] ceph: eliminate req->r_wait_for_completion from ceph_mds_request Jeff Layton
@ 2022-02-07 7:56 ` Xiubo Li
0 siblings, 0 replies; 2+ messages in thread
From: Xiubo Li @ 2022-02-07 7:56 UTC (permalink / raw)
To: Jeff Layton, ceph-devel; +Cc: idryomov
On 2/4/22 2:38 AM, Jeff Layton wrote:
> ...and instead just pass the wait function on the stack.
>
> Make ceph_mdsc_wait_request non-static, and add an argument for wait for
> completion. Then have ceph_lock_message call ceph_mdsc_submit_request,
> and ceph_mdsc_wait_request and pass in the pointer to
> ceph_lock_wait_for_completion.
>
> While we're in there, rearrange some fields in ceph_mds_request, so we
> save a total of 24 bytes per.
>
> Signed-off-by: Jeff Layton <jlayton@kernel.org>
> ---
> fs/ceph/locks.c | 8 ++++----
> fs/ceph/mds_client.c | 11 ++++++-----
> fs/ceph/mds_client.h | 9 +++++----
> 3 files changed, 15 insertions(+), 13 deletions(-)
>
> v2: actually change ceph_mdsc_do_request to ceph_mdsc_submit_request
>
> diff --git a/fs/ceph/locks.c b/fs/ceph/locks.c
> index d1f154aec249..3e2843e86e27 100644
> --- a/fs/ceph/locks.c
> +++ b/fs/ceph/locks.c
> @@ -111,10 +111,10 @@ static int ceph_lock_message(u8 lock_type, u16 operation, struct inode *inode,
> req->r_args.filelock_change.length = cpu_to_le64(length);
> req->r_args.filelock_change.wait = wait;
>
> - if (wait)
> - req->r_wait_for_completion = ceph_lock_wait_for_completion;
> -
> - err = ceph_mdsc_do_request(mdsc, inode, req);
> + err = ceph_mdsc_submit_request(mdsc, inode, req);
> + if (!err)
> + err = ceph_mdsc_wait_request(mdsc, req, wait ?
> + ceph_lock_wait_for_completion : NULL);
> if (!err && operation == CEPH_MDS_OP_GETFILELOCK) {
> fl->fl_pid = -le64_to_cpu(req->r_reply_info.filelock_reply->pid);
> if (CEPH_LOCK_SHARED == req->r_reply_info.filelock_reply->type)
> diff --git a/fs/ceph/mds_client.c b/fs/ceph/mds_client.c
> index 5937cbfafd31..72ba22de2b46 100644
> --- a/fs/ceph/mds_client.c
> +++ b/fs/ceph/mds_client.c
> @@ -2974,15 +2974,16 @@ int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc, struct inode *dir,
> return err;
> }
>
> -static int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
> - struct ceph_mds_request *req)
> +int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
> + struct ceph_mds_request *req,
> + ceph_mds_request_wait_callback_t wait_func)
> {
> int err;
>
> /* wait */
> dout("do_request waiting\n");
> - if (!req->r_timeout && req->r_wait_for_completion) {
> - err = req->r_wait_for_completion(mdsc, req);
> + if (wait_func) {
> + err = wait_func(mdsc, req);
> } else {
> long timeleft = wait_for_completion_killable_timeout(
> &req->r_completion,
> @@ -3039,7 +3040,7 @@ int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
> /* issue */
> err = ceph_mdsc_submit_request(mdsc, dir, req);
> if (!err)
> - err = ceph_mdsc_wait_request(mdsc, req);
> + err = ceph_mdsc_wait_request(mdsc, req, NULL);
> dout("do_request %p done, result %d\n", req, err);
> return err;
> }
> diff --git a/fs/ceph/mds_client.h b/fs/ceph/mds_client.h
> index 97c7f7bfa55f..ab12f3ce81a3 100644
> --- a/fs/ceph/mds_client.h
> +++ b/fs/ceph/mds_client.h
> @@ -274,8 +274,8 @@ struct ceph_mds_request {
>
> union ceph_mds_request_args r_args;
> int r_fmode; /* file mode, if expecting cap */
> - const struct cred *r_cred;
> int r_request_release_offset;
> + const struct cred *r_cred;
> struct timespec64 r_stamp;
>
> /* for choosing which mds to send this request to */
> @@ -296,12 +296,11 @@ struct ceph_mds_request {
> struct ceph_msg *r_reply;
> struct ceph_mds_reply_info_parsed r_reply_info;
> int r_err;
> -
> + u32 r_readdir_offset;
>
> struct page *r_locked_page;
> int r_dir_caps;
> int r_num_caps;
> - u32 r_readdir_offset;
>
> unsigned long r_timeout; /* optional. jiffies, 0 is "wait forever" */
> unsigned long r_started; /* start time to measure timeout against */
> @@ -329,7 +328,6 @@ struct ceph_mds_request {
> struct completion r_completion;
> struct completion r_safe_completion;
> ceph_mds_request_callback_t r_callback;
> - ceph_mds_request_wait_callback_t r_wait_for_completion;
> struct list_head r_unsafe_item; /* per-session unsafe list item */
>
> long long r_dir_release_cnt;
> @@ -507,6 +505,9 @@ ceph_mdsc_create_request(struct ceph_mds_client *mdsc, int op, int mode);
> extern int ceph_mdsc_submit_request(struct ceph_mds_client *mdsc,
> struct inode *dir,
> struct ceph_mds_request *req);
> +int ceph_mdsc_wait_request(struct ceph_mds_client *mdsc,
> + struct ceph_mds_request *req,
> + ceph_mds_request_wait_callback_t wait_func);
> extern int ceph_mdsc_do_request(struct ceph_mds_client *mdsc,
> struct inode *dir,
> struct ceph_mds_request *req);
LGTM.
Reviewed-by: Xiubo Li <xiubli@redhat.com>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2022-02-07 8:07 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-02-03 18:38 [PATCH] ceph: eliminate req->r_wait_for_completion from ceph_mds_request Jeff Layton
2022-02-07 7:56 ` Xiubo Li
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.