diff options
author | Vladimir Kondratyev <wulf@FreeBSD.org> | 2022-12-24 09:01:20 +0000 |
---|---|---|
committer | Vladimir Kondratyev <wulf@FreeBSD.org> | 2022-12-24 09:01:20 +0000 |
commit | 68f08e26e2797707c76f8c6423baa41b25dd9df4 (patch) | |
tree | e8f77718499d9f020737bf3070b0861a1c77e119 | |
parent | 0661cf74e6e5dbd585c4a5a3e621d915bb6787d3 (diff) | |
download | src-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.h | 94 |
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) |