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
This commit is contained in:
parent
0661cf74e6
commit
68f08e26e2
@ -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)
|
||||
struct seqcount: seqc_sleepable_write_end, \
|
||||
struct seqcount_mutex: seqc_write_end \
|
||||
)(&(s)->seqc)
|
||||
|
||||
static inline void
|
||||
lkpi_write_seqcount_end(struct seqcount *seqcount)
|
||||
{
|
||||
seqc_sleepable_write_end(&seqcount->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)
|
||||
|
Loading…
Reference in New Issue
Block a user