aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2022-12-24 09:01:20 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2022-12-24 09:01:20 +0000
commit68f08e26e2797707c76f8c6423baa41b25dd9df4 (patch)
treee8f77718499d9f020737bf3070b0861a1c77e119
parent0661cf74e6e5dbd585c4a5a3e621d915bb6787d3 (diff)
downloadsrc-68f08e26e2797707c76f8c6423baa41b25dd9df4.tar.gz
src-68f08e26e2797707c76f8c6423baa41b25dd9df4.zip
LinuxKPI: linux/seqlock.h: Fix write_seqcount_(begin|end)
in seqcount_mutex_t case with removal of extraneous mutex lock/unlock calls and addition of missing critical section. While here strip one inline wrap layer to reduce code size. Fixes startup lockup of i915kms after update to drm-kmod v5.12 Reviewed by: hselasky, bz MFC after: 1week Differential Revision: https://reviews.freebsd.org/D37699
-rw-r--r--sys/compat/linuxkpi/common/include/linux/seqlock.h94
1 files changed, 13 insertions, 81 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/seqlock.h b/sys/compat/linuxkpi/common/include/linux/seqlock.h
index 4a5385f5e095..87a5136c1210 100644
--- a/sys/compat/linuxkpi/common/include/linux/seqlock.h
+++ b/sys/compat/linuxkpi/common/include/linux/seqlock.h
@@ -36,8 +36,6 @@
#include <sys/rwlock.h>
#include <sys/seqc.h>
-#include <linux/mutex.h>
-
struct lock_class_key;
struct seqcount {
@@ -52,8 +50,7 @@ struct seqlock {
typedef struct seqlock seqlock_t;
struct seqcount_mutex {
- struct mutex *seqm_lock;
- struct seqcount seqm_count;
+ seqc_t seqc;
};
typedef struct seqcount_mutex seqcount_mutex_t;
@@ -66,98 +63,33 @@ __seqcount_init(struct seqcount *seqcount, const char *name __unused,
#define seqcount_init(seqcount) __seqcount_init(seqcount, NULL, NULL)
static inline void
-seqcount_mutex_init(struct seqcount_mutex *seqcount, struct mutex *mutex)
+seqcount_mutex_init(struct seqcount_mutex *seqcount, void *mutex __unused)
{
- seqcount->seqm_lock = mutex;
- seqcount_init(&seqcount->seqm_count);
+ seqcount->seqc = 0;
}
#define write_seqcount_begin(s) \
_Generic(*(s), \
- struct seqcount: lkpi_write_seqcount_begin, \
- struct seqcount_mutex: lkpi_write_seqcount_mutex_begin \
- )(s)
-
-static inline void
-lkpi_write_seqcount_begin(struct seqcount *seqcount)
-{
- seqc_sleepable_write_begin(&seqcount->seqc);
-}
-
-static inline void
-lkpi_write_seqcount_mutex_begin(struct seqcount_mutex *seqcount)
-{
- mutex_lock(seqcount->seqm_lock);
- lkpi_write_seqcount_begin(&seqcount->seqm_count);
-}
+ struct seqcount: seqc_sleepable_write_begin, \
+ struct seqcount_mutex: seqc_write_begin \
+ )(&(s)->seqc)
#define write_seqcount_end(s) \
_Generic(*(s), \
- struct seqcount: lkpi_write_seqcount_end, \
- struct seqcount_mutex: lkpi_write_seqcount_mutex_end \
- )(s)
-
-static inline void
-lkpi_write_seqcount_end(struct seqcount *seqcount)
-{
- seqc_sleepable_write_end(&seqcount->seqc);
-}
+ struct seqcount: seqc_sleepable_write_end, \
+ struct seqcount_mutex: seqc_write_end \
+ )(&(s)->seqc)
-static inline void
-lkpi_write_seqcount_mutex_end(struct seqcount_mutex *seqcount)
-{
- lkpi_write_seqcount_end(&seqcount->seqm_count);
- mutex_unlock(seqcount->seqm_lock);
-}
-
-#define read_seqcount_begin(s) \
- _Generic(*(s), \
- struct seqcount: lkpi_read_seqcount_begin, \
- struct seqcount_mutex: lkpi_read_seqcount_mutex_begin \
- )(s)
-
-static inline unsigned
-lkpi_read_seqcount_begin(const struct seqcount *seqcount)
-{
- return (seqc_read(&seqcount->seqc));
-}
-
-static inline unsigned
-lkpi_read_seqcount_mutex_begin(const struct seqcount_mutex *seqcount)
-{
- return (lkpi_read_seqcount_begin(&seqcount->seqm_count));
-}
-
-static inline unsigned
-raw_read_seqcount(const struct seqcount *seqcount)
-{
- return (seqc_read_any(&seqcount->seqc));
-}
+#define read_seqcount_begin(s) seqc_read(&(s)->seqc)
+#define raw_read_seqcount(s) seqc_read_any(&(s)->seqc)
/*
* XXX: Are predicts from inline functions still not honored by clang?
*/
#define __read_seqcount_retry(seqcount, gen) \
(!seqc_consistent_no_fence(&(seqcount)->seqc, gen))
-#define read_seqcount_retry(s, old) \
- _Generic(*(s), \
- struct seqcount: lkpi_read_seqcount_retry, \
- struct seqcount_mutex: lkpi_read_seqcount_mutex_retry \
- )(s, old)
-
-static inline int
-lkpi_read_seqcount_retry(
- const struct seqcount *seqcount, unsigned int old)
-{
- return (!seqc_consistent(&seqcount->seqc, old));
-}
-
-static inline int
-lkpi_read_seqcount_mutex_retry(
- const struct seqcount_mutex *seqcount, unsigned int old)
-{
- return (!seqc_consistent(&seqcount->seqm_count.seqc, old));
-}
+#define read_seqcount_retry(seqcount, gen) \
+ (!seqc_consistent(&(seqcount)->seqc, gen))
static inline void
seqlock_init(struct seqlock *seqlock)