public inbox for stable@vger.kernel.org
 help / color / mirror / Atom feed
From: Pablo Neira Ayuso <pablo@netfilter.org>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: stable@vger.kernel.org, patches@lists.linux.dev,
	Sasha Levin <sashal@kernel.org>
Subject: Re: [PATCH 5.15 083/110] netfilter: nf_tables: GC transaction API to avoid race with control plane
Date: Wed, 20 Sep 2023 16:02:29 +0200	[thread overview]
Message-ID: <ZQr7dfIjOom3PTX+@calendula> (raw)
In-Reply-To: <20230920112833.527435166@linuxfoundation.org>

Hi Greg,

On Wed, Sep 20, 2023 at 01:32:21PM +0200, Greg Kroah-Hartman wrote:
> 5.15-stable review patch.  If anyone has any objections, please let me know.

Please, keep this back from 5.15, I am preparing a more complete patch
series which includes follow up fixes for this on top of this.

Thanks.

> ------------------
> 
> From: Pablo Neira Ayuso <pablo@netfilter.org>
> 
> [ Upstream commit 5f68718b34a531a556f2f50300ead2862278da26 ]
> 
> The set types rhashtable and rbtree use a GC worker to reclaim memory.
> >From system work queue, in periodic intervals, a scan of the table is
> done.
> 
> The major caveat here is that the nft transaction mutex is not held.
> This causes a race between control plane and GC when they attempt to
> delete the same element.
> 
> We cannot grab the netlink mutex from the work queue, because the
> control plane has to wait for the GC work queue in case the set is to be
> removed, so we get following deadlock:
> 
>    cpu 1                                cpu2
>      GC work                            transaction comes in , lock nft mutex
>        `acquire nft mutex // BLOCKS
>                                         transaction asks to remove the set
>                                         set destruction calls cancel_work_sync()
> 
> cancel_work_sync will now block forever, because it is waiting for the
> mutex the caller already owns.
> 
> This patch adds a new API that deals with garbage collection in two
> steps:
> 
> 1) Lockless GC of expired elements sets on the NFT_SET_ELEM_DEAD_BIT
>    so they are not visible via lookup. Annotate current GC sequence in
>    the GC transaction. Enqueue GC transaction work as soon as it is
>    full. If ruleset is updated, then GC transaction is aborted and
>    retried later.
> 
> 2) GC work grabs the mutex. If GC sequence has changed then this GC
>    transaction lost race with control plane, abort it as it contains
>    stale references to objects and let GC try again later. If the
>    ruleset is intact, then this GC transaction deactivates and removes
>    the elements and it uses call_rcu() to destroy elements.
> 
> Note that no elements are removed from GC lockless path, the _DEAD bit
> is set and pointers are collected. GC catchall does not remove the
> elements anymore too. There is a new set->dead flag that is set on to
> abort the GC transaction to deal with set->ops->destroy() path which
> removes the remaining elements in the set from commit_release, where no
> mutex is held.
> 
> To deal with GC when mutex is held, which allows safe deactivate and
> removal, add sync GC API which releases the set element object via
> call_rcu(). This is used by rbtree and pipapo backends which also
> perform garbage collection from control plane path.
> 
> Since element removal from sets can happen from control plane and
> element garbage collection/timeout, it is necessary to keep the set
> structure alive until all elements have been deactivated and destroyed.
> 
> We cannot do a cancel_work_sync or flush_work in nft_set_destroy because
> its called with the transaction mutex held, but the aforementioned async
> work queue might be blocked on the very mutex that nft_set_destroy()
> callchain is sitting on.
> 
> This gives us the choice of ABBA deadlock or UaF.
> 
> To avoid both, add set->refs refcount_t member. The GC API can then
> increment the set refcount and release it once the elements have been
> free'd.
> 
> Set backends are adapted to use the GC transaction API in a follow up
> patch entitled:
> 
>   ("netfilter: nf_tables: use gc transaction API in set backends")
> 
> This is joint work with Florian Westphal.
> 
> Fixes: cfed7e1b1f8e ("netfilter: nf_tables: add set garbage collection helpers")
> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
> Signed-off-by: Sasha Levin <sashal@kernel.org>
> ---
>  include/net/netfilter/nf_tables.h |  64 +++++++-
>  net/netfilter/nf_tables_api.c     | 248 ++++++++++++++++++++++++++++--
>  2 files changed, 300 insertions(+), 12 deletions(-)
> 
> diff --git a/include/net/netfilter/nf_tables.h b/include/net/netfilter/nf_tables.h
> index b8d967e0eb1e2..a6bf58316a5d8 100644
> --- a/include/net/netfilter/nf_tables.h
> +++ b/include/net/netfilter/nf_tables.h
> @@ -477,6 +477,7 @@ struct nft_set_elem_expr {
>   *
>   *	@list: table set list node
>   *	@bindings: list of set bindings
> + *	@refs: internal refcounting for async set destruction
>   *	@table: table this set belongs to
>   *	@net: netnamespace this set belongs to
>   * 	@name: name of the set
> @@ -506,6 +507,7 @@ struct nft_set_elem_expr {
>  struct nft_set {
>  	struct list_head		list;
>  	struct list_head		bindings;
> +	refcount_t			refs;
>  	struct nft_table		*table;
>  	possible_net_t			net;
>  	char				*name;
> @@ -527,7 +529,8 @@ struct nft_set {
>  	struct list_head		pending_update;
>  	/* runtime data below here */
>  	const struct nft_set_ops	*ops ____cacheline_aligned;
> -	u16				flags:14,
> +	u16				flags:13,
> +					dead:1,
>  					genmask:2;
>  	u8				klen;
>  	u8				dlen;
> @@ -1527,6 +1530,32 @@ static inline void nft_set_elem_clear_busy(struct nft_set_ext *ext)
>  	clear_bit(NFT_SET_ELEM_BUSY_BIT, word);
>  }
>  
> +#define NFT_SET_ELEM_DEAD_MASK	(1 << 3)
> +
> +#if defined(__LITTLE_ENDIAN_BITFIELD)
> +#define NFT_SET_ELEM_DEAD_BIT	3
> +#elif defined(__BIG_ENDIAN_BITFIELD)
> +#define NFT_SET_ELEM_DEAD_BIT	(BITS_PER_LONG - BITS_PER_BYTE + 3)
> +#else
> +#error
> +#endif
> +
> +static inline void nft_set_elem_dead(struct nft_set_ext *ext)
> +{
> +	unsigned long *word = (unsigned long *)ext;
> +
> +	BUILD_BUG_ON(offsetof(struct nft_set_ext, genmask) != 0);
> +	set_bit(NFT_SET_ELEM_DEAD_BIT, word);
> +}
> +
> +static inline int nft_set_elem_is_dead(const struct nft_set_ext *ext)
> +{
> +	unsigned long *word = (unsigned long *)ext;
> +
> +	BUILD_BUG_ON(offsetof(struct nft_set_ext, genmask) != 0);
> +	return test_bit(NFT_SET_ELEM_DEAD_BIT, word);
> +}
> +
>  /**
>   *	struct nft_trans - nf_tables object update in transaction
>   *
> @@ -1658,6 +1687,38 @@ struct nft_trans_flowtable {
>  #define nft_trans_flowtable_flags(trans)	\
>  	(((struct nft_trans_flowtable *)trans->data)->flags)
>  
> +#define NFT_TRANS_GC_BATCHCOUNT	256
> +
> +struct nft_trans_gc {
> +	struct list_head	list;
> +	struct net		*net;
> +	struct nft_set		*set;
> +	u32			seq;
> +	u8			count;
> +	void			*priv[NFT_TRANS_GC_BATCHCOUNT];
> +	struct rcu_head		rcu;
> +};
> +
> +struct nft_trans_gc *nft_trans_gc_alloc(struct nft_set *set,
> +					unsigned int gc_seq, gfp_t gfp);
> +void nft_trans_gc_destroy(struct nft_trans_gc *trans);
> +
> +struct nft_trans_gc *nft_trans_gc_queue_async(struct nft_trans_gc *gc,
> +					      unsigned int gc_seq, gfp_t gfp);
> +void nft_trans_gc_queue_async_done(struct nft_trans_gc *gc);
> +
> +struct nft_trans_gc *nft_trans_gc_queue_sync(struct nft_trans_gc *gc, gfp_t gfp);
> +void nft_trans_gc_queue_sync_done(struct nft_trans_gc *trans);
> +
> +void nft_trans_gc_elem_add(struct nft_trans_gc *gc, void *priv);
> +
> +struct nft_trans_gc *nft_trans_gc_catchall(struct nft_trans_gc *gc,
> +					   unsigned int gc_seq);
> +
> +void nft_setelem_data_deactivate(const struct net *net,
> +				 const struct nft_set *set,
> +				 struct nft_set_elem *elem);
> +
>  int __init nft_chain_filter_init(void);
>  void nft_chain_filter_fini(void);
>  
> @@ -1684,6 +1745,7 @@ struct nftables_pernet {
>  	struct mutex		commit_mutex;
>  	u64			table_handle;
>  	unsigned int		base_seq;
> +	unsigned int		gc_seq;
>  };
>  
>  extern unsigned int nf_tables_net_id;
> diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
> index dde19be41610d..2333f5da1eb97 100644
> --- a/net/netfilter/nf_tables_api.c
> +++ b/net/netfilter/nf_tables_api.c
> @@ -31,7 +31,9 @@ static LIST_HEAD(nf_tables_expressions);
>  static LIST_HEAD(nf_tables_objects);
>  static LIST_HEAD(nf_tables_flowtables);
>  static LIST_HEAD(nf_tables_destroy_list);
> +static LIST_HEAD(nf_tables_gc_list);
>  static DEFINE_SPINLOCK(nf_tables_destroy_list_lock);
> +static DEFINE_SPINLOCK(nf_tables_gc_list_lock);
>  
>  enum {
>  	NFT_VALIDATE_SKIP	= 0,
> @@ -120,6 +122,9 @@ static void nft_validate_state_update(struct nft_table *table, u8 new_validate_s
>  static void nf_tables_trans_destroy_work(struct work_struct *w);
>  static DECLARE_WORK(trans_destroy_work, nf_tables_trans_destroy_work);
>  
> +static void nft_trans_gc_work(struct work_struct *work);
> +static DECLARE_WORK(trans_gc_work, nft_trans_gc_work);
> +
>  static void nft_ctx_init(struct nft_ctx *ctx,
>  			 struct net *net,
>  			 const struct sk_buff *skb,
> @@ -581,10 +586,6 @@ static int nft_trans_set_add(const struct nft_ctx *ctx, int msg_type,
>  	return __nft_trans_set_add(ctx, msg_type, set, NULL);
>  }
>  
> -static void nft_setelem_data_deactivate(const struct net *net,
> -					const struct nft_set *set,
> -					struct nft_set_elem *elem);
> -
>  static int nft_mapelem_deactivate(const struct nft_ctx *ctx,
>  				  struct nft_set *set,
>  				  const struct nft_set_iter *iter,
> @@ -4756,6 +4757,7 @@ static int nf_tables_newset(struct sk_buff *skb, const struct nfnl_info *info,
>  
>  	INIT_LIST_HEAD(&set->bindings);
>  	INIT_LIST_HEAD(&set->catchall_list);
> +	refcount_set(&set->refs, 1);
>  	set->table = table;
>  	write_pnet(&set->net, net);
>  	set->ops = ops;
> @@ -4823,6 +4825,14 @@ static void nft_set_catchall_destroy(const struct nft_ctx *ctx,
>  	}
>  }
>  
> +static void nft_set_put(struct nft_set *set)
> +{
> +	if (refcount_dec_and_test(&set->refs)) {
> +		kfree(set->name);
> +		kvfree(set);
> +	}
> +}
> +
>  static void nft_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
>  {
>  	int i;
> @@ -4835,8 +4845,7 @@ static void nft_set_destroy(const struct nft_ctx *ctx, struct nft_set *set)
>  
>  	set->ops->destroy(ctx, set);
>  	nft_set_catchall_destroy(ctx, set);
> -	kfree(set->name);
> -	kvfree(set);
> +	nft_set_put(set);
>  }
>  
>  static int nf_tables_delset(struct sk_buff *skb, const struct nfnl_info *info,
> @@ -5901,7 +5910,8 @@ struct nft_set_ext *nft_set_catchall_lookup(const struct net *net,
>  	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
>  		ext = nft_set_elem_ext(set, catchall->elem);
>  		if (nft_set_elem_active(ext, genmask) &&
> -		    !nft_set_elem_expired(ext))
> +		    !nft_set_elem_expired(ext) &&
> +		    !nft_set_elem_is_dead(ext))
>  			return ext;
>  	}
>  
> @@ -6545,9 +6555,9 @@ static void nft_setelem_data_activate(const struct net *net,
>  		nft_use_inc_restore(&(*nft_set_ext_obj(ext))->use);
>  }
>  
> -static void nft_setelem_data_deactivate(const struct net *net,
> -					const struct nft_set *set,
> -					struct nft_set_elem *elem)
> +void nft_setelem_data_deactivate(const struct net *net,
> +				 const struct nft_set *set,
> +				 struct nft_set_elem *elem)
>  {
>  	const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv);
>  
> @@ -8882,6 +8892,207 @@ void nft_chain_del(struct nft_chain *chain)
>  	list_del_rcu(&chain->list);
>  }
>  
> +static void nft_trans_gc_setelem_remove(struct nft_ctx *ctx,
> +					struct nft_trans_gc *trans)
> +{
> +	void **priv = trans->priv;
> +	unsigned int i;
> +
> +	for (i = 0; i < trans->count; i++) {
> +		struct nft_set_elem elem = {
> +			.priv = priv[i],
> +		};
> +
> +		nft_setelem_data_deactivate(ctx->net, trans->set, &elem);
> +		nft_setelem_remove(ctx->net, trans->set, &elem);
> +	}
> +}
> +
> +void nft_trans_gc_destroy(struct nft_trans_gc *trans)
> +{
> +	nft_set_put(trans->set);
> +	put_net(trans->net);
> +	kfree(trans);
> +}
> +
> +static void nft_trans_gc_trans_free(struct rcu_head *rcu)
> +{
> +	struct nft_set_elem elem = {};
> +	struct nft_trans_gc *trans;
> +	struct nft_ctx ctx = {};
> +	unsigned int i;
> +
> +	trans = container_of(rcu, struct nft_trans_gc, rcu);
> +	ctx.net	= read_pnet(&trans->set->net);
> +
> +	for (i = 0; i < trans->count; i++) {
> +		elem.priv = trans->priv[i];
> +		if (!nft_setelem_is_catchall(trans->set, &elem))
> +			atomic_dec(&trans->set->nelems);
> +
> +		nf_tables_set_elem_destroy(&ctx, trans->set, elem.priv);
> +	}
> +
> +	nft_trans_gc_destroy(trans);
> +}
> +
> +static bool nft_trans_gc_work_done(struct nft_trans_gc *trans)
> +{
> +	struct nftables_pernet *nft_net;
> +	struct nft_ctx ctx = {};
> +
> +	nft_net = nft_pernet(trans->net);
> +
> +	mutex_lock(&nft_net->commit_mutex);
> +
> +	/* Check for race with transaction, otherwise this batch refers to
> +	 * stale objects that might not be there anymore. Skip transaction if
> +	 * set has been destroyed from control plane transaction in case gc
> +	 * worker loses race.
> +	 */
> +	if (READ_ONCE(nft_net->gc_seq) != trans->seq || trans->set->dead) {
> +		mutex_unlock(&nft_net->commit_mutex);
> +		return false;
> +	}
> +
> +	ctx.net = trans->net;
> +	ctx.table = trans->set->table;
> +
> +	nft_trans_gc_setelem_remove(&ctx, trans);
> +	mutex_unlock(&nft_net->commit_mutex);
> +
> +	return true;
> +}
> +
> +static void nft_trans_gc_work(struct work_struct *work)
> +{
> +	struct nft_trans_gc *trans, *next;
> +	LIST_HEAD(trans_gc_list);
> +
> +	spin_lock(&nf_tables_destroy_list_lock);
> +	list_splice_init(&nf_tables_gc_list, &trans_gc_list);
> +	spin_unlock(&nf_tables_destroy_list_lock);
> +
> +	list_for_each_entry_safe(trans, next, &trans_gc_list, list) {
> +		list_del(&trans->list);
> +		if (!nft_trans_gc_work_done(trans)) {
> +			nft_trans_gc_destroy(trans);
> +			continue;
> +		}
> +		call_rcu(&trans->rcu, nft_trans_gc_trans_free);
> +	}
> +}
> +
> +struct nft_trans_gc *nft_trans_gc_alloc(struct nft_set *set,
> +					unsigned int gc_seq, gfp_t gfp)
> +{
> +	struct net *net = read_pnet(&set->net);
> +	struct nft_trans_gc *trans;
> +
> +	trans = kzalloc(sizeof(*trans), gfp);
> +	if (!trans)
> +		return NULL;
> +
> +	refcount_inc(&set->refs);
> +	trans->set = set;
> +	trans->net = get_net(net);
> +	trans->seq = gc_seq;
> +
> +	return trans;
> +}
> +
> +void nft_trans_gc_elem_add(struct nft_trans_gc *trans, void *priv)
> +{
> +	trans->priv[trans->count++] = priv;
> +}
> +
> +static void nft_trans_gc_queue_work(struct nft_trans_gc *trans)
> +{
> +	spin_lock(&nf_tables_gc_list_lock);
> +	list_add_tail(&trans->list, &nf_tables_gc_list);
> +	spin_unlock(&nf_tables_gc_list_lock);
> +
> +	schedule_work(&trans_gc_work);
> +}
> +
> +static int nft_trans_gc_space(struct nft_trans_gc *trans)
> +{
> +	return NFT_TRANS_GC_BATCHCOUNT - trans->count;
> +}
> +
> +struct nft_trans_gc *nft_trans_gc_queue_async(struct nft_trans_gc *gc,
> +					      unsigned int gc_seq, gfp_t gfp)
> +{
> +	if (nft_trans_gc_space(gc))
> +		return gc;
> +
> +	nft_trans_gc_queue_work(gc);
> +
> +	return nft_trans_gc_alloc(gc->set, gc_seq, gfp);
> +}
> +
> +void nft_trans_gc_queue_async_done(struct nft_trans_gc *trans)
> +{
> +	if (trans->count == 0) {
> +		nft_trans_gc_destroy(trans);
> +		return;
> +	}
> +
> +	nft_trans_gc_queue_work(trans);
> +}
> +
> +struct nft_trans_gc *nft_trans_gc_queue_sync(struct nft_trans_gc *gc, gfp_t gfp)
> +{
> +	if (WARN_ON_ONCE(!lockdep_commit_lock_is_held(gc->net)))
> +		return NULL;
> +
> +	if (nft_trans_gc_space(gc))
> +		return gc;
> +
> +	call_rcu(&gc->rcu, nft_trans_gc_trans_free);
> +
> +	return nft_trans_gc_alloc(gc->set, 0, gfp);
> +}
> +
> +void nft_trans_gc_queue_sync_done(struct nft_trans_gc *trans)
> +{
> +	WARN_ON_ONCE(!lockdep_commit_lock_is_held(trans->net));
> +
> +	if (trans->count == 0) {
> +		nft_trans_gc_destroy(trans);
> +		return;
> +	}
> +
> +	call_rcu(&trans->rcu, nft_trans_gc_trans_free);
> +}
> +
> +struct nft_trans_gc *nft_trans_gc_catchall(struct nft_trans_gc *gc,
> +					   unsigned int gc_seq)
> +{
> +	struct nft_set_elem_catchall *catchall;
> +	const struct nft_set *set = gc->set;
> +	struct nft_set_ext *ext;
> +
> +	list_for_each_entry_rcu(catchall, &set->catchall_list, list) {
> +		ext = nft_set_elem_ext(set, catchall->elem);
> +
> +		if (!nft_set_elem_expired(ext))
> +			continue;
> +		if (nft_set_elem_is_dead(ext))
> +			goto dead_elem;
> +
> +		nft_set_elem_dead(ext);
> +dead_elem:
> +		gc = nft_trans_gc_queue_async(gc, gc_seq, GFP_ATOMIC);
> +		if (!gc)
> +			return NULL;
> +
> +		nft_trans_gc_elem_add(gc, catchall->elem);
> +	}
> +
> +	return gc;
> +}
> +
>  static void nf_tables_module_autoload_cleanup(struct net *net)
>  {
>  	struct nftables_pernet *nft_net = nft_pernet(net);
> @@ -9044,11 +9255,11 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
>  {
>  	struct nftables_pernet *nft_net = nft_pernet(net);
>  	struct nft_trans *trans, *next;
> +	unsigned int base_seq, gc_seq;
>  	LIST_HEAD(set_update_list);
>  	struct nft_trans_elem *te;
>  	struct nft_chain *chain;
>  	struct nft_table *table;
> -	unsigned int base_seq;
>  	LIST_HEAD(adl);
>  	int err;
>  
> @@ -9125,6 +9336,10 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
>  
>  	WRITE_ONCE(nft_net->base_seq, base_seq);
>  
> +	/* Bump gc counter, it becomes odd, this is the busy mark. */
> +	gc_seq = READ_ONCE(nft_net->gc_seq);
> +	WRITE_ONCE(nft_net->gc_seq, ++gc_seq);
> +
>  	/* step 3. Start new generation, rules_gen_X now in use. */
>  	net->nft.gencursor = nft_gencursor_next(net);
>  
> @@ -9213,6 +9428,7 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
>  			nft_trans_destroy(trans);
>  			break;
>  		case NFT_MSG_DELSET:
> +			nft_trans_set(trans)->dead = 1;
>  			list_del_rcu(&nft_trans_set(trans)->list);
>  			nf_tables_set_notify(&trans->ctx, nft_trans_set(trans),
>  					     NFT_MSG_DELSET, GFP_KERNEL);
> @@ -9312,6 +9528,8 @@ static int nf_tables_commit(struct net *net, struct sk_buff *skb)
>  	nft_commit_notify(net, NETLINK_CB(skb).portid);
>  	nf_tables_gen_notify(net, skb, NFT_MSG_NEWGEN);
>  	nf_tables_commit_audit_log(&adl, nft_net->base_seq);
> +
> +	WRITE_ONCE(nft_net->gc_seq, ++gc_seq);
>  	nf_tables_commit_release(net);
>  
>  	return 0;
> @@ -10343,6 +10561,7 @@ static int __net_init nf_tables_init_net(struct net *net)
>  	INIT_LIST_HEAD(&nft_net->notify_list);
>  	mutex_init(&nft_net->commit_mutex);
>  	nft_net->base_seq = 1;
> +	nft_net->gc_seq = 0;
>  
>  	return 0;
>  }
> @@ -10371,10 +10590,16 @@ static void __net_exit nf_tables_exit_net(struct net *net)
>  	WARN_ON_ONCE(!list_empty(&nft_net->notify_list));
>  }
>  
> +static void nf_tables_exit_batch(struct list_head *net_exit_list)
> +{
> +	flush_work(&trans_gc_work);
> +}
> +
>  static struct pernet_operations nf_tables_net_ops = {
>  	.init		= nf_tables_init_net,
>  	.pre_exit	= nf_tables_pre_exit_net,
>  	.exit		= nf_tables_exit_net,
> +	.exit_batch	= nf_tables_exit_batch,
>  	.id		= &nf_tables_net_id,
>  	.size		= sizeof(struct nftables_pernet),
>  };
> @@ -10446,6 +10671,7 @@ static void __exit nf_tables_module_exit(void)
>  	nft_chain_filter_fini();
>  	nft_chain_route_fini();
>  	unregister_pernet_subsys(&nf_tables_net_ops);
> +	cancel_work_sync(&trans_gc_work);
>  	cancel_work_sync(&trans_destroy_work);
>  	rcu_barrier();
>  	rhltable_destroy(&nft_objname_ht);
> -- 
> 2.40.1
> 
> 
> 

  reply	other threads:[~2023-09-20 14:02 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-20 11:30 [PATCH 5.15 000/110] 5.15.133-rc1 review Greg Kroah-Hartman
2023-09-20 11:30 ` [PATCH 5.15 001/110] autofs: fix memory leak of waitqueues in autofs_catatonic_mode Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 002/110] btrfs: output extra debug info if we failed to find an inline backref Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 003/110] locks: fix KASAN: use-after-free in trace_event_raw_event_filelock_lock Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 004/110] ACPICA: Add AML_NO_OPERAND_RESOLVE flag to Timer Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 005/110] kernel/fork: beware of __put_task_struct() calling context Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 006/110] rcuscale: Move rcu_scale_writer() schedule_timeout_uninterruptible() to _idle() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 007/110] scftorture: Forgive memory-allocation failure if KASAN Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 008/110] ACPI: video: Add backlight=native DMI quirk for Lenovo Ideapad Z470 Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 009/110] perf/smmuv3: Enable HiSilicon Erratum 162001900 quirk for HIP08/09 Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 010/110] perf/imx_ddr: speed up overflow frequency of cycle Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 011/110] hw_breakpoint: fix single-stepping when using bpf_overflow_handler Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 012/110] ACPI: x86: s2idle: Catch multiple ACPI_TYPE_PACKAGE objects Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 013/110] devlink: remove reload failed checks in params get/set callbacks Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 014/110] crypto: lrw,xts - Replace strlcpy with strscpy Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 015/110] wifi: ath9k: fix fortify warnings Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 016/110] wifi: ath9k: fix printk specifier Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 017/110] wifi: mwifiex: fix fortify warning Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 018/110] wifi: wil6210: fix fortify warnings Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 019/110] crypto: lib/mpi - avoid null pointer deref in mpi_cmp_ui() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 020/110] tpm_tis: Resend command to recover from data transfer errors Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 021/110] mmc: sdhci-esdhc-imx: improve ESDHC_FLAG_ERR010450 Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 022/110] alx: fix OOB-read compiler warning Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 023/110] wifi: mac80211: check S1G action frame size Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 024/110] netfilter: ebtables: fix fortify warnings in size_entry_mwt() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 025/110] wifi: mac80211_hwsim: drop short frames Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 026/110] libbpf: Free btf_vmlinux when closing bpf_object Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 027/110] drm/bridge: tc358762: Instruct DSI host to generate HSE packets Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 028/110] arm64: dts: qcom: sm6125-pdx201: correct ramoops pmsg-size Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 029/110] arm64: dts: qcom: sm8150-kumano: " Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 030/110] arm64: dts: qcom: sm8250-edo: " Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 031/110] samples/hw_breakpoint: Fix kernel BUG invalid opcode: 0000 Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 032/110] ALSA: hda: intel-dsp-cfg: add LunarLake support Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 033/110] drm/amd/display: Blocking invalid 420 modes on HDMI TMDS for DCN31 Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 034/110] drm/exynos: fix a possible null-pointer dereference due to data race in exynos_drm_crtc_atomic_disable() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 035/110] bus: ti-sysc: Configure uart quirks for k3 SoC Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 036/110] md: raid1: fix potential OOB in raid1_remove_disk() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 037/110] ext2: fix datatype of block number in ext2_xattr_set2() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 038/110] fs/jfs: prevent double-free in dbUnmount() after failed jfs_remount() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 039/110] jfs: fix invalid free of JFS_IP(ipimap)->i_imap in diUnmount Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 040/110] ARM: 9317/1: kexec: Make smp stop calls asynchronous Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 041/110] powerpc/pseries: fix possible memory leak in ibmebus_bus_init() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 042/110] PCI: fu740: Set the number of MSI vectors Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 043/110] media: dvb-usb-v2: af9035: Fix null-ptr-deref in af9035_i2c_master_xfer Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 044/110] media: dw2102: Fix null-ptr-deref in dw2102_i2c_transfer() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 045/110] media: af9005: Fix null-ptr-deref in af9005_i2c_xfer Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 046/110] media: anysee: fix null-ptr-deref in anysee_master_xfer Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 047/110] media: az6007: Fix null-ptr-deref in az6007_i2c_xfer() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 048/110] media: dvb-usb-v2: gl861: Fix null-ptr-deref in gl861_i2c_master_xfer Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 049/110] media: tuners: qt1010: replace BUG_ON with a regular error Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 050/110] media: pci: cx23885: replace BUG with error return Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 051/110] usb: cdns3: Put the cdns set active part outside the spin lock Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 052/110] usb: gadget: fsl_qe_udc: validate endpoint index for ch9 udc Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 053/110] tools: iio: iio_generic_buffer: Fix some integer type and calculation Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 054/110] scsi: target: iscsi: Fix buffer overflow in lio_target_nacl_info_show() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 055/110] serial: cpm_uart: Avoid suspicious locking Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 056/110] usb: ehci: add workaround for chipidea PORTSC.PEC bug Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 057/110] media: pci: ipu3-cio2: Initialise timing struct to avoid a compiler warning Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 058/110] kobject: Add sanity check for kset->kobj.ktype in kset_register() Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 059/110] interconnect: Fix locking for runpm vs reclaim Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 060/110] printk: Consolidate console deferred printing Greg Kroah-Hartman
2023-09-20 11:31 ` [PATCH 5.15 061/110] jbd2: refactor wait logic for transaction updates into a common function Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 062/110] jbd2: fix use-after-free of transaction_t race Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 063/110] jbd2: kill t_handle_lock transaction spinlock Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 064/110] jbd2: rename jbd_debug() to jbd2_debug() Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 065/110] jbd2: correct the end of the journal recovery scan range Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 066/110] mtd: rawnand: brcmnand: Allow SoC to provide I/O operations Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 067/110] mtd: rawnand: brcmnand: Fix ECC level field setting for v7.2 controller Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 068/110] MIPS: Use "grep -E" instead of "egrep" Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 069/110] perf jevents: Switch build to use jevents.py Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 070/110] perf build: Update build rule for generated files Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 071/110] perf test: Remove bash construct from stat_bpf_counters.sh test Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 072/110] perf test shell stat_bpf_counters: Fix test on Intel Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 073/110] btrfs: move btrfs_pinned_by_swapfile prototype into volumes.h Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 074/110] btrfs: add a helper to read the superblock metadata_uuid Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 075/110] btrfs: compare the correct fsid/metadata_uuid in btrfs_validate_super Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 076/110] drm: gm12u320: Fix the timeout usage for usb_bulk_msg() Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 077/110] scsi: qla2xxx: Fix NULL vs IS_ERR() bug for debugfs_create_dir() Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 078/110] selftests: tracing: Fix to unmount tracefs for recovering environment Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 079/110] scsi: lpfc: Fix the NULL vs IS_ERR() bug for debugfs_create_file() Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 080/110] x86/boot/compressed: Reserve more memory for page tables Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 081/110] x86/purgatory: Remove LTO flags Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 082/110] netfilter: nf_tables: make validation state per table Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 083/110] netfilter: nf_tables: GC transaction API to avoid race with control plane Greg Kroah-Hartman
2023-09-20 14:02   ` Pablo Neira Ayuso [this message]
2023-09-21  9:28     ` Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 084/110] netfilter: nf_tables: adapt set backend to use GC transaction API Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 085/110] netfilter: nft_set_hash: mark set element as dead when deleting from packet path Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 086/110] netfilter: nf_tables: remove busy mark and gc batch API Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 087/110] netfilter: nf_tables: fix kdoc warnings after gc rework Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 088/110] netfilter: nf_tables: fix GC transaction races with netns and netlink event exit path Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 089/110] netfilter: nf_tables: GC transaction race with netns dismantle Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 090/110] samples/hw_breakpoint: fix building without module unloading Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 091/110] md/raid1: fix error: ISO C90 forbids mixed declarations Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 092/110] attr: block mode changes of symlinks Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 093/110] ovl: fix failed copyup of fileattr on a symlink Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 094/110] ovl: fix incorrect fdput() on aio completion Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 095/110] btrfs: fix lockdep splat and potential deadlock after failure running delayed items Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 096/110] btrfs: release path before inode lookup during the ino lookup ioctl Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 097/110] tracing: Have tracing_max_latency inc the trace array ref count Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 098/110] tracing: Have current_trace " Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 099/110] tracing: Have option files " Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 100/110] nfsd: fix change_info in NFSv4 RENAME replies Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 101/110] tracefs: Add missing lockdown check to tracefs_create_dir() Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 102/110] i2c: aspeed: Reset the i2c controller when timeout occurs Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 103/110] ata: libata: disallow dev-initiated LPM transitions to unsupported states Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 104/110] scsi: megaraid_sas: Fix deadlock on firmware crashdump Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 105/110] scsi: pm8001: Setup IRQs on resume Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 106/110] ext4: fix rec_len verify error Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 107/110] drm/amd/display: fix the white screen issue when >= 64GB DRAM Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 108/110] drm/amdgpu: fix amdgpu_cs_p1_user_fence Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 109/110] net/sched: Retire rsvp classifier Greg Kroah-Hartman
2023-09-20 11:32 ` [PATCH 5.15 110/110] drm/amd/display: enable cursor degamma for DCN3+ DRM legacy gamma Greg Kroah-Hartman
2023-09-20 14:21 ` [PATCH 5.15 000/110] 5.15.133-rc1 review SeongJae Park
2023-09-20 18:47 ` Florian Fainelli
2023-09-23  8:21   ` Greg Kroah-Hartman
2023-09-20 21:34 ` Shuah Khan
2023-09-21 12:25 ` Guenter Roeck
2023-09-21 13:55 ` Naresh Kamboju
2023-09-21 16:01 ` Guenter Roeck
2023-09-21 20:38 ` Joel Fernandes
2023-09-21 22:05 ` Ron Economos
2023-09-22  9:19 ` Jon Hunter

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=ZQr7dfIjOom3PTX+@calendula \
    --to=pablo@netfilter.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=patches@lists.linux.dev \
    --cc=sashal@kernel.org \
    --cc=stable@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox