Index: sys/compat/linuxkpi/common/include/linux/device.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/device.h +++ sys/compat/linuxkpi/common/include/linux/device.h @@ -183,6 +183,14 @@ #define dev_printk(lvl, dev, fmt, ...) \ device_printf((dev)->bsddev, fmt, ##__VA_ARGS__) +#define dev_err_once(dev, ...) do { \ + static bool __dev_err_once; \ + if (!__dev_err_once) { \ + __dev_err_once = 1; \ + dev_err(dev, __VA_ARGS__); \ + } \ +} while (0) + #define dev_err_ratelimited(dev, ...) do { \ static linux_ratelimit_t __ratelimited; \ if (linux_ratelimited(&__ratelimited)) \ Index: sys/compat/linuxkpi/common/include/linux/fs.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/fs.h +++ sys/compat/linuxkpi/common/include/linux/fs.h @@ -319,4 +319,13 @@ #define shmem_truncate_range(...) \ linux_shmem_truncate_range(__VA_ARGS__) +static inline int +simple_open(struct inode *inode, struct file *file) +{ + // BSDFIXME: Is it OK to do same as Linux here?? + if (inode->i_private) + file->private_data = inode->i_private; + return 0; +} + #endif /* _LINUX_FS_H_ */ Index: sys/compat/linuxkpi/common/include/linux/hardirq.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/hardirq.h +++ sys/compat/linuxkpi/common/include/linux/hardirq.h @@ -37,6 +37,7 @@ #include #include -#define synchronize_irq(irq) _intr_drain((irq)) +#define synchronize_irq(irq) _intr_drain((irq)) +#define synchronize_hardirq(irq) _intr_drain((irq)) #endif /* _LINUX_HARDIRQ_H_ */ Index: sys/compat/linuxkpi/common/include/linux/kernel.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/kernel.h +++ sys/compat/linuxkpi/common/include/linux/kernel.h @@ -130,9 +130,11 @@ #define ALIGN(x, y) roundup2((x), (y)) #undef PTR_ALIGN #define PTR_ALIGN(p, a) ((__typeof(p))ALIGN((uintptr_t)(p), (a))) +#define IS_ALIGNED(x, a) (((x) & ((__typeof(x))(a) - 1)) == 0) #define DIV_ROUND_UP(x, n) howmany(x, n) #define __KERNEL_DIV_ROUND_UP(x, n) howmany(x, n) #define DIV_ROUND_UP_ULL(x, n) DIV_ROUND_UP((unsigned long long)(x), (n)) +#define DIV_ROUND_DOWN_ULL(x, n) (((unsigned long long)(x) / (n)) * (n)) #define FIELD_SIZEOF(t, f) sizeof(((t *)0)->f) #define printk(...) printf(__VA_ARGS__) Index: sys/compat/linuxkpi/common/include/linux/ktime.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/ktime.h +++ sys/compat/linuxkpi/common/include/linux/ktime.h @@ -35,7 +35,8 @@ #include #include -#define ktime_get_ts(x) getnanouptime(x) +#define ktime_get_ts(x) getnanotime(x) +#define ktime_get_raw_ts(x) getnanotime(x) /* time values in nanoseconds */ typedef s64 ktime_t; @@ -172,11 +173,19 @@ return (ktime_set(tv.tv_sec, tv.tv_usec * NSEC_PER_USEC)); } +static inline int64_t +timespec64_to_ns(struct timespec64 *ts) +{ + return ((int64_t) ts->tv_sec * NSEC_PER_SEC) + ts->tv_nsec; +} + #define ktime_to_timespec(kt) ns_to_timespec(kt) #define ktime_to_timespec64(kt) ns_to_timespec(kt) #define ktime_to_timeval(kt) ns_to_timeval(kt) #define ktime_to_ns(kt) (kt) #define ktime_get_ts64(ts) ktime_get_ts(ts) +#define ktime_get_raw_ts64(ts) ktime_get_raw_ts(ts) +#define getrawmonotonic64(ts) ktime_get_raw_ts64(ts) static inline int64_t ktime_get_ns(void) @@ -238,7 +247,7 @@ { struct timespec ts; - nanouptime(&ts); + nanotime(&ts); return (ktime_to_ns(timespec_to_ktime(ts))); } Index: sys/compat/linuxkpi/common/include/linux/random.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/random.h +++ sys/compat/linuxkpi/common/include/linux/random.h @@ -43,6 +43,15 @@ arc4rand(buf, nbytes, 0); } +static inline uint32_t +get_random_u32(void) +{ + uint32_t val; + + get_random_bytes(&val, sizeof(val)); + return (val); +} + static inline u_int get_random_int(void) { Index: sys/compat/linuxkpi/common/include/linux/sched.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/sched.h +++ sys/compat/linuxkpi/common/include/linux/sched.h @@ -178,4 +178,12 @@ return ((uint64_t)ts.tv_sec * NSEC_PER_SEC + ts.tv_nsec); } +static inline const char * +get_task_comm(char *buf, struct task_struct *task) +{ + + buf[0] = 0; /* buffer is too small */ + return (task->comm); +} + #endif /* _LINUX_SCHED_H_ */ Index: sys/compat/linuxkpi/common/include/linux/slab.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/slab.h +++ sys/compat/linuxkpi/common/include/linux/slab.h @@ -43,6 +43,8 @@ MALLOC_DECLARE(M_KMALLOC); #define kvmalloc(size) kmalloc(size, 0) +#define kvzalloc(size, flags) kmalloc(size, (flags) | __GFP_ZERO) +#define kvcalloc(n, size, flags) kvmalloc_array(n, size, (flags) | __GFP_ZERO) #define kzalloc(size, flags) kmalloc(size, (flags) | __GFP_ZERO) #define kzalloc_node(size, flags, node) kmalloc(size, (flags) | __GFP_ZERO) #define kfree_const(ptr) kfree(ptr) Index: sys/compat/linuxkpi/common/include/linux/srcu.h =================================================================== --- sys/compat/linuxkpi/common/include/linux/srcu.h +++ sys/compat/linuxkpi/common/include/linux/srcu.h @@ -34,6 +34,9 @@ #define srcu_dereference(ptr,srcu) ((__typeof(*(ptr)) *)(ptr)) +#define DEFINE_STATIC_SRCU(name) \ + static struct srcu_struct name = {}; + /* prototypes */ extern int srcu_read_lock(struct srcu_struct *);