All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jan Kara <jack@suse.cz>
To: Gabriel Krisman Bertazi <krisman@collabora.com>
Cc: jack@suse.com, amir73il@gmail.com, djwong@kernel.org,
	tytso@mit.edu, dhowells@redhat.com, khazhy@google.com,
	linux-fsdevel@vger.kernel.org, linux-ext4@vger.kernel.org,
	linux-api@vger.kernel.org, repnop@google.com,
	kernel@collabora.com
Subject: Re: [PATCH v7 18/28] fanotify: Pre-allocate pool of error events
Date: Fri, 15 Oct 2021 11:46:35 +0200	[thread overview]
Message-ID: <20211015094635.GI23102@quack2.suse.cz> (raw)
In-Reply-To: <20211014213646.1139469-19-krisman@collabora.com>

On Thu 14-10-21 18:36:36, Gabriel Krisman Bertazi wrote:
> Error reporting needs to be done in an atomic context.  This patch

So this is a requirement I was advocating to remove because although atomic
context is nice for filesystems, it is rather difficult for fanotify.
Instead I was advocating that we relax this and require filesystems to
report errors from a context where using GFP_NOFS allocations is fine. At
least for ext4 and xfs and other filesystems I know it isn't really that
much harder... If this proves to be a problem in some specific case, there
are also other options (like doing notification from a workqueue, events are
async anyway) for the filesystems to take.

> introduces a group-wide mempool of error events, shared by all
> marks in this group.

... "shared by all FS_ERROR marks", right?
 
> Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.com>

The code otherwise looks OK to me.

								Honza

> ---
>  fs/notify/fanotify/fanotify.c      |  3 +++
>  fs/notify/fanotify/fanotify.h      | 11 +++++++++++
>  fs/notify/fanotify/fanotify_user.c | 26 +++++++++++++++++++++++++-
>  include/linux/fsnotify_backend.h   |  2 ++
>  4 files changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/fs/notify/fanotify/fanotify.c b/fs/notify/fanotify/fanotify.c
> index 8f152445d75c..01d68dfc74aa 100644
> --- a/fs/notify/fanotify/fanotify.c
> +++ b/fs/notify/fanotify/fanotify.c
> @@ -819,6 +819,9 @@ static void fanotify_free_group_priv(struct fsnotify_group *group)
>  	if (group->fanotify_data.ucounts)
>  		dec_ucount(group->fanotify_data.ucounts,
>  			   UCOUNT_FANOTIFY_GROUPS);
> +
> +	if (mempool_initialized(&group->fanotify_data.error_events_pool))
> +		mempool_exit(&group->fanotify_data.error_events_pool);
>  }
>  
>  static void fanotify_free_path_event(struct fanotify_event *event)
> diff --git a/fs/notify/fanotify/fanotify.h b/fs/notify/fanotify/fanotify.h
> index c42cf8fd7d79..a577e87fac2b 100644
> --- a/fs/notify/fanotify/fanotify.h
> +++ b/fs/notify/fanotify/fanotify.h
> @@ -141,6 +141,7 @@ enum fanotify_event_type {
>  	FANOTIFY_EVENT_TYPE_PATH,
>  	FANOTIFY_EVENT_TYPE_PATH_PERM,
>  	FANOTIFY_EVENT_TYPE_OVERFLOW, /* struct fanotify_event */
> +	FANOTIFY_EVENT_TYPE_FS_ERROR, /* struct fanotify_error_event */
>  	__FANOTIFY_EVENT_TYPE_NUM
>  };
>  
> @@ -196,6 +197,16 @@ FANOTIFY_NE(struct fanotify_event *event)
>  	return container_of(event, struct fanotify_name_event, fae);
>  }
>  
> +struct fanotify_error_event {
> +	struct fanotify_event fae;
> +};
> +
> +static inline struct fanotify_error_event *
> +FANOTIFY_EE(struct fanotify_event *event)
> +{
> +	return container_of(event, struct fanotify_error_event, fae);
> +}
> +
>  static inline __kernel_fsid_t *fanotify_event_fsid(struct fanotify_event *event)
>  {
>  	if (event->type == FANOTIFY_EVENT_TYPE_FID)
> diff --git a/fs/notify/fanotify/fanotify_user.c b/fs/notify/fanotify/fanotify_user.c
> index 66ee3c2805c7..f1cf863d6f9f 100644
> --- a/fs/notify/fanotify/fanotify_user.c
> +++ b/fs/notify/fanotify/fanotify_user.c
> @@ -30,6 +30,7 @@
>  #define FANOTIFY_DEFAULT_MAX_EVENTS	16384
>  #define FANOTIFY_OLD_DEFAULT_MAX_MARKS	8192
>  #define FANOTIFY_DEFAULT_MAX_GROUPS	128
> +#define FANOTIFY_DEFAULT_FEE_POOL	32
>  
>  /*
>   * Legacy fanotify marks limits (8192) is per group and we introduced a tunable
> @@ -1054,6 +1055,15 @@ static struct fsnotify_mark *fanotify_add_new_mark(struct fsnotify_group *group,
>  	return ERR_PTR(ret);
>  }
>  
> +static int fanotify_group_init_error_pool(struct fsnotify_group *group)
> +{
> +	if (mempool_initialized(&group->fanotify_data.error_events_pool))
> +		return 0;
> +
> +	return mempool_init_kmalloc_pool(&group->fanotify_data.error_events_pool,
> +					 FANOTIFY_DEFAULT_FEE_POOL,
> +					 sizeof(struct fanotify_error_event));
> +}
>  
>  static int fanotify_add_mark(struct fsnotify_group *group,
>  			     fsnotify_connp_t *connp, unsigned int type,
> @@ -1062,6 +1072,7 @@ static int fanotify_add_mark(struct fsnotify_group *group,
>  {
>  	struct fsnotify_mark *fsn_mark;
>  	__u32 added;
> +	int ret = 0;
>  
>  	mutex_lock(&group->mark_mutex);
>  	fsn_mark = fsnotify_find_mark(connp, group);
> @@ -1072,13 +1083,26 @@ static int fanotify_add_mark(struct fsnotify_group *group,
>  			return PTR_ERR(fsn_mark);
>  		}
>  	}
> +
> +	/*
> +	 * Error events are pre-allocated per group, only if strictly
> +	 * needed (i.e. FAN_FS_ERROR was requested).
> +	 */
> +	if (!(flags & FAN_MARK_IGNORED_MASK) && (mask & FAN_FS_ERROR)) {
> +		ret = fanotify_group_init_error_pool(group);
> +		if (ret)
> +			goto out;
> +	}
> +
>  	added = fanotify_mark_add_to_mask(fsn_mark, mask, flags);
>  	if (added & ~fsnotify_conn_mask(fsn_mark->connector))
>  		fsnotify_recalc_mask(fsn_mark->connector);
> +
> +out:
>  	mutex_unlock(&group->mark_mutex);
>  
>  	fsnotify_put_mark(fsn_mark);
> -	return 0;
> +	return ret;
>  }
>  
>  static int fanotify_add_vfsmount_mark(struct fsnotify_group *group,
> diff --git a/include/linux/fsnotify_backend.h b/include/linux/fsnotify_backend.h
> index a378a314e309..9941c06b8c8a 100644
> --- a/include/linux/fsnotify_backend.h
> +++ b/include/linux/fsnotify_backend.h
> @@ -19,6 +19,7 @@
>  #include <linux/atomic.h>
>  #include <linux/user_namespace.h>
>  #include <linux/refcount.h>
> +#include <linux/mempool.h>
>  
>  /*
>   * IN_* from inotfy.h lines up EXACTLY with FS_*, this is so we can easily
> @@ -245,6 +246,7 @@ struct fsnotify_group {
>  			int flags;           /* flags from fanotify_init() */
>  			int f_flags; /* event_f_flags from fanotify_init() */
>  			struct ucounts *ucounts;
> +			mempool_t error_events_pool;
>  		} fanotify_data;
>  #endif /* CONFIG_FANOTIFY */
>  	};
> -- 
> 2.33.0
> 
-- 
Jan Kara <jack@suse.com>
SUSE Labs, CR

  parent reply	other threads:[~2021-10-15  9:46 UTC|newest]

Thread overview: 67+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-14 21:36 [PATCH v7 00/28] file system-wide error monitoring Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 01/28] fsnotify: pass data_type to fsnotify_name() Gabriel Krisman Bertazi
2021-10-15  9:18   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 02/28] fsnotify: pass dentry instead of inode data Gabriel Krisman Bertazi
2021-10-15 13:39   ` Jan Kara
2021-10-18  9:11   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 03/28] fsnotify: clarify contract for create event hooks Gabriel Krisman Bertazi
2021-10-15  9:21   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 04/28] fsnotify: Don't insert unmergeable events in hashtable Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 05/28] fanotify: Fold event size calculation to its own function Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 06/28] fanotify: Split fsid check from other fid mode checks Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 07/28] inotify: Don't force FS_IN_IGNORED Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 08/28] fsnotify: Add helper to detect overflow_event Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 09/28] fsnotify: Add wrapper around fsnotify_add_event Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 10/28] fsnotify: Retrieve super block from the data field Gabriel Krisman Bertazi
2021-10-15  5:39   ` Amir Goldstein
2021-10-15  9:26   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 11/28] fsnotify: Pass group argument to free_event Gabriel Krisman Bertazi
2021-10-15  5:40   ` Amir Goldstein
2021-10-15  9:26   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 12/28] fanotify: Support null inode event in fanotify_dfid_inode Gabriel Krisman Bertazi
2021-10-15  5:49   ` Amir Goldstein
2021-10-15  9:30   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 13/28] fanotify: Allow file handle encoding for unhashed events Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 14/28] fanotify: Encode empty file handle when no inode is provided Gabriel Krisman Bertazi
2021-10-15  6:02   ` Amir Goldstein
2021-10-15  9:32   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 15/28] fanotify: Require fid_mode for any non-fd event Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 16/28] fsnotify: Support FS_ERROR event type Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 17/28] fanotify: Reserve UAPI bits for FAN_FS_ERROR Gabriel Krisman Bertazi
2021-10-15  9:37   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 18/28] fanotify: Pre-allocate pool of error events Gabriel Krisman Bertazi
2021-10-15  6:19   ` Amir Goldstein
2021-10-15  7:33     ` Amir Goldstein
2021-10-15  9:46   ` Jan Kara [this message]
2021-10-14 21:36 ` [PATCH v7 19/28] fanotify: Limit number of marks with FAN_FS_ERROR per group Gabriel Krisman Bertazi
2021-10-15  6:15   ` Amir Goldstein
2021-10-15 16:53     ` Gabriel Krisman Bertazi
2021-10-15 17:49       ` Amir Goldstein
2021-10-14 21:36 ` [PATCH v7 20/28] fanotify: Support enqueueing of error events Gabriel Krisman Bertazi
2021-10-15  7:04   ` Amir Goldstein
2021-10-15 16:50     ` Gabriel Krisman Bertazi
2021-10-15 12:34   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 21/28] fanotify: Support merging " Gabriel Krisman Bertazi
2021-10-15  7:09   ` Amir Goldstein
2021-10-15 16:54     ` Gabriel Krisman Bertazi
2021-10-15 17:52       ` Amir Goldstein
2021-10-18 13:55         ` Gabriel Krisman Bertazi
2021-10-15 12:43   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 22/28] fanotify: Report FID entry even for zero-length file_handle Gabriel Krisman Bertazi
2021-10-15  8:10   ` Amir Goldstein
2021-10-15 13:13     ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 23/28] fanotify: Report fid info for file related file system errors Gabriel Krisman Bertazi
2021-10-15  7:56   ` Amir Goldstein
2021-10-15 13:38     ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 24/28] fanotify: Emit generic error info for error event Gabriel Krisman Bertazi
2021-10-15  8:13   ` Amir Goldstein
2021-10-15 12:47   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 25/28] fanotify: Allow users to request FAN_FS_ERROR events Gabriel Krisman Bertazi
2021-10-15  8:27   ` Amir Goldstein
2021-10-15 12:49   ` Jan Kara
2021-10-14 21:36 ` [PATCH v7 26/28] ext4: Send notifications on error Gabriel Krisman Bertazi
2021-10-14 21:59   ` Theodore Ts'o
2021-10-14 21:36 ` [PATCH v7 27/28] samples: Add fs error monitoring example Gabriel Krisman Bertazi
2021-10-14 21:36 ` [PATCH v7 28/28] docs: Document the FAN_FS_ERROR event Gabriel Krisman Bertazi
2021-10-15  8:38 ` [PATCH v7 00/28] file system-wide error monitoring Amir Goldstein
2021-10-15  9:16 ` Jan Kara

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211015094635.GI23102@quack2.suse.cz \
    --to=jack@suse.cz \
    --cc=amir73il@gmail.com \
    --cc=dhowells@redhat.com \
    --cc=djwong@kernel.org \
    --cc=jack@suse.com \
    --cc=kernel@collabora.com \
    --cc=khazhy@google.com \
    --cc=krisman@collabora.com \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-ext4@vger.kernel.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=repnop@google.com \
    --cc=tytso@mit.edu \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.