Thread (59 messages) 59 messages, 4 authors, 2021-10-28

Re: [PATCH v8 20/32] fanotify: Dynamically resize the FAN_FS_ERROR pool

From: Amir Goldstein <amir73il@gmail.com>
Date: 2021-10-19 05:50:36
Also in: linux-api, linux-fsdevel

On Tue, Oct 19, 2021 at 3:03 AM Gabriel Krisman Bertazi
[off-list ref] wrote:
quoted hunk ↗ jump to hunk
Allow the FAN_FS_ERROR group mempool to grow up to an upper limit
dynamically, instead of starting already at the limit.  This doesn't
bother resizing on mark removal, but next time a mark is added, the slot
will be either reused or resized.  Also, if several marks are being
removed at once, most likely the group is going away anyway.

Signed-off-by: Gabriel Krisman Bertazi <redacted>
---
 fs/notify/fanotify/fanotify_user.c | 26 +++++++++++++++++++++-----
 include/linux/fsnotify_backend.h   |  1 +
 2 files changed, 22 insertions(+), 5 deletions(-)
diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
index f77581c5b97f..a860c286e885 100644
--- a/fs/notify/fanotify/fanotify_user.c
+++ b/fs/notify/fanotify/fanotify_user.c
@@ -959,6 +959,10 @@ static int fanotify_remove_mark(struct fsnotify_group *group,

        removed = fanotify_mark_remove_from_mask(fsn_mark, mask, flags,
                                                 umask, &destroy_mark);
+
+       if (removed & FAN_FS_ERROR)
+               group->fanotify_data.error_event_marks--;
+
        if (removed & fsnotify_conn_mask(fsn_mark->connector))
                fsnotify_recalc_mask(fsn_mark->connector);
        if (destroy_mark)
@@ -1057,12 +1061,24 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group,

 static int fanotify_group_init_error_pool(struct fsnotify_group *group)
 {
-       if (mempool_initialized(&group->fanotify_data.error_events_pool))
-               return 0;
+       int ret;
+
+       if (group->fanotify_data.error_event_marks >=
+           FANOTIFY_DEFAULT_MAX_FEE_POOL)
+               return -ENOMEM;

-       return mempool_init_kmalloc_pool(&group->fanotify_data.error_events_pool,
-                                        FANOTIFY_DEFAULT_MAX_FEE_POOL,
-                                        sizeof(struct fanotify_error_event));
+       if (!mempool_initialized(&group->fanotify_data.error_events_pool))
+               ret = mempool_init_kmalloc_pool(
+                               &group->fanotify_data.error_events_pool,
+                                1, sizeof(struct fanotify_error_event));
+       else
+               ret = mempool_resize(&group->fanotify_data.error_events_pool,
+                                    group->fanotify_data.error_event_marks + 1);
+
+       if (!ret)
+               group->fanotify_data.error_event_marks++;
+
+       return ret;
 }
This is not what I had in mind.
I was thinking start with ~32 and double each time limit is reached.
And also, this code grows the pool to infinity with add/remove mark loop.

Anyway, since I clearly did not understand how mempool works and
Jan had some different ideas I would leave it to Jan to explain
how he wants the mempool init limit and resize to be implemented.

Thanks,
Amir.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help