The branch main has been updated by wulf:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=68f08e26e2797707c76f8c6423baa41b25dd9df4

commit 68f08e26e2797707c76f8c6423baa41b25dd9df4
Author:     Vladimir Kondratyev <w...@freebsd.org>
AuthorDate: 2022-12-24 09:01:20 +0000
Commit:     Vladimir Kondratyev <w...@freebsd.org>
CommitDate: 2022-12-24 09:01:20 +0000

    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
---
 sys/compat/linuxkpi/common/include/linux/seqlock.h | 94 +++-------------------
 1 file 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)

Reply via email to