Re: [LTP] [PATCH 3/3] fanotify10: Make evictable marks tests more reliable

Jan Kara
2022-11-16T10:58:30Z

On Wed 16-11-22 10:17:14, Pengfei Xu wrote:
> Hi Jan Kara,
>
> On 2022-11-15 at 13:47:38 +0100, Jan Kara wrote:
> > Tests verifying that evictable inode marks don't pin inodes in memory
> > are unreliable because slab shrinking (triggered by drop_caches) does
> > not reliably evict inodes - dentries have to take round through the LRU
> > list and only then get reclaimed and inodes get unpinned and then inodes
> > have to be rotated through their LRU list to get reclaimed. If there are
> > not enough freed entries while shrinking other slab caches, drop_caches
> > will abort attempts to reclaim slab before inodes get evicted.
> >
> > Tweak evictable marks tests to use more files and marks in parallel and
> > just verify that some (at least half) of the marks got evicted. This
> > should be more tolerant to random fluctuation in slab reclaim
> > efficiency.
> >
> If possible, could you add the Tested-by tag:
> Tested-by: Pengfei Xu <pengfei.xu@intel.com>

Sure, will do. I'll just wait whether there will be some other review
comments.

Honza

> > Signed-off-by: Jan Kara <jack@suse.cz>
> > ---
> > .../kernel/syscalls/fanotify/fanotify10.c | 62 ++++++++++++++++---
> > 1 file changed, 52 insertions(+), 10 deletions(-)
> >
> > diff --git a/testcases/kernel/syscalls/fanotify/fanotify10.c b/testcases/kernel/syscalls/fanotify/fanotify10.c
> > index e19bd907470f..cfbf4c31dd08 100644
> > --- a/testcases/kernel/syscalls/fanotify/fanotify10.c
> > +++ b/testcases/kernel/syscalls/fanotify/fanotify10.c
> > @@ -86,7 +86,10 @@ static int ignore_mark_unsupported;
> > #define TEST_APP "fanotify_child"
> > #define TEST_APP2 "fanotify_child2"
> > #define DIR_PATH MOUNT_PATH"/"DIR_NAME
> > +#define DIR_PATH_MULTI DIR_PATH"%d"
> > #define FILE_PATH DIR_PATH"/"FILE_NAME
> > +#define FILE_PATH_MULTI FILE_PATH"%d"
> > +#define FILE_PATH_MULTIDIR DIR_PATH_MULTI"/"FILE_NAME
> > #define FILE2_PATH DIR_PATH"/"FILE2_NAME
> > #define SUBDIR_PATH DIR_PATH"/"SUBDIR_NAME
> > #define FILE_EXEC_PATH MOUNT_PATH"/"TEST_APP
> > @@ -104,6 +107,7 @@ static int old_cache_pressure;
> > static pid_t child_pid;
> > static int bind_mount_created;
> > static unsigned int num_classes = NUM_CLASSES;
> > +static int max_file_multi;
> >
> > enum {
> > FANOTIFY_INODE,
> > @@ -378,9 +382,11 @@ static struct tcase {
> > .tname = "don't ignore mount events created on file with evicted ignore mark",
> > .mark_path_fmt = MOUNT_PATH,
> > .mark_type = FANOTIFY_MOUNT,
> > - .ignore_path_fmt = FILE_PATH,
> > + .ignore_path_cnt = 16,
> > + .ignore_path_fmt = FILE_PATH_MULTI,
> > .ignore_mark_type = FANOTIFY_EVICTABLE,
> > - .event_path_fmt = FILE_PATH,
> > + .event_path_cnt = 16,
> > + .event_path_fmt = FILE_PATH_MULTI,
> > .expected_mask_with_ignore = FAN_OPEN,
> > .expected_mask_without_ignore = FAN_OPEN
> > },
> > @@ -388,9 +394,11 @@ static struct tcase {
> > .tname = "don't ignore fs events created on a file with evicted ignore mark",
> > .mark_path_fmt = MOUNT_PATH,
> > .mark_type = FANOTIFY_FILESYSTEM,
> > - .ignore_path_fmt = FILE_PATH,
> > + .ignore_path_cnt = 16,
> > + .ignore_path_fmt = FILE_PATH_MULTI,
> > .ignore_mark_type = FANOTIFY_EVICTABLE,
> > - .event_path_fmt = FILE_PATH,
> > + .event_path_cnt = 16,
> > + .event_path_fmt = FILE_PATH_MULTI,
> > .expected_mask_with_ignore = FAN_OPEN,
> > .expected_mask_without_ignore = FAN_OPEN
> > },
> > @@ -398,10 +406,12 @@ static struct tcase {
> > .tname = "don't ignore mount events created inside a parent with evicted ignore mark",
> > .mark_path_fmt = MOUNT_PATH,
> > .mark_type = FANOTIFY_MOUNT,
> > - .ignore_path_fmt = DIR_PATH,
> > + .ignore_path_cnt = 16,
> > + .ignore_path_fmt = DIR_PATH_MULTI,
> > .ignore_mark_type = FANOTIFY_EVICTABLE,
> > .ignored_flags = FAN_EVENT_ON_CHILD,
> > - .event_path_fmt = FILE_PATH,
> > + .event_path_cnt = 16,
> > + .event_path_fmt = FILE_PATH_MULTIDIR,
> > .expected_mask_with_ignore = FAN_OPEN,
> > .expected_mask_without_ignore = FAN_OPEN
> > },
> > @@ -409,10 +419,12 @@ static struct tcase {
> > .tname = "don't ignore fs events created inside a parent with evicted ignore mark",
> > .mark_path_fmt = MOUNT_PATH,
> > .mark_type = FANOTIFY_FILESYSTEM,
> > - .ignore_path_fmt = DIR_PATH,
> > + .ignore_path_cnt = 16,
> > + .ignore_path_fmt = DIR_PATH_MULTI,
> > .ignore_mark_type = FANOTIFY_EVICTABLE,
> > .ignored_flags = FAN_EVENT_ON_CHILD,
> > - .event_path_fmt = FILE_PATH,
> > + .event_path_cnt = 16,
> > + .event_path_fmt = FILE_PATH_MULTIDIR,
> > .expected_mask_with_ignore = FAN_OPEN,
> > .expected_mask_without_ignore = FAN_OPEN
> > },
> > @@ -864,6 +876,8 @@ cleanup:
> >
> > static void setup(void)
> > {
> > + int i;
> > +
> > exec_events_unsupported = fanotify_events_supported_by_kernel(FAN_OPEN_EXEC,
> > FAN_CLASS_CONTENT, 0);
> > filesystem_mark_unsupported = fanotify_mark_supported_by_kernel(FAN_MARK_FILESYSTEM);
> > @@ -880,7 +894,24 @@ static void setup(void)
> > SAFE_MKDIR(DIR_PATH, 0755);
> > SAFE_MKDIR(SUBDIR_PATH, 0755);
> > SAFE_FILE_PRINTF(FILE_PATH, "1");
> > - SAFE_FILE_PRINTF(FILE2_PATH, "1");
> > + for (i = 0; i < (int)(sizeof(tcases)/sizeof(tcases[0])); i++) {
> > + if (tcases[i].mark_path_cnt > max_file_multi)
> > + max_file_multi = tcases[i].mark_path_cnt;
> > + if (tcases[i].ignore_path_cnt > max_file_multi)
> > + max_file_multi = tcases[i].ignore_path_cnt;
> > + if (tcases[i].event_path_cnt > max_file_multi)
> > + max_file_multi = tcases[i].event_path_cnt;
> > + }
> > + for (i = 0; i < max_file_multi; i++) {
> > + char path[PATH_MAX];
> > +
> > + sprintf(path, FILE_PATH_MULTI, i);
> > + SAFE_FILE_PRINTF(path, "1");
> > + sprintf(path, DIR_PATH_MULTI, i);
> > + SAFE_MKDIR(path, 0755);
> > + sprintf(path, FILE_PATH_MULTIDIR, i);
> > + SAFE_FILE_PRINTF(path, "1");
> > + }
> >
> > SAFE_CP(TEST_APP, FILE_EXEC_PATH);
> > SAFE_CP(TEST_APP, FILE2_EXEC_PATH);
> > @@ -896,6 +927,8 @@ static void setup(void)
> >
> > static void cleanup(void)
> > {
> > + int i;
> > +
> > cleanup_fanotify_groups();
> >
> > if (bind_mount_created)
> > @@ -903,8 +936,17 @@ static void cleanup(void)
> >
> > SAFE_FILE_PRINTF(CACHE_PRESSURE_FILE, "%d", old_cache_pressure);
> >
> > + for (i = 0; i < max_file_multi; i++) {
> > + char path[PATH_MAX];
> > +
> > + sprintf(path, FILE_PATH_MULTIDIR, i);
> > + SAFE_UNLINK(path);
> > + sprintf(path, DIR_PATH_MULTI, i);
> > + SAFE_RMDIR(path);
> > + sprintf(path, FILE_PATH_MULTI, i);
> > + SAFE_UNLINK(path);
> > + }
> > SAFE_UNLINK(FILE_PATH);
> > - SAFE_UNLINK(FILE2_PATH);
> > SAFE_RMDIR(SUBDIR_PATH);
> > SAFE_RMDIR(DIR_PATH);
> > SAFE_RMDIR(MNT2_PATH);
> > --
> > 2.35.3
> >
--
Jan Kara <jack@suse.com>
SUSE Labs, CR