All of lore.kernel.org
 help / color / mirror / Atom feed
From: Oleg Nesterov <oleg@redhat.com>
To: Boqun Feng <boqun.feng@gmail.com>, Ingo Molnar <mingo@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Rik van Riel <riel@surriel.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Waiman Long <longman@redhat.com>, Will Deacon <will@kernel.org>
Cc: Alexey Gladkov <legion@kernel.org>,
	"Eric W. Biederman" <ebiederm@xmission.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH 3/5] seqlock: introduce seqprop_lock/unlock
Date: Wed, 13 Sep 2023 17:50:00 +0200	[thread overview]
Message-ID: <20230913155000.GA26248@redhat.com> (raw)
In-Reply-To: <20230913154907.GA26210@redhat.com>

which can be used to take/release the corresponding lock.

Thanks to the previous patch, it is trivial to pass 2 arguments to
the new __seqprop_##lockname##_lock/unlock "methods", plus we do not
loose the type info and thus the new seqprop's are "type safe".

So for example

	void func(seqcount_rwlock_t *s, rwlock_t *l)
	{
		seqprop_lock(s, l);
	}

happily compiles, but this one

	void func(seqcount_rwlock_t *s, spinlock_t *l)
	{
		seqprop_lock(s, l);
	}

doesn't.

Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
 include/linux/seqlock.h | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/include/linux/seqlock.h b/include/linux/seqlock.h
index 41e36f8afad4..9831683a0102 100644
--- a/include/linux/seqlock.h
+++ b/include/linux/seqlock.h
@@ -241,6 +241,21 @@ static __always_inline void						\
 __seqprop_##lockname##_assert(const seqcount_##lockname##_t *s)		\
 {									\
 	__SEQ_LOCK(lockdep_assert_held(s->lock));			\
+}									\
+									\
+static __always_inline void						\
+__seqprop_##lockname##_lock(seqcount_##lockname##_t *s,			\
+				locktype *lock)				\
+{									\
+	__SEQ_LOCK(WARN_ON_ONCE(s->lock != lock));			\
+	lockbase##_lock(lock);						\
+}									\
+									\
+static __always_inline void						\
+__seqprop_##lockname##_unlock(seqcount_##lockname##_t *s,		\
+				locktype *lock)				\
+{									\
+	lockbase##_unlock(lock); 					\
 }
 
 /*
@@ -306,6 +321,12 @@ SEQCOUNT_LOCKNAME(mutex,        struct mutex,    true,     mutex)
 #define seqprop_preemptible(s)		__seqprop(s, preemptible)(s)
 #define seqprop_assert(s)		__seqprop(s, assert)(s)
 
+/* seqcount_t doesn't have these methods */
+static inline void __seqprop_lock   (seqcount_t *s, void *l) { BUILD_BUG(); }
+static inline void __seqprop_unlock (seqcount_t *s, void *l) { BUILD_BUG(); }
+#define seqprop_lock(s, l)		__seqprop(s, lock)(s, l)
+#define seqprop_unlock(s, l)		__seqprop(s, unlock)(s, l)
+
 /**
  * __read_seqcount_begin() - begin a seqcount_t read section w/o barrier
  * @s: Pointer to seqcount_t or any of the seqcount_LOCKNAME_t variants
-- 
2.25.1.362.g51ebf55


  parent reply	other threads:[~2023-09-13 15:51 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-09-13 15:49 [PATCH 0/5] turn signal_struct.stats_lock into seqcount_rwlock_t Oleg Nesterov
2023-09-13 15:49 ` [PATCH 1/5] seqlock: simplify SEQCOUNT_LOCKNAME() Oleg Nesterov
2023-09-15 17:36   ` Alexey Gladkov
2023-09-16  8:51   ` Peter Zijlstra
2023-09-21 11:48     ` Oleg Nesterov
2023-09-21 14:04       ` Peter Zijlstra
2023-09-21 14:31         ` Oleg Nesterov
2023-09-13 15:49 ` [PATCH 2/5] seqlock: change __seqprop() to return the function pointer Oleg Nesterov
2023-09-13 17:37   ` kernel test robot
2023-09-13 18:30     ` Oleg Nesterov
2023-09-13 17:59   ` kernel test robot
2023-09-13 19:23   ` kernel test robot
2023-09-13 15:50 ` Oleg Nesterov [this message]
2023-09-15 18:25   ` [PATCH 3/5] seqlock: introduce seqprop_lock/unlock Alexey Gladkov
2023-09-15 18:43     ` Oleg Nesterov
2023-09-13 15:50 ` [PATCH 4/5] seqlock: introduce read_seqcount_begin_or_lock() and friends Oleg Nesterov
2023-09-13 15:50 ` [PATCH 5/5] time,signal: turn signal_struct.stats_lock into seqcount_rwlock_t Oleg Nesterov
2023-09-23 12:37   ` Alexey Gladkov

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=20230913155000.GA26248@redhat.com \
    --to=oleg@redhat.com \
    --cc=boqun.feng@gmail.com \
    --cc=ebiederm@xmission.com \
    --cc=legion@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=longman@redhat.com \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=riel@surriel.com \
    --cc=tglx@linutronix.de \
    --cc=will@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.