Message ID | 20210803180344.2398374-3-amir73il@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Performance optimization for no fsnotify marks | expand |
On Tue, Aug 03, 2021 at 09:03:42PM +0300, Amir Goldstein wrote: > Instead of incrementing s_fsnotify_inode_refs when detaching connector > from inode, increment it earlier when attaching connector to inode. > Next patch is going to use s_fsnotify_inode_refs to count all objects > with attached connectors. > > Signed-off-by: Amir Goldstein <amir73il@gmail.com> LGTM. Reviewed-by: Matthew Bobrowski <repnop@google.com> > --- > fs/notify/mark.c | 29 ++++++++++++++++++----------- > 1 file changed, 18 insertions(+), 11 deletions(-) > > diff --git a/fs/notify/mark.c b/fs/notify/mark.c > index 80459db58f63..2d8c46e1167d 100644 > --- a/fs/notify/mark.c > +++ b/fs/notify/mark.c > @@ -169,6 +169,21 @@ static void fsnotify_connector_destroy_workfn(struct work_struct *work) > } > } > > +static void fsnotify_get_inode_ref(struct inode *inode) > +{ > + ihold(inode); > + atomic_long_inc(&inode->i_sb->s_fsnotify_inode_refs); > +} > + > +static void fsnotify_put_inode_ref(struct inode *inode) > +{ > + struct super_block *sb = inode->i_sb; > + > + iput(inode); > + if (atomic_long_dec_and_test(&sb->s_fsnotify_inode_refs)) > + wake_up_var(&sb->s_fsnotify_inode_refs); > +} > + > static void *fsnotify_detach_connector_from_object( > struct fsnotify_mark_connector *conn, > unsigned int *type) > @@ -182,7 +197,6 @@ static void *fsnotify_detach_connector_from_object( > if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) { > inode = fsnotify_conn_inode(conn); > inode->i_fsnotify_mask = 0; > - atomic_long_inc(&inode->i_sb->s_fsnotify_inode_refs); > } else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT) { > fsnotify_conn_mount(conn)->mnt_fsnotify_mask = 0; > } else if (conn->type == FSNOTIFY_OBJ_TYPE_SB) { > @@ -209,19 +223,12 @@ static void fsnotify_final_mark_destroy(struct fsnotify_mark *mark) > /* Drop object reference originally held by a connector */ > static void fsnotify_drop_object(unsigned int type, void *objp) > { > - struct inode *inode; > - struct super_block *sb; > - > if (!objp) > return; > /* Currently only inode references are passed to be dropped */ > if (WARN_ON_ONCE(type != FSNOTIFY_OBJ_TYPE_INODE)) > return; > - inode = objp; > - sb = inode->i_sb; > - iput(inode); > - if (atomic_long_dec_and_test(&sb->s_fsnotify_inode_refs)) > - wake_up_var(&sb->s_fsnotify_inode_refs); > + fsnotify_put_inode_ref(objp); > } > > void fsnotify_put_mark(struct fsnotify_mark *mark) > @@ -495,7 +502,7 @@ static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, > } > if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) { > inode = fsnotify_conn_inode(conn); > - ihold(inode); > + fsnotify_get_inode_ref(inode); > } > > /* > @@ -505,7 +512,7 @@ static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, > if (cmpxchg(connp, NULL, conn)) { > /* Someone else created list structure for us */ > if (inode) > - iput(inode); > + fsnotify_put_inode_ref(inode); > kmem_cache_free(fsnotify_mark_connector_cachep, conn); > } > > -- > 2.25.1 > /M
diff --git a/fs/notify/mark.c b/fs/notify/mark.c index 80459db58f63..2d8c46e1167d 100644 --- a/fs/notify/mark.c +++ b/fs/notify/mark.c @@ -169,6 +169,21 @@ static void fsnotify_connector_destroy_workfn(struct work_struct *work) } } +static void fsnotify_get_inode_ref(struct inode *inode) +{ + ihold(inode); + atomic_long_inc(&inode->i_sb->s_fsnotify_inode_refs); +} + +static void fsnotify_put_inode_ref(struct inode *inode) +{ + struct super_block *sb = inode->i_sb; + + iput(inode); + if (atomic_long_dec_and_test(&sb->s_fsnotify_inode_refs)) + wake_up_var(&sb->s_fsnotify_inode_refs); +} + static void *fsnotify_detach_connector_from_object( struct fsnotify_mark_connector *conn, unsigned int *type) @@ -182,7 +197,6 @@ static void *fsnotify_detach_connector_from_object( if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) { inode = fsnotify_conn_inode(conn); inode->i_fsnotify_mask = 0; - atomic_long_inc(&inode->i_sb->s_fsnotify_inode_refs); } else if (conn->type == FSNOTIFY_OBJ_TYPE_VFSMOUNT) { fsnotify_conn_mount(conn)->mnt_fsnotify_mask = 0; } else if (conn->type == FSNOTIFY_OBJ_TYPE_SB) { @@ -209,19 +223,12 @@ static void fsnotify_final_mark_destroy(struct fsnotify_mark *mark) /* Drop object reference originally held by a connector */ static void fsnotify_drop_object(unsigned int type, void *objp) { - struct inode *inode; - struct super_block *sb; - if (!objp) return; /* Currently only inode references are passed to be dropped */ if (WARN_ON_ONCE(type != FSNOTIFY_OBJ_TYPE_INODE)) return; - inode = objp; - sb = inode->i_sb; - iput(inode); - if (atomic_long_dec_and_test(&sb->s_fsnotify_inode_refs)) - wake_up_var(&sb->s_fsnotify_inode_refs); + fsnotify_put_inode_ref(objp); } void fsnotify_put_mark(struct fsnotify_mark *mark) @@ -495,7 +502,7 @@ static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, } if (conn->type == FSNOTIFY_OBJ_TYPE_INODE) { inode = fsnotify_conn_inode(conn); - ihold(inode); + fsnotify_get_inode_ref(inode); } /* @@ -505,7 +512,7 @@ static int fsnotify_attach_connector_to_object(fsnotify_connp_t *connp, if (cmpxchg(connp, NULL, conn)) { /* Someone else created list structure for us */ if (inode) - iput(inode); + fsnotify_put_inode_ref(inode); kmem_cache_free(fsnotify_mark_connector_cachep, conn); }
Instead of incrementing s_fsnotify_inode_refs when detaching connector from inode, increment it earlier when attaching connector to inode. Next patch is going to use s_fsnotify_inode_refs to count all objects with attached connectors. Signed-off-by: Amir Goldstein <amir73il@gmail.com> --- fs/notify/mark.c | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-)