Message ID | 20200701133500.26613-1-jlayton@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | ceph: clean up and optimize ceph_check_delayed_caps | expand |
On 2020/7/1 21:35, Jeff Layton wrote: > Make this loop look a bit more sane. Also optimize away the spinlock > release/reacquire if we can't get an inode reference. > > Signed-off-by: Jeff Layton <jlayton@kernel.org> > --- > fs/ceph/caps.c | 10 ++++------ > 1 file changed, 4 insertions(+), 6 deletions(-) > > diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c > index 5f4894063a73..55ccccf77cea 100644 > --- a/fs/ceph/caps.c > +++ b/fs/ceph/caps.c > @@ -4189,10 +4189,8 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc) > struct ceph_inode_info *ci; > > dout("check_delayed_caps\n"); > - while (1) { > - spin_lock(&mdsc->cap_delay_lock); > - if (list_empty(&mdsc->cap_delay_list)) > - break; > + spin_lock(&mdsc->cap_delay_lock); > + while (!list_empty(&mdsc->cap_delay_list)) { > ci = list_first_entry(&mdsc->cap_delay_list, > struct ceph_inode_info, > i_cap_delay_list); > @@ -4202,13 +4200,13 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc) > list_del_init(&ci->i_cap_delay_list); > > inode = igrab(&ci->vfs_inode); > - spin_unlock(&mdsc->cap_delay_lock); > - > if (inode) { > + spin_unlock(&mdsc->cap_delay_lock); > dout("check_delayed_caps on %p\n", inode); > ceph_check_caps(ci, 0, NULL); > /* avoid calling iput_final() in tick thread */ > ceph_async_iput(inode); > + spin_lock(&mdsc->cap_delay_lock); > } > } > spin_unlock(&mdsc->cap_delay_lock); Reviewed-by: Xiubo Li <xiubli@redhat.com>
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 5f4894063a73..55ccccf77cea 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -4189,10 +4189,8 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc) struct ceph_inode_info *ci; dout("check_delayed_caps\n"); - while (1) { - spin_lock(&mdsc->cap_delay_lock); - if (list_empty(&mdsc->cap_delay_list)) - break; + spin_lock(&mdsc->cap_delay_lock); + while (!list_empty(&mdsc->cap_delay_list)) { ci = list_first_entry(&mdsc->cap_delay_list, struct ceph_inode_info, i_cap_delay_list); @@ -4202,13 +4200,13 @@ void ceph_check_delayed_caps(struct ceph_mds_client *mdsc) list_del_init(&ci->i_cap_delay_list); inode = igrab(&ci->vfs_inode); - spin_unlock(&mdsc->cap_delay_lock); - if (inode) { + spin_unlock(&mdsc->cap_delay_lock); dout("check_delayed_caps on %p\n", inode); ceph_check_caps(ci, 0, NULL); /* avoid calling iput_final() in tick thread */ ceph_async_iput(inode); + spin_lock(&mdsc->cap_delay_lock); } } spin_unlock(&mdsc->cap_delay_lock);
Make this loop look a bit more sane. Also optimize away the spinlock release/reacquire if we can't get an inode reference. Signed-off-by: Jeff Layton <jlayton@kernel.org> --- fs/ceph/caps.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-)