stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	stable@vger.kernel.org, "Jason A. Donenfeld" <Jason@zx2c4.com>,
	"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 5.12 102/161] wireguard: allowedips: free empty intermediate nodes when removing single node
Date: Tue,  8 Jun 2021 20:27:12 +0200	[thread overview]
Message-ID: <20210608175948.906500453@linuxfoundation.org> (raw)
In-Reply-To: <20210608175945.476074951@linuxfoundation.org>

From: Jason A. Donenfeld <Jason@zx2c4.com>

commit bf7b042dc62a31f66d3a41dd4dfc7806f267b307 upstream.

When removing single nodes, it's possible that that node's parent is an
empty intermediate node, in which case, it too should be removed.
Otherwise the trie fills up and never is fully emptied, leading to
gradual memory leaks over time for tries that are modified often. There
was originally code to do this, but was removed during refactoring in
2016 and never reworked. Now that we have proper parent pointers from
the previous commits, we can implement this properly.

In order to reduce branching and expensive comparisons, we want to keep
the double pointer for parent assignment (which lets us easily chain up
to the root), but we still need to actually get the parent's base
address. So encode the bit number into the last two bits of the pointer,
and pack and unpack it as needed. This is a little bit clumsy but is the
fastest and less memory wasteful of the compromises. Note that we align
the root struct here to a minimum of 4, because it's embedded into a
larger struct, and we're relying on having the bottom two bits for our
flag, which would only be 16-bit aligned on m68k.

The existing macro-based helpers were a bit unwieldy for adding the bit
packing to, so this commit replaces them with safer and clearer ordinary
functions.

We add a test to the randomized/fuzzer part of the selftests, to free
the randomized tries by-peer, refuzz it, and repeat, until it's supposed
to be empty, and then then see if that actually resulted in the whole
thing being emptied. That combined with kmemcheck should hopefully make
sure this commit is doing what it should. Along the way this resulted in
various other cleanups of the tests and fixes for recent graphviz.

Fixes: e7096c131e51 ("net: WireGuard secure network tunnel")
Cc: stable@vger.kernel.org
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/net/wireguard/allowedips.c          |  102 ++++++++++-------
 drivers/net/wireguard/allowedips.h          |    4 
 drivers/net/wireguard/selftest/allowedips.c |  162 +++++++++++++---------------
 3 files changed, 137 insertions(+), 131 deletions(-)

--- a/drivers/net/wireguard/allowedips.c
+++ b/drivers/net/wireguard/allowedips.c
@@ -30,8 +30,11 @@ static void copy_and_assign_cidr(struct
 	node->bitlen = bits;
 	memcpy(node->bits, src, bits / 8U);
 }
-#define CHOOSE_NODE(parent, key) \
-	parent->bit[(key[parent->bit_at_a] >> parent->bit_at_b) & 1]
+
+static inline u8 choose(struct allowedips_node *node, const u8 *key)
+{
+	return (key[node->bit_at_a] >> node->bit_at_b) & 1;
+}
 
 static void push_rcu(struct allowedips_node **stack,
 		     struct allowedips_node __rcu *p, unsigned int *len)
@@ -112,7 +115,7 @@ static struct allowedips_node *find_node
 			found = node;
 		if (node->cidr == bits)
 			break;
-		node = rcu_dereference_bh(CHOOSE_NODE(node, key));
+		node = rcu_dereference_bh(node->bit[choose(node, key)]);
 	}
 	return found;
 }
@@ -144,8 +147,7 @@ static bool node_placement(struct allowe
 			   u8 cidr, u8 bits, struct allowedips_node **rnode,
 			   struct mutex *lock)
 {
-	struct allowedips_node *node = rcu_dereference_protected(trie,
-						lockdep_is_held(lock));
+	struct allowedips_node *node = rcu_dereference_protected(trie, lockdep_is_held(lock));
 	struct allowedips_node *parent = NULL;
 	bool exact = false;
 
@@ -155,13 +157,24 @@ static bool node_placement(struct allowe
 			exact = true;
 			break;
 		}
-		node = rcu_dereference_protected(CHOOSE_NODE(parent, key),
-						 lockdep_is_held(lock));
+		node = rcu_dereference_protected(parent->bit[choose(parent, key)], lockdep_is_held(lock));
 	}
 	*rnode = parent;
 	return exact;
 }
 
+static inline void connect_node(struct allowedips_node **parent, u8 bit, struct allowedips_node *node)
+{
+	node->parent_bit_packed = (unsigned long)parent | bit;
+	rcu_assign_pointer(*parent, node);
+}
+
+static inline void choose_and_connect_node(struct allowedips_node *parent, struct allowedips_node *node)
+{
+	u8 bit = choose(parent, node->bits);
+	connect_node(&parent->bit[bit], bit, node);
+}
+
 static int add(struct allowedips_node __rcu **trie, u8 bits, const u8 *key,
 	       u8 cidr, struct wg_peer *peer, struct mutex *lock)
 {
@@ -177,8 +190,7 @@ static int add(struct allowedips_node __
 		RCU_INIT_POINTER(node->peer, peer);
 		list_add_tail(&node->peer_list, &peer->allowedips_list);
 		copy_and_assign_cidr(node, key, cidr, bits);
-		rcu_assign_pointer(node->parent_bit, trie);
-		rcu_assign_pointer(*trie, node);
+		connect_node(trie, 2, node);
 		return 0;
 	}
 	if (node_placement(*trie, key, cidr, bits, &node, lock)) {
@@ -197,10 +209,10 @@ static int add(struct allowedips_node __
 	if (!node) {
 		down = rcu_dereference_protected(*trie, lockdep_is_held(lock));
 	} else {
-		down = rcu_dereference_protected(CHOOSE_NODE(node, key), lockdep_is_held(lock));
+		const u8 bit = choose(node, key);
+		down = rcu_dereference_protected(node->bit[bit], lockdep_is_held(lock));
 		if (!down) {
-			rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(node, key));
-			rcu_assign_pointer(CHOOSE_NODE(node, key), newnode);
+			connect_node(&node->bit[bit], bit, newnode);
 			return 0;
 		}
 	}
@@ -208,15 +220,11 @@ static int add(struct allowedips_node __
 	parent = node;
 
 	if (newnode->cidr == cidr) {
-		rcu_assign_pointer(down->parent_bit, &CHOOSE_NODE(newnode, down->bits));
-		rcu_assign_pointer(CHOOSE_NODE(newnode, down->bits), down);
-		if (!parent) {
-			rcu_assign_pointer(newnode->parent_bit, trie);
-			rcu_assign_pointer(*trie, newnode);
-		} else {
-			rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(parent, newnode->bits));
-			rcu_assign_pointer(CHOOSE_NODE(parent, newnode->bits), newnode);
-		}
+		choose_and_connect_node(newnode, down);
+		if (!parent)
+			connect_node(trie, 2, newnode);
+		else
+			choose_and_connect_node(parent, newnode);
 		return 0;
 	}
 
@@ -229,17 +237,12 @@ static int add(struct allowedips_node __
 	INIT_LIST_HEAD(&node->peer_list);
 	copy_and_assign_cidr(node, newnode->bits, cidr, bits);
 
-	rcu_assign_pointer(down->parent_bit, &CHOOSE_NODE(node, down->bits));
-	rcu_assign_pointer(CHOOSE_NODE(node, down->bits), down);
-	rcu_assign_pointer(newnode->parent_bit, &CHOOSE_NODE(node, newnode->bits));
-	rcu_assign_pointer(CHOOSE_NODE(node, newnode->bits), newnode);
-	if (!parent) {
-		rcu_assign_pointer(node->parent_bit, trie);
-		rcu_assign_pointer(*trie, node);
-	} else {
-		rcu_assign_pointer(node->parent_bit, &CHOOSE_NODE(parent, node->bits));
-		rcu_assign_pointer(CHOOSE_NODE(parent, node->bits), node);
-	}
+	choose_and_connect_node(node, down);
+	choose_and_connect_node(node, newnode);
+	if (!parent)
+		connect_node(trie, 2, node);
+	else
+		choose_and_connect_node(parent, node);
 	return 0;
 }
 
@@ -297,7 +300,8 @@ int wg_allowedips_insert_v6(struct allow
 void wg_allowedips_remove_by_peer(struct allowedips *table,
 				  struct wg_peer *peer, struct mutex *lock)
 {
-	struct allowedips_node *node, *child, *tmp;
+	struct allowedips_node *node, *child, **parent_bit, *parent, *tmp;
+	bool free_parent;
 
 	if (list_empty(&peer->allowedips_list))
 		return;
@@ -307,19 +311,29 @@ void wg_allowedips_remove_by_peer(struct
 		RCU_INIT_POINTER(node->peer, NULL);
 		if (node->bit[0] && node->bit[1])
 			continue;
-		child = rcu_dereference_protected(
-				node->bit[!rcu_access_pointer(node->bit[0])],
-				lockdep_is_held(lock));
+		child = rcu_dereference_protected(node->bit[!rcu_access_pointer(node->bit[0])],
+						  lockdep_is_held(lock));
 		if (child)
-			child->parent_bit = node->parent_bit;
-		*rcu_dereference_protected(node->parent_bit, lockdep_is_held(lock)) = child;
+			child->parent_bit_packed = node->parent_bit_packed;
+		parent_bit = (struct allowedips_node **)(node->parent_bit_packed & ~3UL);
+		*parent_bit = child;
+		parent = (void *)parent_bit -
+			 offsetof(struct allowedips_node, bit[node->parent_bit_packed & 1]);
+		free_parent = !rcu_access_pointer(node->bit[0]) &&
+			      !rcu_access_pointer(node->bit[1]) &&
+			      (node->parent_bit_packed & 3) <= 1 &&
+			      !rcu_access_pointer(parent->peer);
+		if (free_parent)
+			child = rcu_dereference_protected(
+					parent->bit[!(node->parent_bit_packed & 1)],
+					lockdep_is_held(lock));
 		call_rcu(&node->rcu, node_free_rcu);
-
-		/* TODO: Note that we currently don't walk up and down in order to
-		 * free any potential filler nodes. This means that this function
-		 * doesn't free up as much as it could, which could be revisited
-		 * at some point.
-		 */
+		if (!free_parent)
+			continue;
+		if (child)
+			child->parent_bit_packed = parent->parent_bit_packed;
+		*(struct allowedips_node **)(parent->parent_bit_packed & ~3UL) = child;
+		call_rcu(&parent->rcu, node_free_rcu);
 	}
 }
 
--- a/drivers/net/wireguard/allowedips.h
+++ b/drivers/net/wireguard/allowedips.h
@@ -19,7 +19,7 @@ struct allowedips_node {
 	u8 bits[16] __aligned(__alignof(u64));
 
 	/* Keep rarely used members at bottom to be beyond cache line. */
-	struct allowedips_node *__rcu *parent_bit;
+	unsigned long parent_bit_packed;
 	union {
 		struct list_head peer_list;
 		struct rcu_head rcu;
@@ -30,7 +30,7 @@ struct allowedips {
 	struct allowedips_node __rcu *root4;
 	struct allowedips_node __rcu *root6;
 	u64 seq;
-};
+} __aligned(4); /* We pack the lower 2 bits of &root, but m68k only gives 16-bit alignment. */
 
 void wg_allowedips_init(struct allowedips *table);
 void wg_allowedips_free(struct allowedips *table, struct mutex *mutex);
--- a/drivers/net/wireguard/selftest/allowedips.c
+++ b/drivers/net/wireguard/selftest/allowedips.c
@@ -19,32 +19,22 @@
 
 #include <linux/siphash.h>
 
-static __init void swap_endian_and_apply_cidr(u8 *dst, const u8 *src, u8 bits,
-					      u8 cidr)
-{
-	swap_endian(dst, src, bits);
-	memset(dst + (cidr + 7) / 8, 0, bits / 8 - (cidr + 7) / 8);
-	if (cidr)
-		dst[(cidr + 7) / 8 - 1] &= ~0U << ((8 - (cidr % 8)) % 8);
-}
-
 static __init void print_node(struct allowedips_node *node, u8 bits)
 {
 	char *fmt_connection = KERN_DEBUG "\t\"%p/%d\" -> \"%p/%d\";\n";
-	char *fmt_declaration = KERN_DEBUG
-		"\t\"%p/%d\"[style=%s, color=\"#%06x\"];\n";
+	char *fmt_declaration = KERN_DEBUG "\t\"%p/%d\"[style=%s, color=\"#%06x\"];\n";
+	u8 ip1[16], ip2[16], cidr1, cidr2;
 	char *style = "dotted";
-	u8 ip1[16], ip2[16];
 	u32 color = 0;
 
+	if (node == NULL)
+		return;
 	if (bits == 32) {
 		fmt_connection = KERN_DEBUG "\t\"%pI4/%d\" -> \"%pI4/%d\";\n";
-		fmt_declaration = KERN_DEBUG
-			"\t\"%pI4/%d\"[style=%s, color=\"#%06x\"];\n";
+		fmt_declaration = KERN_DEBUG "\t\"%pI4/%d\"[style=%s, color=\"#%06x\"];\n";
 	} else if (bits == 128) {
 		fmt_connection = KERN_DEBUG "\t\"%pI6/%d\" -> \"%pI6/%d\";\n";
-		fmt_declaration = KERN_DEBUG
-			"\t\"%pI6/%d\"[style=%s, color=\"#%06x\"];\n";
+		fmt_declaration = KERN_DEBUG "\t\"%pI6/%d\"[style=%s, color=\"#%06x\"];\n";
 	}
 	if (node->peer) {
 		hsiphash_key_t key = { { 0 } };
@@ -55,24 +45,20 @@ static __init void print_node(struct all
 			hsiphash_1u32(0xabad1dea, &key) % 200;
 		style = "bold";
 	}
-	swap_endian_and_apply_cidr(ip1, node->bits, bits, node->cidr);
-	printk(fmt_declaration, ip1, node->cidr, style, color);
+	wg_allowedips_read_node(node, ip1, &cidr1);
+	printk(fmt_declaration, ip1, cidr1, style, color);
 	if (node->bit[0]) {
-		swap_endian_and_apply_cidr(ip2,
-				rcu_dereference_raw(node->bit[0])->bits, bits,
-				node->cidr);
-		printk(fmt_connection, ip1, node->cidr, ip2,
-		       rcu_dereference_raw(node->bit[0])->cidr);
-		print_node(rcu_dereference_raw(node->bit[0]), bits);
+		wg_allowedips_read_node(rcu_dereference_raw(node->bit[0]), ip2, &cidr2);
+		printk(fmt_connection, ip1, cidr1, ip2, cidr2);
 	}
 	if (node->bit[1]) {
-		swap_endian_and_apply_cidr(ip2,
-				rcu_dereference_raw(node->bit[1])->bits,
-				bits, node->cidr);
-		printk(fmt_connection, ip1, node->cidr, ip2,
-		       rcu_dereference_raw(node->bit[1])->cidr);
-		print_node(rcu_dereference_raw(node->bit[1]), bits);
+		wg_allowedips_read_node(rcu_dereference_raw(node->bit[1]), ip2, &cidr2);
+		printk(fmt_connection, ip1, cidr1, ip2, cidr2);
 	}
+	if (node->bit[0])
+		print_node(rcu_dereference_raw(node->bit[0]), bits);
+	if (node->bit[1])
+		print_node(rcu_dereference_raw(node->bit[1]), bits);
 }
 
 static __init void print_tree(struct allowedips_node __rcu *top, u8 bits)
@@ -121,8 +107,8 @@ static __init inline union nf_inet_addr
 {
 	union nf_inet_addr mask;
 
-	memset(&mask, 0x00, 128 / 8);
-	memset(&mask, 0xff, cidr / 8);
+	memset(&mask, 0, sizeof(mask));
+	memset(&mask.all, 0xff, cidr / 8);
 	if (cidr % 32)
 		mask.all[cidr / 32] = (__force u32)htonl(
 			(0xFFFFFFFFUL << (32 - (cidr % 32))) & 0xFFFFFFFFUL);
@@ -149,42 +135,36 @@ horrible_mask_self(struct horrible_allow
 }
 
 static __init inline bool
-horrible_match_v4(const struct horrible_allowedips_node *node,
-		  struct in_addr *ip)
+horrible_match_v4(const struct horrible_allowedips_node *node, struct in_addr *ip)
 {
 	return (ip->s_addr & node->mask.ip) == node->ip.ip;
 }
 
 static __init inline bool
-horrible_match_v6(const struct horrible_allowedips_node *node,
-		  struct in6_addr *ip)
+horrible_match_v6(const struct horrible_allowedips_node *node, struct in6_addr *ip)
 {
-	return (ip->in6_u.u6_addr32[0] & node->mask.ip6[0]) ==
-		       node->ip.ip6[0] &&
-	       (ip->in6_u.u6_addr32[1] & node->mask.ip6[1]) ==
-		       node->ip.ip6[1] &&
-	       (ip->in6_u.u6_addr32[2] & node->mask.ip6[2]) ==
-		       node->ip.ip6[2] &&
+	return (ip->in6_u.u6_addr32[0] & node->mask.ip6[0]) == node->ip.ip6[0] &&
+	       (ip->in6_u.u6_addr32[1] & node->mask.ip6[1]) == node->ip.ip6[1] &&
+	       (ip->in6_u.u6_addr32[2] & node->mask.ip6[2]) == node->ip.ip6[2] &&
 	       (ip->in6_u.u6_addr32[3] & node->mask.ip6[3]) == node->ip.ip6[3];
 }
 
 static __init void
-horrible_insert_ordered(struct horrible_allowedips *table,
-			struct horrible_allowedips_node *node)
+horrible_insert_ordered(struct horrible_allowedips *table, struct horrible_allowedips_node *node)
 {
 	struct horrible_allowedips_node *other = NULL, *where = NULL;
 	u8 my_cidr = horrible_mask_to_cidr(node->mask);
 
 	hlist_for_each_entry(other, &table->head, table) {
-		if (!memcmp(&other->mask, &node->mask,
-			    sizeof(union nf_inet_addr)) &&
-		    !memcmp(&other->ip, &node->ip,
-			    sizeof(union nf_inet_addr)) &&
-		    other->ip_version == node->ip_version) {
+		if (other->ip_version == node->ip_version &&
+		    !memcmp(&other->mask, &node->mask, sizeof(union nf_inet_addr)) &&
+		    !memcmp(&other->ip, &node->ip, sizeof(union nf_inet_addr))) {
 			other->value = node->value;
 			kfree(node);
 			return;
 		}
+	}
+	hlist_for_each_entry(other, &table->head, table) {
 		where = other;
 		if (horrible_mask_to_cidr(other->mask) <= my_cidr)
 			break;
@@ -201,8 +181,7 @@ static __init int
 horrible_allowedips_insert_v4(struct horrible_allowedips *table,
 			      struct in_addr *ip, u8 cidr, void *value)
 {
-	struct horrible_allowedips_node *node = kzalloc(sizeof(*node),
-							GFP_KERNEL);
+	struct horrible_allowedips_node *node = kzalloc(sizeof(*node), GFP_KERNEL);
 
 	if (unlikely(!node))
 		return -ENOMEM;
@@ -219,8 +198,7 @@ static __init int
 horrible_allowedips_insert_v6(struct horrible_allowedips *table,
 			      struct in6_addr *ip, u8 cidr, void *value)
 {
-	struct horrible_allowedips_node *node = kzalloc(sizeof(*node),
-							GFP_KERNEL);
+	struct horrible_allowedips_node *node = kzalloc(sizeof(*node), GFP_KERNEL);
 
 	if (unlikely(!node))
 		return -ENOMEM;
@@ -234,39 +212,43 @@ horrible_allowedips_insert_v6(struct hor
 }
 
 static __init void *
-horrible_allowedips_lookup_v4(struct horrible_allowedips *table,
-			      struct in_addr *ip)
+horrible_allowedips_lookup_v4(struct horrible_allowedips *table, struct in_addr *ip)
 {
 	struct horrible_allowedips_node *node;
-	void *ret = NULL;
 
 	hlist_for_each_entry(node, &table->head, table) {
-		if (node->ip_version != 4)
-			continue;
-		if (horrible_match_v4(node, ip)) {
-			ret = node->value;
-			break;
-		}
+		if (node->ip_version == 4 && horrible_match_v4(node, ip))
+			return node->value;
 	}
-	return ret;
+	return NULL;
 }
 
 static __init void *
-horrible_allowedips_lookup_v6(struct horrible_allowedips *table,
-			      struct in6_addr *ip)
+horrible_allowedips_lookup_v6(struct horrible_allowedips *table, struct in6_addr *ip)
 {
 	struct horrible_allowedips_node *node;
-	void *ret = NULL;
 
 	hlist_for_each_entry(node, &table->head, table) {
-		if (node->ip_version != 6)
+		if (node->ip_version == 6 && horrible_match_v6(node, ip))
+			return node->value;
+	}
+	return NULL;
+}
+
+
+static __init void
+horrible_allowedips_remove_by_value(struct horrible_allowedips *table, void *value)
+{
+	struct horrible_allowedips_node *node;
+	struct hlist_node *h;
+
+	hlist_for_each_entry_safe(node, h, &table->head, table) {
+		if (node->value != value)
 			continue;
-		if (horrible_match_v6(node, ip)) {
-			ret = node->value;
-			break;
-		}
+		hlist_del(&node->table);
+		kfree(node);
 	}
-	return ret;
+
 }
 
 static __init bool randomized_test(void)
@@ -397,23 +379,33 @@ static __init bool randomized_test(void)
 		print_tree(t.root6, 128);
 	}
 
-	for (i = 0; i < NUM_QUERIES; ++i) {
-		prandom_bytes(ip, 4);
-		if (lookup(t.root4, 32, ip) !=
-		    horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip)) {
-			pr_err("allowedips random self-test: FAIL\n");
-			goto free;
+	for (j = 0;; ++j) {
+		for (i = 0; i < NUM_QUERIES; ++i) {
+			prandom_bytes(ip, 4);
+			if (lookup(t.root4, 32, ip) != horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip)) {
+				horrible_allowedips_lookup_v4(&h, (struct in_addr *)ip);
+				pr_err("allowedips random v4 self-test: FAIL\n");
+				goto free;
+			}
+			prandom_bytes(ip, 16);
+			if (lookup(t.root6, 128, ip) != horrible_allowedips_lookup_v6(&h, (struct in6_addr *)ip)) {
+				pr_err("allowedips random v6 self-test: FAIL\n");
+				goto free;
+			}
 		}
+		if (j >= NUM_PEERS)
+			break;
+		mutex_lock(&mutex);
+		wg_allowedips_remove_by_peer(&t, peers[j], &mutex);
+		mutex_unlock(&mutex);
+		horrible_allowedips_remove_by_value(&h, peers[j]);
 	}
 
-	for (i = 0; i < NUM_QUERIES; ++i) {
-		prandom_bytes(ip, 16);
-		if (lookup(t.root6, 128, ip) !=
-		    horrible_allowedips_lookup_v6(&h, (struct in6_addr *)ip)) {
-			pr_err("allowedips random self-test: FAIL\n");
-			goto free;
-		}
+	if (t.root4 || t.root6) {
+		pr_err("allowedips random self-test removal: FAIL\n");
+		goto free;
 	}
+
 	ret = true;
 
 free:



  parent reply	other threads:[~2021-06-08 19:14 UTC|newest]

Thread overview: 172+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-06-08 18:25 [PATCH 5.12 000/161] 5.12.10-rc1 review Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 001/161] mt76: mt7921: add rcu section in mt7921_mcu_tx_rate_report Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 002/161] mt76: mt7921: fix possible AOOB issue " Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 003/161] mt76: mt76x0e: fix device hang during suspend/resume Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 004/161] hwmon: (dell-smm-hwmon) Fix index values Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 005/161] hwmon: (pmbus/isl68137) remove READ_TEMPERATURE_3 for RAA228228 Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 006/161] netfilter: conntrack: unregister ipv4 sockopts on error unwind Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 007/161] efi/fdt: fix panic when no valid fdt found Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 008/161] efi: Allow EFI_MEMORY_XP and EFI_MEMORY_RO both to be cleared Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 009/161] efi/libstub: prevent read overflow in find_file_option() Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 010/161] efi: cper: fix snprintf() use in cper_dimm_err_location() Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 011/161] vfio/pci: Fix error return code in vfio_ecap_init() Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 012/161] vfio/pci: zap_vma_ptes() needs MMU Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 013/161] samples: vfio-mdev: fix error handing in mdpy_fb_probe() Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 014/161] vfio/platform: fix module_put call in error flow Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 015/161] ipvs: ignore IP_VS_SVC_F_HASHED flag when adding service Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 016/161] HID: logitech-hidpp: initialize level variable Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 017/161] HID: pidff: fix error return code in hid_pidff_init() Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 018/161] HID: amd_sfh: Fix memory leak in amd_sfh_work Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 019/161] HID: i2c-hid: fix format string mismatch Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 020/161] kbuild: Quote OBJCOPY var to avoid a pahole call break the build Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 021/161] devlink: Correct VIRTUAL port to not have phys_port attributes Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 022/161] net/sched: act_ct: Offload connections with commit action Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 023/161] net/sched: act_ct: Fix ct template allocation for zone 0 Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 024/161] mptcp: fix sk_forward_memory corruption on retransmission Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 025/161] mptcp: always parse mptcp options for MPC reqsk Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 026/161] mptcp: do not reset MP_CAPABLE subflow on mapping errors Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 027/161] nvme-rdma: fix in-casule data send for chained sgls Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 028/161] ACPICA: Clean up context mutex during object deletion Greg Kroah-Hartman
2021-06-08 18:25 ` [PATCH 5.12 029/161] perf probe: Fix NULL pointer dereference in convert_variable_location() Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 030/161] net: dsa: tag_8021q: fix the VLAN IDs used for encoding sub-VLANs Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 031/161] net: sock: fix in-kernel mark setting Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 032/161] net/tls: Replace TLS_RX_SYNC_RUNNING with RCU Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 033/161] net/tls: Fix use-after-free after the TLS device goes down and up Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 034/161] net/mlx5e: Fix incompatible casting Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 035/161] net/mlx5: Check firmware sync reset requested is set before trying to abort it Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 036/161] net/mlx5e: Check for needed capability for cvlan matching Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 037/161] net/mlx5e: Fix adding encap rules to slow path Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 038/161] net/mlx5: DR, Create multi-destination flow table with level less than 64 Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 039/161] nvmet: fix freeing unallocated p2pmem Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 040/161] netfilter: nft_ct: skip expectations for confirmed conntrack Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 041/161] netfilter: nfnetlink_cthelper: hit EBUSY on updates if size mismatches Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 042/161] drm/i915/selftests: Fix return value check in live_breadcrumbs_smoketest() Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 043/161] bpf, lockdown, audit: Fix buggy SELinux lockdown permission checks Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 044/161] ieee802154: fix error return code in ieee802154_add_iface() Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 045/161] ieee802154: fix error return code in ieee802154_llsec_getparams() Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 046/161] igb: Fix XDP with PTP enabled Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 047/161] igb: add correct exception tracing for XDP Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 048/161] ixgbevf: " Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 049/161] ice: track AF_XDP ZC enabled queues in bitmap Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 050/161] cxgb4: fix regression with HASH tc prio value update Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 051/161] ipv6: Fix KASAN: slab-out-of-bounds Read in fib6_nh_flush_exceptions Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 052/161] ice: Fix allowing VF to request more/less queues via virtchnl Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 053/161] ice: Fix VFR issues for AVF drivers that expect ATQLEN cleared Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 054/161] ice: handle the VF VSI rebuild failure Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 055/161] ice: report supported and advertised autoneg using PHY capabilities Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 056/161] ice: Allow all LLDP packets from PF to Tx Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 057/161] i2c: qcom-geni: Add shutdown callback for i2c Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 058/161] sch_htb: fix refcount leak in htb_parent_to_leaf_offload Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 059/161] cxgb4: avoid link re-train during TC-MQPRIO configuration Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 060/161] i40e: optimize for XDP_REDIRECT in xsk path Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 061/161] i40e: add correct exception tracing for XDP Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 062/161] ice: optimize for XDP_REDIRECT in xsk path Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 063/161] ice: add correct exception tracing for XDP Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 064/161] ixgbe: optimize for XDP_REDIRECT in xsk path Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 065/161] ixgbe: add correct exception tracing for XDP Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 066/161] arm64: dts: ti: j7200-main: Mark Main NAVSS as dma-coherent Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 067/161] optee: use export_uuid() to copy client UUID Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 068/161] bus: ti-sysc: Fix am335x resume hang for usb otg module Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 069/161] arm64: dts: ls1028a: fix memory node Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 070/161] arm64: dts: zii-ultra: remove second GEN_3V3 regulator instance Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 071/161] arm64: dts: zii-ultra: fix 12V_MAIN voltage Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 072/161] arm64: dts: freescale: sl28: var4: fix RGMII clock and voltage Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 073/161] arm64: dts: freescale: sl28: var1: " Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 074/161] ARM: dts: imx7d-meerkat96: Fix the tuning-step property Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 075/161] ARM: dts: imx7d-pico: " Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 076/161] ARM: dts: imx: emcon-avari: Fix nxp,pca8574 #gpio-cells Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 077/161] bus: ti-sysc: Fix flakey idling of uarts and stop using swsup_sidle_act Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 078/161] arm64: meson: select COMMON_CLK Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 079/161] tipc: add extack messages for bearer/media failure Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 080/161] tipc: fix unique bearer names sanity check Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 081/161] serial: stm32: fix threaded interrupt handling Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 082/161] riscv: vdso: fix and clean-up Makefile Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 083/161] libceph: dont set global_id until we get an auth ticket Greg Kroah-Hartman
2021-06-08 19:07   ` Ilya Dryomov
2021-06-08 19:24     ` Sasha Levin
2021-06-08 19:39       ` Ilya Dryomov
2021-06-08 18:26 ` [PATCH 5.12 084/161] amdgpu: fix GEM obj leak in amdgpu_display_user_framebuffer_create Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 085/161] io_uring: fix link timeout refs Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 086/161] io_uring: use better types for cflags Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 087/161] io_uring: wrap io_kiocb reference count manipulation in helpers Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 088/161] io_uring: fix ltout double free on completion race Greg Kroah-Hartman
2021-06-08 18:26 ` [PATCH 5.12 089/161] drm/amdgpu/vcn3: add cancel_delayed_work_sync before power gate Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 090/161] drm/amdgpu/jpeg2.5: " Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 091/161] drm/amdgpu/jpeg3: " Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 092/161] Bluetooth: fix the erroneous flush_work() order Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 093/161] Bluetooth: use correct lock to prevent UAF of hdev object Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 094/161] wireguard: do not use -O3 Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 095/161] wireguard: peer: allocate in kmem_cache Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 096/161] wireguard: use synchronize_net rather than synchronize_rcu Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 097/161] wireguard: selftests: remove old conntrack kconfig value Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 098/161] wireguard: selftests: make sure rp_filter is disabled on vethc Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 099/161] wireguard: allowedips: initialize list head in selftest Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 100/161] wireguard: allowedips: remove nodes in O(1) Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 101/161] wireguard: allowedips: allocate nodes in kmem_cache Greg Kroah-Hartman
2021-06-08 18:27 ` Greg Kroah-Hartman [this message]
2021-06-08 18:27 ` [PATCH 5.12 103/161] net: caif: added cfserl_release function Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 104/161] net: caif: add proper error handling Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 105/161] net: caif: fix memory leak in caif_device_notify Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 106/161] net: caif: fix memory leak in cfusbl_device_notify Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 107/161] HID: i2c-hid: Skip ELAN power-on command after reset Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 108/161] HID: magicmouse: fix NULL-deref on disconnect Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 109/161] HID: multitouch: require Finger field to mark Win8 reports as MT Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 110/161] gfs2: fix scheduling while atomic bug in glocks Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 111/161] ALSA: timer: Fix master timer notification Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 112/161] ALSA: hda: Fix for mute key LED for HP Pavilion 15-CK0xx Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 113/161] ALSA: hda: update the power_state during the direct-complete Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 114/161] ARM: dts: imx6dl-yapp4: Fix RGMII connection to QCA8334 switch Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 115/161] ARM: dts: imx6q-dhcom: Add PU,VDD1P1,VDD2P5 regulators Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 116/161] ext4: fix memory leak in ext4_fill_super Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 117/161] ext4: fix bug on in ext4_es_cache_extent as ext4_split_extent_at failed Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 118/161] ext4: fix fast commit alignment issues Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 119/161] ext4: fix memory leak in ext4_mb_init_backend on error path Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 120/161] ext4: fix accessing uninit percpu counter variable with fast_commit Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 121/161] usb: dwc2: Fix build in periphal-only mode Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 122/161] Revert "MIPS: make userspace mapping young by default" Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 123/161] kfence: maximize allocation wait timeout duration Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 124/161] kfence: use TASK_IDLE when awaiting allocation Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 125/161] pid: take a reference when initializing `cad_pid` Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 126/161] ocfs2: fix data corruption by fallocate Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 127/161] mm/debug_vm_pgtable: fix alignment for pmd/pud_advanced_tests() Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 128/161] mm/page_alloc: fix counting of free pages after take off from buddy Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 129/161] scsi: lpfc: Fix failure to transmit ABTS on FC link Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 130/161] x86/cpufeatures: Force disable X86_FEATURE_ENQCMD and remove update_pasid() Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 131/161] dmaengine: idxd: Use cpu_feature_enabled() Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 132/161] x86/sev: Check SME/SEV support in CPUID first Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 133/161] KVM: PPC: Book3S HV: Save host FSCR in the P7/8 path Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 134/161] nfc: fix NULL ptr dereference in llcp_sock_getname() after failed connect Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 135/161] drm/amdgpu: Dont query CE and UE errors Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 136/161] drm/amdgpu: make sure we unpin the UVD BO Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 137/161] x86/apic: Mark _all_ legacy interrupts when IO/APIC is missing Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 138/161] x86/thermal: Fix LVT thermal setup for SMI delivery mode Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 139/161] powerpc/kprobes: Fix validation of prefixed instructions across page boundary Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 140/161] btrfs: mark ordered extent and inode with error if we fail to finish Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 141/161] btrfs: fix error handling in btrfs_del_csums Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 142/161] btrfs: return errors from btrfs_del_csums in cleanup_ref_head Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 143/161] btrfs: fix fsync failure and transaction abort after writes to prealloc extents Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 144/161] btrfs: check error value from btrfs_update_inode in tree log Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 145/161] btrfs: fixup error handling in fixup_inode_link_counts Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 146/161] btrfs: abort in rename_exchange if we fail to insert the second ref Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 147/161] btrfs: fix deadlock when cloning inline extents and low on available space Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 148/161] mm, hugetlb: fix simple resv_huge_pages underflow on UFFDIO_COPY Greg Kroah-Hartman
2021-06-08 18:27 ` [PATCH 5.12 149/161] drm/msm/dpu: always use mdp device to scale bandwidth Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 150/161] KVM: SVM: Truncate GPR value for DR and CR accesses in !64-bit mode Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 151/161] x86/kvm: Teardown PV features on boot CPU as well Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 152/161] x86/kvm: Disable kvmclock on all CPUs on shutdown Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 153/161] x86/kvm: Disable all PV features on crash Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 154/161] KVM: arm64: Commit pending PC adjustemnts before returning to userspace Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 155/161] KVM: arm64: Resolve all pending PC updates before immediate exit Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 156/161] ARM: OMAP1: isp1301-omap: Add missing gpiod_add_lookup_table function Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 157/161] i2c: qcom-geni: Suspend and resume the bus during SYSTEM_SLEEP_PM ops Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 158/161] x86/fault: Dont send SIGSEGV twice on SEGV_PKUERR Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 159/161] netfilter: nf_tables: missing error reporting for not selected expressions Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 160/161] xen-netback: take a reference to the RX task thread Greg Kroah-Hartman
2021-06-08 18:28 ` [PATCH 5.12 161/161] neighbour: allow NUD_NOARP entries to be forced GCed Greg Kroah-Hartman
2021-06-08 23:56 ` [PATCH 5.12 000/161] 5.12.10-rc1 review Fox Chen
2021-06-09  2:54 ` Shuah Khan
2021-06-09  7:48 ` Naresh Kamboju
2021-06-09  9:34 ` Jon Hunter
2021-06-09 18:50 ` Guenter Roeck
2021-06-09 18:57 ` Florian Fainelli
2021-06-09 20:47 ` Justin Forbes

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=20210608175948.906500453@linuxfoundation.org \
    --to=gregkh@linuxfoundation.org \
    --cc=Jason@zx2c4.com \
    --cc=davem@davemloft.net \
    --cc=linux-kernel@vger.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;
as well as URLs for NNTP newsgroup(s).