Index: sys/compat/linuxkpi/common/include/linux/kref.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/kref.h +++ sys/compat/linuxkpi/common/include/linux/kref.h @@ -38,6 +38,7 @@ #include #include #include +#include #include @@ -77,6 +78,20 @@ return 0; } +static inline int +kref_put_lock(struct kref *kref, void (*rel)(struct kref *kref), + spinlock_t *lock) +{ + + if (refcount_release(&kref->refcount.counter)) { + spin_lock(lock); + rel(kref); + return (1); + } + return (0); +} + + static inline int kref_sub(struct kref *kref, unsigned int count, void (*rel)(struct kref *kref)) Index: sys/compat/linuxkpi/common/include/linux/wait.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/wait.h +++ sys/compat/linuxkpi/common/include/linux/wait.h @@ -36,6 +36,7 @@ #include #include #include +#include #include @@ -286,15 +287,36 @@ void linux_wake_up_bit(void *, int); int linux_wait_on_bit_timeout(unsigned long *, int, unsigned int, int); +wait_queue_head_t *linux_bit_waitqueue(void *, int); void linux_wake_up_atomic_t(atomic_t *); int linux_wait_on_atomic_t(atomic_t *, unsigned int); +static inline void wake_up_var(void *var) +{ + +} + +static inline int wait_var_event_killable(void *var, int cond) +{ + return (0); +} + #define wake_up_bit(word, bit) linux_wake_up_bit(word, bit) #define wait_on_bit(word, bit, state) \ linux_wait_on_bit_timeout(word, bit, state, MAX_SCHEDULE_TIMEOUT) #define wait_on_bit_timeout(word, bit, state, timeout) \ linux_wait_on_bit_timeout(word, bit, state, timeout) +#define bit_waitqueue(word, bit) linux_bit_waitqueue(word, bit) #define wake_up_atomic_t(a) linux_wake_up_atomic_t(a) + +static inline void +clear_and_wake_up_bit(int bit, void *word) +{ + clear_bit_unlock(bit, word); + wmb(); + wake_up_bit(word, bit); +} + /* * All existing callers have a cb that just schedule()s. To avoid adding * complexity, just emulate that internally. The prototype is different so that Index: sys/compat/linuxkpi/common/src/linux_schedule.c =================================================================== --- sys/compat/linuxkpi/common/src/linux_schedule.c +++ sys/compat/linuxkpi/common/src/linux_schedule.c @@ -357,6 +357,12 @@ wake_up_sleepers(bit_to_wchan(word, bit)); } +wait_queue_head_t * +linux_bit_waitqueue(void *word, int bit) +{ + return (bit_to_wchan(word, bit)); +} + int linux_wait_on_bit_timeout(unsigned long *word, int bit, unsigned int state, int timeout)