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
>
>
>
next prev parent 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