Archive-only list for patches
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: stable@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	patches@lists.linux.dev, Jakub Kicinski <kuba@kernel.org>,
	Bernard Pidoux <bernard.f6bvp@gmail.com>,
	Sasha Levin <sashal@kernel.org>
Subject: [PATCH 6.18 013/109] netrom: use a single lock for the node and neighbour lists
Date: Wed, 28 Oct 2026 17:59:57 +0100	[thread overview]
Message-ID: <20261028165942.674722693@linuxfoundation.org> (raw)
In-Reply-To: <20261028165942.357251485@linuxfoundation.org>

6.18-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Bernard Pidoux <bernard.f6bvp@gmail.com>

NET/ROM routing uses three kinds of locks: nr_node_list_lock,
nr_neigh_list_lock and a lock in every nr_node. They are taken in
opposite orders on different paths:

- nr_del_node() and nr_dec_obs() take the node list lock, then a node
  lock, then the neighbour list lock (through nr_remove_neigh());
- nr_add_node(), called for every frame received from a neighbour,
  holds a node lock and takes the neighbour list lock;
- nr_rt_device_down() takes the neighbour list lock, then the node
  list lock, then each node lock.

Taking an interface down while routes are being changed or frames are
coming in can therefore deadlock, which is what the open syzbot
reports against nr_del_node(), nr_remove_neigh() and
nr_rt_device_down() show. Fixing the order case by case was tried
several times and never covered every combination.

As suggested by Jakub, replace all three with one nr_route_lock that
covers both lists and the routes of every node. The per-node lock goes
away: with the lists and routes[] under the same lock it no longer
protects anything, and routing tables are small and change rarely.
nr_remove_neigh() gets a variant for callers that already hold the
lock. Node refcounting is unchanged apart from the hold/put pair that
nr_node_lock()/nr_node_unlock() used to add around each critical
section.

nr_route_frame() still calls ax25_send_frame() with the lock held, as
it did under the node lock, so the lock is documented as never to be
taken with an AX.25 list lock held; nr_link_failed() is called from
AX.25 with only linkfail_lock held.

No change in behaviour otherwise; the other issues found on the way
(unlocked updates of nr_neigh->ax25 and failed, duplicate entries from
concurrent nr_add_node(), a reference leak in nr_rt_device_down()) are
left for separate patches.

Link: https://patchwork.kernel.org/project/netdevbpf/patch/20260406114904.89088-1-mashiro.chen@mailbox.org/
Suggested-by: Jakub Kicinski <kuba@kernel.org>
Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Bernard Pidoux <bernard.f6bvp@gmail.com>
(cherry picked from commit 602c964d5e3d006cbd6e514aa971c5ab7257d66a)
Signed-off-by: Sasha Levin <sashal@kernel.org>
---
 include/net/netrom.h  |  15 -----
 net/netrom/nr_route.c | 133 +++++++++++++++++++-----------------------
 2 files changed, 59 insertions(+), 89 deletions(-)

diff --git a/include/net/netrom.h b/include/net/netrom.h
index 30ecf812b4ab4..2b4685d52bd81 100644
--- a/include/net/netrom.h
+++ b/include/net/netrom.h
@@ -115,7 +115,6 @@ struct nr_node {
 	unsigned char		count;
 	struct nr_route		routes[3];
 	refcount_t		refcount;
-	spinlock_t		node_lock;
 };
 
 /*********************************************************************
@@ -145,20 +144,6 @@ static __inline__ void nr_neigh_put(struct nr_neigh *nr_neigh)
 	}
 }
 
-/* nr_node_lock and nr_node_unlock also hold/put the node's refcounter.
- */
-static __inline__ void nr_node_lock(struct nr_node *nr_node)
-{
-	nr_node_hold(nr_node);
-	spin_lock_bh(&nr_node->node_lock);
-}
-
-static __inline__ void nr_node_unlock(struct nr_node *nr_node)
-{
-	spin_unlock_bh(&nr_node->node_lock);
-	nr_node_put(nr_node);
-}
-
 #define nr_neigh_for_each(__nr_neigh, list) \
 	hlist_for_each_entry(__nr_neigh, list, neigh_node)
 
diff --git a/net/netrom/nr_route.c b/net/netrom/nr_route.c
index 7f55030e4b166..e3effc85d3106 100644
--- a/net/netrom/nr_route.c
+++ b/net/netrom/nr_route.c
@@ -36,24 +36,30 @@
 
 static unsigned int nr_neigh_no = 1;
 
+/*
+ * nr_route_lock protects both lists and the routing data hanging off them:
+ * which, count and routes[] of every node. It is taken with bottom halves
+ * disabled, is never nested with itself, and may be held while calling into
+ * AX.25 (nr_route_frame() -> ax25_send_frame()), so it must never be taken
+ * with an AX.25 list lock held.
+ */
+static DEFINE_SPINLOCK(nr_route_lock);
 static HLIST_HEAD(nr_node_list);
-static DEFINE_SPINLOCK(nr_node_list_lock);
 static HLIST_HEAD(nr_neigh_list);
-static DEFINE_SPINLOCK(nr_neigh_list_lock);
 
 static struct nr_node *nr_node_get(ax25_address *callsign)
 {
 	struct nr_node *found = NULL;
 	struct nr_node *nr_node;
 
-	spin_lock_bh(&nr_node_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_node_for_each(nr_node, &nr_node_list)
 		if (ax25cmp(callsign, &nr_node->callsign) == 0) {
 			nr_node_hold(nr_node);
 			found = nr_node;
 			break;
 		}
-	spin_unlock_bh(&nr_node_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 	return found;
 }
 
@@ -63,7 +69,7 @@ static struct nr_neigh *nr_neigh_get_dev(ax25_address *callsign,
 	struct nr_neigh *found = NULL;
 	struct nr_neigh *nr_neigh;
 
-	spin_lock_bh(&nr_neigh_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_neigh_for_each(nr_neigh, &nr_neigh_list)
 		if (ax25cmp(callsign, &nr_neigh->callsign) == 0 &&
 		    nr_neigh->dev == dev) {
@@ -71,11 +77,11 @@ static struct nr_neigh *nr_neigh_get_dev(ax25_address *callsign,
 			found = nr_neigh;
 			break;
 		}
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 	return found;
 }
 
-static void nr_remove_neigh(struct nr_neigh *);
+static void nr_remove_neigh_locked(struct nr_neigh *nr_neigh);
 
 /*      re-sort the routes in quality order.    */
 static void re_sort_routes(struct nr_node *nr_node, int x, int y)
@@ -121,16 +127,14 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 	if (nr_neigh != NULL && nr_neigh->failed != 0 && quality == 0) {
 		struct nr_node *nr_nodet;
 
-		spin_lock_bh(&nr_node_list_lock);
+		spin_lock_bh(&nr_route_lock);
 		nr_node_for_each(nr_nodet, &nr_node_list) {
-			nr_node_lock(nr_nodet);
 			for (i = 0; i < nr_nodet->count; i++)
 				if (nr_nodet->routes[i].neighbour == nr_neigh)
 					if (i < nr_nodet->which)
 						nr_nodet->which = i;
-			nr_node_unlock(nr_nodet);
 		}
-		spin_unlock_bh(&nr_node_list_lock);
+		spin_unlock_bh(&nr_route_lock);
 	}
 
 	if (nr_neigh != NULL)
@@ -172,10 +176,10 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 			}
 		}
 
-		spin_lock_bh(&nr_neigh_list_lock);
+		spin_lock_bh(&nr_route_lock);
 		hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
 		nr_neigh_hold(nr_neigh);
-		spin_unlock_bh(&nr_neigh_list_lock);
+		spin_unlock_bh(&nr_route_lock);
 	}
 
 	if (quality != 0 && ax25cmp(nr, ax25) == 0 && !nr_neigh->locked)
@@ -194,7 +198,6 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 		nr_node->which = 0;
 		nr_node->count = 1;
 		refcount_set(&nr_node->refcount, 1);
-		spin_lock_init(&nr_node->node_lock);
 
 		nr_node->routes[0].quality   = quality;
 		nr_node->routes[0].obs_count = obs_count;
@@ -203,15 +206,15 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 		nr_neigh_hold(nr_neigh);
 		nr_neigh->count++;
 
-		spin_lock_bh(&nr_node_list_lock);
+		spin_lock_bh(&nr_route_lock);
 		hlist_add_head(&nr_node->node_node, &nr_node_list);
 		/* refcount initialized at 1 */
-		spin_unlock_bh(&nr_node_list_lock);
+		spin_unlock_bh(&nr_route_lock);
 
 		nr_neigh_put(nr_neigh);
 		return 0;
 	}
-	nr_node_lock(nr_node);
+	spin_lock_bh(&nr_route_lock);
 
 	if (quality != 0)
 		strscpy(nr_node->mnemonic, mnemonic);
@@ -246,7 +249,7 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 				nr_neigh_put(nr_node->routes[2].neighbour);
 
 				if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked)
-					nr_remove_neigh(nr_node->routes[2].neighbour);
+					nr_remove_neigh_locked(nr_node->routes[2].neighbour);
 
 				nr_node->routes[2].quality   = quality;
 				nr_node->routes[2].obs_count = obs_count;
@@ -280,33 +283,32 @@ static int __must_check nr_add_node(ax25_address *nr, const char *mnemonic,
 	}
 
 	nr_neigh_put(nr_neigh);
-	nr_node_unlock(nr_node);
+	spin_unlock_bh(&nr_route_lock);
 	nr_node_put(nr_node);
 	return 0;
 }
 
 static void nr_remove_node_locked(struct nr_node *nr_node)
 {
-	lockdep_assert_held(&nr_node_list_lock);
+	lockdep_assert_held(&nr_route_lock);
 
 	hlist_del_init(&nr_node->node_node);
 	nr_node_put(nr_node);
 }
 
-static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
+static void nr_remove_neigh_locked(struct nr_neigh *nr_neigh)
 {
+	lockdep_assert_held(&nr_route_lock);
+
 	hlist_del_init(&nr_neigh->neigh_node);
 	nr_neigh_put(nr_neigh);
 }
 
-#define nr_remove_neigh_locked(__neigh) \
-	__nr_remove_neigh(__neigh)
-
 static void nr_remove_neigh(struct nr_neigh *nr_neigh)
 {
-	spin_lock_bh(&nr_neigh_list_lock);
-	__nr_remove_neigh(nr_neigh);
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_lock_bh(&nr_route_lock);
+	nr_remove_neigh_locked(nr_neigh);
+	spin_unlock_bh(&nr_route_lock);
 }
 
 /*
@@ -331,15 +333,14 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
 		return -EINVAL;
 	}
 
-	spin_lock_bh(&nr_node_list_lock);
-	nr_node_lock(nr_node);
+	spin_lock_bh(&nr_route_lock);
 	for (i = 0; i < nr_node->count; i++) {
 		if (nr_node->routes[i].neighbour == nr_neigh) {
 			nr_neigh->count--;
 			nr_neigh_put(nr_neigh);
 
 			if (nr_neigh->count == 0 && !nr_neigh->locked)
-				nr_remove_neigh(nr_neigh);
+				nr_remove_neigh_locked(nr_neigh);
 			nr_neigh_put(nr_neigh);
 
 			nr_node->count--;
@@ -359,15 +360,13 @@ static int nr_del_node(ax25_address *callsign, ax25_address *neighbour, struct n
 				}
 				nr_node_put(nr_node);
 			}
-			nr_node_unlock(nr_node);
-			spin_unlock_bh(&nr_node_list_lock);
+			spin_unlock_bh(&nr_route_lock);
 
 			return 0;
 		}
 	}
 	nr_neigh_put(nr_neigh);
-	nr_node_unlock(nr_node);
-	spin_unlock_bh(&nr_node_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 	nr_node_put(nr_node);
 
 	return -EINVAL;
@@ -412,10 +411,10 @@ static int __must_check nr_add_neigh(ax25_address *callsign,
 		}
 	}
 
-	spin_lock_bh(&nr_neigh_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
 	/* refcount is initialized at 1 */
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 
 	return 0;
 }
@@ -454,9 +453,8 @@ static int nr_dec_obs(void)
 	struct hlist_node *nodet;
 	int i;
 
-	spin_lock_bh(&nr_node_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_node_for_each_safe(s, nodet, &nr_node_list) {
-		nr_node_lock(s);
 		for (i = 0; i < s->count; i++) {
 			switch (s->routes[i].obs_count) {
 			case 0:		/* A locked entry */
@@ -469,7 +467,7 @@ static int nr_dec_obs(void)
 				nr_neigh_put(nr_neigh);
 
 				if (nr_neigh->count == 0 && !nr_neigh->locked)
-					nr_remove_neigh(nr_neigh);
+					nr_remove_neigh_locked(nr_neigh);
 
 				s->count--;
 
@@ -494,9 +492,8 @@ static int nr_dec_obs(void)
 
 		if (s->count <= 0)
 			nr_remove_node_locked(s);
-		nr_node_unlock(s);
 	}
-	spin_unlock_bh(&nr_node_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 
 	return 0;
 }
@@ -511,12 +508,10 @@ void nr_rt_device_down(struct net_device *dev)
 	struct nr_node  *t;
 	int i;
 
-	spin_lock_bh(&nr_neigh_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {
 		if (s->dev == dev) {
-			spin_lock_bh(&nr_node_list_lock);
 			nr_node_for_each_safe(t, node2t, &nr_node_list) {
-				nr_node_lock(t);
 				for (i = 0; i < t->count; i++) {
 					if (t->routes[i].neighbour == s) {
 						t->count--;
@@ -536,14 +531,12 @@ void nr_rt_device_down(struct net_device *dev)
 
 				if (t->count <= 0)
 					nr_remove_node_locked(t);
-				nr_node_unlock(t);
 			}
-			spin_unlock_bh(&nr_node_list_lock);
 
 			nr_remove_neigh_locked(s);
 		}
 	}
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 }
 
 /*
@@ -707,7 +700,7 @@ void nr_link_failed(ax25_cb *ax25, int reason)
 	struct nr_neigh *s, *nr_neigh = NULL;
 	struct nr_node  *nr_node = NULL;
 
-	spin_lock_bh(&nr_neigh_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_neigh_for_each(s, &nr_neigh_list) {
 		if (s->ax25 == ax25) {
 			nr_neigh_hold(s);
@@ -715,7 +708,7 @@ void nr_link_failed(ax25_cb *ax25, int reason)
 			break;
 		}
 	}
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 
 	if (nr_neigh == NULL)
 		return;
@@ -727,15 +720,13 @@ void nr_link_failed(ax25_cb *ax25, int reason)
 		nr_neigh_put(nr_neigh);
 		return;
 	}
-	spin_lock_bh(&nr_node_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_node_for_each(nr_node, &nr_node_list) {
-		nr_node_lock(nr_node);
 		if (nr_node->which < nr_node->count &&
 		    nr_node->routes[nr_node->which].neighbour == nr_neigh)
 			nr_node->which++;
-		nr_node_unlock(nr_node);
 	}
-	spin_unlock_bh(&nr_node_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 	nr_neigh_put(nr_neigh);
 }
 
@@ -793,10 +784,10 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 	nr_node = nr_node_get(nr_dest);
 	if (nr_node == NULL)
 		return 0;
-	nr_node_lock(nr_node);
+	spin_lock_bh(&nr_route_lock);
 
 	if (nr_node->which >= nr_node->count) {
-		nr_node_unlock(nr_node);
+		spin_unlock_bh(&nr_route_lock);
 		nr_node_put(nr_node);
 		return 0;
 	}
@@ -804,7 +795,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 	nr_neigh = nr_node->routes[nr_node->which].neighbour;
 
 	if ((dev = nr_dev_first()) == NULL) {
-		nr_node_unlock(nr_node);
+		spin_unlock_bh(&nr_route_lock);
 		nr_node_put(nr_node);
 		return 0;
 	}
@@ -815,7 +806,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 	nskb = skb_copy_expand(skb, dev->hard_header_len, 0, GFP_ATOMIC);
 
 	if (!nskb) {
-		nr_node_unlock(nr_node);
+		spin_unlock_bh(&nr_route_lock);
 		nr_node_put(nr_node);
 		dev_put(dev);
 		return 0;
@@ -837,7 +828,7 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 
 	dev_put(dev);
 	ret = (nr_neigh->ax25 != NULL);
-	nr_node_unlock(nr_node);
+	spin_unlock_bh(&nr_route_lock);
 	nr_node_put(nr_node);
 
 	if (ret)
@@ -849,9 +840,9 @@ int nr_route_frame(struct sk_buff *skb, ax25_cb *ax25)
 #ifdef CONFIG_PROC_FS
 
 static void *nr_node_start(struct seq_file *seq, loff_t *pos)
-	__acquires(&nr_node_list_lock)
+	__acquires(&nr_route_lock)
 {
-	spin_lock_bh(&nr_node_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	return seq_hlist_start_head(&nr_node_list, *pos);
 }
 
@@ -861,9 +852,9 @@ static void *nr_node_next(struct seq_file *seq, void *v, loff_t *pos)
 }
 
 static void nr_node_stop(struct seq_file *seq, void *v)
-	__releases(&nr_node_list_lock)
+	__releases(&nr_route_lock)
 {
-	spin_unlock_bh(&nr_node_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 }
 
 static int nr_node_show(struct seq_file *seq, void *v)
@@ -878,7 +869,6 @@ static int nr_node_show(struct seq_file *seq, void *v)
 		struct nr_node *nr_node = hlist_entry(v, struct nr_node,
 						      node_node);
 
-		nr_node_lock(nr_node);
 		seq_printf(seq, "%-9s %-7s  %d %d",
 			ax2asc(buf, &nr_node->callsign),
 			(nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
@@ -891,7 +881,6 @@ static int nr_node_show(struct seq_file *seq, void *v)
 				nr_node->routes[i].obs_count,
 				nr_node->routes[i].neighbour->number);
 		}
-		nr_node_unlock(nr_node);
 
 		seq_puts(seq, "\n");
 	}
@@ -906,9 +895,9 @@ const struct seq_operations nr_node_seqops = {
 };
 
 static void *nr_neigh_start(struct seq_file *seq, loff_t *pos)
-	__acquires(&nr_neigh_list_lock)
+	__acquires(&nr_route_lock)
 {
-	spin_lock_bh(&nr_neigh_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	return seq_hlist_start_head(&nr_neigh_list, *pos);
 }
 
@@ -918,9 +907,9 @@ static void *nr_neigh_next(struct seq_file *seq, void *v, loff_t *pos)
 }
 
 static void nr_neigh_stop(struct seq_file *seq, void *v)
-	__releases(&nr_neigh_list_lock)
+	__releases(&nr_route_lock)
 {
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 }
 
 static int nr_neigh_show(struct seq_file *seq, void *v)
@@ -971,12 +960,9 @@ void nr_rt_free(void)
 	struct nr_node  *t = NULL;
 	struct hlist_node *nodet;
 
-	spin_lock_bh(&nr_neigh_list_lock);
-	spin_lock_bh(&nr_node_list_lock);
+	spin_lock_bh(&nr_route_lock);
 	nr_node_for_each_safe(t, nodet, &nr_node_list) {
-		nr_node_lock(t);
 		nr_remove_node_locked(t);
-		nr_node_unlock(t);
 	}
 	nr_neigh_for_each_safe(s, nodet, &nr_neigh_list) {
 		while(s->count) {
@@ -985,6 +971,5 @@ void nr_rt_free(void)
 		}
 		nr_remove_neigh_locked(s);
 	}
-	spin_unlock_bh(&nr_node_list_lock);
-	spin_unlock_bh(&nr_neigh_list_lock);
+	spin_unlock_bh(&nr_route_lock);
 }
-- 
2.53.0




  parent reply	other threads:[~2026-10-28 17:46 UTC|newest]

Thread overview: 117+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-28 16:59 [PATCH 6.18 000/109] 6.18.60-rc1 review Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 001/109] eventfs: fix SRCU read lock leak in eventfs_iterate() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 002/109] ACPI: scan: Register platform devices for fixed event buttons Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 003/109] ice: fix rxq info registering in mbuf packets Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 004/109] ice: change XDP RxQ frag_size from DMA write length to xdp.frame_sz Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 005/109] rose: clear stale N(R)/N(S) before (re)transmitting a data frame Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 006/109] netrom: linearize and validate lengths in nr_rx_frame() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 007/109] netrom: require full NET/ROM headers in nr_route_frame() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 008/109] net: netrom: validate source address in nr_find_socket() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 009/109] netrom: bound fragment reassembly in nr_queue_rx_frame() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 010/109] ax25: fix OOB read after address header strip in ax25_rcv() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 011/109] ax25: check frame length in ax25_decode() and ax25_rx_iframe() Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 012/109] net: ax25: fix integer overflow in ax25_rx_fragment() Greg Kroah-Hartman
2026-10-28 16:59 ` Greg Kroah-Hartman [this message]
2026-10-28 16:59 ` [PATCH 6.18 014/109] netrom: look up and update routes in one critical section Greg Kroah-Hartman
2026-10-28 16:59 ` [PATCH 6.18 015/109] netrom: fix reference count leak in nr_rt_device_down Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 016/109] netrom: clear nr_neigh->ax25 under the routing lock in nr_link_failed() Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 017/109] netrom: fix nr_node leak when nr_del_node() removes the last route Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 018/109] rose: clear through routes when a neighbour is removed from the tables Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 019/109] rose: restart the link of a neighbour created over a live AX.25 connection Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 020/109] ax25: serialise the transmission of I frames on a connection Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 021/109] rose: process received frames and send with the socket locked Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 022/109] ax25: dont create two connections for the same link in ax25_send_frame() Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 023/109] ax25: read the connections ax25_dev only once when walking ax25_list Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 024/109] ax25: wait for ax25_send_frame() before detaching the connections of a device Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 025/109] ax25: dont accept frames on a device that is going down Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 026/109] ax25: send a private copy of each I frame Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 027/109] rose: clear the circuits of a neighbour that restarts the link Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 028/109] ax25: send unacknowledged I frames again when a link is re-established Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 029/109] rose: bring up the link of the preferred route passed over by a connect request Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 030/109] ax25: dont free an incoming SABM skb left on the listeners queue Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 031/109] block: avoid potential deadlock on zone revalidation failure Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 032/109] mm/damon/core: error damos_commit_quota_goal() for zero target_value Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 033/109] net_sched: codel: fix stale state for empty flows in fq_codel Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 034/109] Bluetooth: L2CAP: refuse __l2cap_chan_add if chan already has conn Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 035/109] tracing: Hold trace_types_lock when updating modules in persistent instances Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 036/109] tracing: Hold trace_types_lock when resetting last boot data from readers Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 037/109] tracing: Reject incomplete event filter expressions Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 038/109] tracing: Save the event file instead of the compatible histogram Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 039/109] tracing: Unregister field variable histograms when the command fails Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 040/109] tracing: Fix 64-bit and signed histogram fields on 32-bit kernels Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 041/109] tracing/histograms: Verify event_call identity when updating synth_event refcount Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 042/109] net: gso: limit recursive IP-in-IP segmentation Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 043/109] io-wq: order the exit bit against worker creation task work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 044/109] io_uring/waitid: own the request before clearing ->head Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 045/109] io_uring/cmd: dont leave list poison in ->hash_node Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 046/109] io_uring/wait: dont spin on a stuck overflow list Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 047/109] io_uring/io-wq: dont lose the signal that ends work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 048/109] io_uring/io-wq: dont hide a link from cancellations Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 049/109] io_uring: dont flood a cancelling task with task_work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 050/109] io_uring/io-wq: dont go to sleep on pending work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 051/109] io_uring/io-wq: dont strand work when a worker exits Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 052/109] io_uring/io-wq: dont exit with a creation pending Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 053/109] io_uring/io-wq: let cancel find picked up hashed work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 054/109] io_uring/poll: dont lose a cancel as io-wq arms poll Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 055/109] io_uring: dont lose a cancel as io-wq parks a request Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 056/109] io_uring/cancel: dont forget that the work was running Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 057/109] io_uring/cancel: recognize "no timeout" on 32-bit Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 058/109] io_uring/cancel: let CANCEL_ALL find parked requests Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 059/109] io_uring: wake ring pollers for local task_work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 060/109] io_uring/wait: look at all CQ waiters on wake up Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 061/109] io_uring/poll: drop stale double poll entry on rearm Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 062/109] io_uring/futex: allocate private hash before waiting Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 063/109] io_uring: drop the CQE cache if a refill fails Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 064/109] io_uring/register: dont wrap 32b CQEs when resizing Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 065/109] io_uring/register: handle index wrap " Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 066/109] io_uring/fdinfo: fix CQE dump of CQE32 rings Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 067/109] io_uring/timeout: dont skip over reached sequences Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 068/109] io_uring/timeout: keep repeat count on multishot update Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 069/109] io_uring/wait: no early -ETIME if min_wait finds work Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 070/109] io_uring/napi: make stale entries time out after 60s Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 071/109] io_uring/napi: dont busy poll past an expired timeout Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 072/109] io_uring/zcrx: fix buffer offsets in areas above 4GB Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 073/109] io_uring/kbuf: handle index wrap in last buffer check Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 074/109] io_uring/sqpoll: let the thread sleep on disabled rings Greg Kroah-Hartman
2026-10-28 17:00 ` [PATCH 6.18 075/109] io_uring/openclose: keep the lock in io_pipe_fixed() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 076/109] io_uring: dont pass restart error codes to userspace Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 077/109] io_uring/net: dont retry recv on uncommitted buffers Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 078/109] io_uring/timeout: no ABS update of multishot timeouts Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 079/109] io_uring/timeout: dont end a linked timeout with 1 Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 080/109] io_uring: look up the file before queueing to io-wq Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 081/109] io_uring/poll: avoid retry wakeup loss when dropping ownership Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 082/109] io_uring/timeout: dont put a sequence target behind the last flush Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 083/109] io_uring/timeout: dont flush with the sequence " Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 084/109] io_uring/timeout: dont lose a cancel as io-wq arms a timeout Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 085/109] io_uring/poll: dont loop on HUP with multiple references Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 086/109] io_uring/net: keep recv buffer select length within MAX_RW_COUNT Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 087/109] io_uring/wait: wake real-time waiters from hard interrupt context Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 088/109] io_uring/waitid: prevent cancel reference wrap Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 089/109] io_uring: end the drain when the drain request completes Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 090/109] io_uring: keep the drain active when a deferred drain request is started Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 091/109] keys: Avoid the owner account dereference in named keyring lookup Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 092/109] keys: Check the authorization payload in process keyring searches Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 093/109] keys: Protect the type name while describing a key Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 094/109] keys: make keyring indexes independent of kernel addresses Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 095/109] keys: Protect the read method check against type removal Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 096/109] KEYS: Fix key_reject_and_link() race with keyring restriction Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 097/109] KEYS: trusted: Fix blob allocation size in tpm2_key_decode() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 098/109] keys/trusted_keys: return immediately after TPM unseal failure Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 099/109] asymmetric_keys: reject trust keys without IDs Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 100/109] ftrace: Initialize modname and offset in print_rec() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 101/109] coredump: hold RCU while releasing parked threads Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 102/109] signal: only SIGKILL and the freezers interrupt a coredumping task Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 103/109] signal: dont retarget shared signals in a dying thread group Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 104/109] ptrace: refuse to change the signal mask of a user worker Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 105/109] fork: release the files of a failed fork after sched_cancel_fork() Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 106/109] exit: hang up the tty before closing the files Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 107/109] pid_namespace: prevent TIF_NOTIFY_SIGNAL from interrupting the reaper Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 108/109] signal: allow taks to temporarily block TIF_NOTIFY_SIGNAL Greg Kroah-Hartman
2026-10-28 17:01 ` [PATCH 6.18 109/109] ACPI: scan: Avoid registering platform devices with resource overlaps Greg Kroah-Hartman
2026-10-28 19:39 ` [PATCH 6.18 000/109] 6.18.60-rc1 review Brett A C Sheffield
2026-10-29  3:09 ` Peter Schneider
2026-10-29 10:07 ` Pavel Machek
2026-10-29 13:43 ` Miguel Ojeda
2026-10-29 14:23 ` Ron Economos
2026-10-29 15:21 ` Shuah Khan
2026-10-29 16:29 ` Florian Fainelli

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=20261028165942.674722693@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=bernard.f6bvp@gmail.com \
    --cc=kuba@kernel.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