Commit bc57eda6 authored by Sebastian Andrzej Siewior's avatar Sebastian Andrzej Siewior Committed by Paolo Abeni
Browse files

ipv6: sr: Use nested-BH locking for hmac_storage



hmac_storage is a per-CPU variable and relies on disabled BH for its
locking. Without per-CPU locking in local_bh_disable() on PREEMPT_RT
this data structure requires explicit locking.

Add a local_lock_t to the data structure and use
local_lock_nested_bh() for locking. This change adds only lockdep
coverage and does not alter the functional behaviour for !PREEMPT_RT.

Cc: David Ahern <dsahern@kernel.org>
Signed-off-by: default avatarSebastian Andrzej Siewior <bigeasy@linutronix.de>
Link: https://patch.msgid.link/20250512092736.229935-5-bigeasy@linutronix.de


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 1c082978
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -40,7 +40,14 @@
#include <net/seg6_hmac.h>
#include <linux/random.h>

static DEFINE_PER_CPU(char [SEG6_HMAC_RING_SIZE], hmac_ring);
struct hmac_storage {
	local_lock_t bh_lock;
	char hmac_ring[SEG6_HMAC_RING_SIZE];
};

static DEFINE_PER_CPU(struct hmac_storage, hmac_storage) = {
	.bh_lock = INIT_LOCAL_LOCK(bh_lock),
};

static int seg6_hmac_cmpfn(struct rhashtable_compare_arg *arg, const void *obj)
{
@@ -187,7 +194,8 @@ int seg6_hmac_compute(struct seg6_hmac_info *hinfo, struct ipv6_sr_hdr *hdr,
	 */

	local_bh_disable();
	ring = this_cpu_ptr(hmac_ring);
	local_lock_nested_bh(&hmac_storage.bh_lock);
	ring = this_cpu_ptr(hmac_storage.hmac_ring);
	off = ring;

	/* source address */
@@ -212,6 +220,7 @@ int seg6_hmac_compute(struct seg6_hmac_info *hinfo, struct ipv6_sr_hdr *hdr,

	dgsize = __do_hmac(hinfo, ring, plen, tmp_out,
			   SEG6_HMAC_MAX_DIGESTSIZE);
	local_unlock_nested_bh(&hmac_storage.bh_lock);
	local_bh_enable();

	if (dgsize < 0)