From 944117514d2aba081b15faad741e7d0c6b1465c8 Mon Sep 17 00:00:00 2001 From: Brian Behlendorf Date: Sun, 23 Jul 2017 19:32:14 -0700 Subject: [PATCH] Linux 4.13 compat: wait queues Commit torvalds/linux@ac6424b9 - Renamed struct wait_queue -> struct wait_queue_entry. Commit torvalds/linux@2055da97 - Renamed wait_queue_head::task_list -> wait_queue_head::head - Renamed wait_queue_entry::task_list -> wait_queue_entry::entry Reviewed-by: Chunwei Chen Signed-off-by: Brian Behlendorf Closes #629 --- config/spl-build.m4 | 55 +++++++++++++++++++++++++++++++++++++ include/linux/wait_compat.h | 9 ++++++ include/sys/condvar.h | 6 ++-- include/sys/kmem_cache.h | 2 +- include/sys/taskq.h | 7 +++-- module/spl/spl-proc.c | 14 ++++++++-- module/splat/splat-atomic.c | 3 +- module/splat/splat-kmem.c | 4 +-- module/splat/splat-rwlock.c | 2 +- module/splat/splat-thread.c | 3 +- 10 files changed, 91 insertions(+), 14 deletions(-) diff --git a/config/spl-build.m4 b/config/spl-build.m4 index 698d51a87f..630d67c2d5 100644 --- a/config/spl-build.m4 +++ b/config/spl-build.m4 @@ -53,6 +53,8 @@ AC_DEFUN([SPL_AC_CONFIG_KERNEL], [ SPL_AC_INODE_LOCK SPL_AC_GROUP_INFO_GID SPL_AC_KMEM_CACHE_CREATE_USERCOPY + SPL_AC_WAIT_QUEUE_ENTRY_T + SPL_AC_WAIT_QUEUE_HEAD_ENTRY ]) AC_DEFUN([SPL_AC_MODULE_SYMVERS], [ @@ -1670,3 +1672,56 @@ AC_DEFUN([SPL_AC_KMEM_CACHE_CREATE_USERCOPY], [ ]) EXTRA_KCFLAGS="$tmp_flags" ]) + +dnl # +dnl # 4.13 API change +dnl # Renamed struct wait_queue -> struct wait_queue_entry. +dnl # +AC_DEFUN([SPL_AC_WAIT_QUEUE_ENTRY_T], [ + AC_MSG_CHECKING([whether wait_queue_entry_t exists]) + SPL_LINUX_TRY_COMPILE([ + #include + ],[ + wait_queue_entry_t *entry __attribute__ ((unused)); + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_WAIT_QUEUE_ENTRY_T, 1, + [wait_queue_entry_t exists]) + ],[ + AC_MSG_RESULT(no) + ]) +]) + +dnl # +dnl # 4.13 API change +dnl # Renamed wait_queue_head::task_list -> wait_queue_head::head +dnl # Renamed wait_queue_entry::task_list -> wait_queue_entry::entry +dnl # +AC_DEFUN([SPL_AC_WAIT_QUEUE_HEAD_ENTRY], [ + AC_MSG_CHECKING([whether wq_head->head and wq_entry->entry exist]) + SPL_LINUX_TRY_COMPILE([ + #include + + #ifdef HAVE_WAIT_QUEUE_ENTRY_T + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_entry_t spl_wait_queue_entry_t; + #else + typedef wait_queue_head_t spl_wait_queue_head_t; + typedef wait_queue_t spl_wait_queue_entry_t; + #endif + ],[ + spl_wait_queue_head_t wq_head; + spl_wait_queue_entry_t wq_entry; + struct list_head *head __attribute__ ((unused)); + struct list_head *entry __attribute__ ((unused)); + + head = &wq_head.head; + entry = &wq_entry.entry; + ],[ + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_WAIT_QUEUE_HEAD_ENTRY, 1, + [wq_head->head and wq_entry->entry exist]) + ],[ + AC_MSG_RESULT(no) + ]) +]) diff --git a/include/linux/wait_compat.h b/include/linux/wait_compat.h index d8cd09b9eb..445a73c68f 100644 --- a/include/linux/wait_compat.h +++ b/include/linux/wait_compat.h @@ -26,6 +26,7 @@ #define _SPL_WAIT_COMPAT_H #include +#include #ifndef HAVE_WAIT_ON_BIT_ACTION # define spl_wait_on_bit(word, bit, mode) wait_on_bit(word, bit, mode) @@ -43,4 +44,12 @@ spl_bit_wait(void *word) #endif /* HAVE_WAIT_ON_BIT_ACTION */ +#ifdef HAVE_WAIT_QUEUE_ENTRY_T +typedef wait_queue_head_t spl_wait_queue_head_t; +typedef wait_queue_entry_t spl_wait_queue_entry_t; +#else +typedef wait_queue_head_t spl_wait_queue_head_t; +typedef wait_queue_t spl_wait_queue_entry_t; +#endif + #endif /* SPL_WAIT_COMPAT_H */ diff --git a/include/sys/condvar.h b/include/sys/condvar.h index 9b55449ae5..5479e75ad6 100644 --- a/include/sys/condvar.h +++ b/include/sys/condvar.h @@ -26,7 +26,7 @@ #define _SPL_CONDVAR_H #include -#include +#include #include #include #include @@ -41,8 +41,8 @@ typedef struct { int cv_magic; - wait_queue_head_t cv_event; - wait_queue_head_t cv_destroy; + spl_wait_queue_head_t cv_event; + spl_wait_queue_head_t cv_destroy; atomic_t cv_refs; atomic_t cv_waiters; kmutex_t *cv_mutex; diff --git a/include/sys/kmem_cache.h b/include/sys/kmem_cache.h index e971c2b0d9..8fa14f67e7 100644 --- a/include/sys/kmem_cache.h +++ b/include/sys/kmem_cache.h @@ -193,7 +193,7 @@ typedef struct spl_kmem_cache { struct list_head skc_partial_list; /* Partially alloc'ed */ struct rb_root skc_emergency_tree; /* Min sized objects */ spinlock_t skc_lock; /* Cache lock */ - wait_queue_head_t skc_waitq; /* Allocation waiters */ + spl_wait_queue_head_t skc_waitq; /* Allocation waiters */ uint64_t skc_slab_fail; /* Slab alloc failures */ uint64_t skc_slab_create; /* Slab creates */ uint64_t skc_slab_destroy; /* Slab destroys */ diff --git a/include/sys/taskq.h b/include/sys/taskq.h index 5adda88272..c5ccec715b 100644 --- a/include/sys/taskq.h +++ b/include/sys/taskq.h @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -96,14 +97,14 @@ typedef struct taskq { struct list_head tq_prio_list; /* priority pending taskq_ent_t's */ struct list_head tq_delay_list; /* delayed taskq_ent_t's */ struct list_head tq_taskqs; /* all taskq_t's */ - wait_queue_head_t tq_work_waitq; /* new work waitq */ - wait_queue_head_t tq_wait_waitq; /* wait waitq */ + spl_wait_queue_head_t tq_work_waitq; /* new work waitq */ + spl_wait_queue_head_t tq_wait_waitq; /* wait waitq */ tq_lock_role_t tq_lock_class; /* class when taking tq_lock */ } taskq_t; typedef struct taskq_ent { spinlock_t tqent_lock; - wait_queue_head_t tqent_waitq; + spl_wait_queue_head_t tqent_waitq; struct timer_list tqent_timer; struct list_head tqent_list; taskqid_t tqent_id; diff --git a/module/spl/spl-proc.c b/module/spl/spl-proc.c index bffbcc6075..05c1a5dbc2 100644 --- a/module/spl/spl-proc.c +++ b/module/spl/spl-proc.c @@ -244,7 +244,7 @@ taskq_seq_show_impl(struct seq_file *f, void *p, boolean_t allflag) { taskq_t *tq = p; taskq_thread_t *tqt; - wait_queue_t *wq; + spl_wait_queue_entry_t *wq; struct task_struct *tsk; taskq_ent_t *tqe; char name[100]; @@ -261,7 +261,11 @@ taskq_seq_show_impl(struct seq_file *f, void *p, boolean_t allflag) lheads[LHEAD_PEND] = &tq->tq_pend_list; lheads[LHEAD_PRIO] = &tq->tq_prio_list; lheads[LHEAD_DELAY] = &tq->tq_delay_list; +#ifdef HAVE_WAIT_QUEUE_HEAD_ENTRY + lheads[LHEAD_WAIT] = &tq->tq_wait_waitq.head; +#else lheads[LHEAD_WAIT] = &tq->tq_wait_waitq.task_list; +#endif lheads[LHEAD_ACTIVE] = &tq->tq_active_list; for (i = 0; i < LHEAD_SIZE; ++i) { @@ -320,7 +324,13 @@ taskq_seq_show_impl(struct seq_file *f, void *p, boolean_t allflag) } /* show the wait waitq list */ if (i == LHEAD_WAIT) { - wq = list_entry(lh, wait_queue_t, task_list); +#ifdef HAVE_WAIT_QUEUE_HEAD_ENTRY + wq = list_entry(lh, + spl_wait_queue_entry_t, entry); +#else + wq = list_entry(lh, + spl_wait_queue_entry_t, task_list); +#endif if (j == 0) seq_printf(f, "\t%s:", list_names[i]); diff --git a/module/splat/splat-atomic.c b/module/splat/splat-atomic.c index f6ed80fb82..b8759e01f2 100644 --- a/module/splat/splat-atomic.c +++ b/module/splat/splat-atomic.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "splat-internal.h" @@ -55,7 +56,7 @@ typedef struct atomic_priv { unsigned long ap_magic; struct file *ap_file; kmutex_t ap_lock; - wait_queue_head_t ap_waitq; + spl_wait_queue_head_t ap_waitq; volatile uint64_t ap_atomic; volatile uint64_t ap_atomic_exited; atomic_op_t ap_op; diff --git a/module/splat/splat-kmem.c b/module/splat/splat-kmem.c index 8946b06713..d0649ad9a0 100644 --- a/module/splat/splat-kmem.c +++ b/module/splat/splat-kmem.c @@ -275,8 +275,8 @@ typedef struct kmem_cache_priv { struct file *kcp_file; kmem_cache_t *kcp_cache; spinlock_t kcp_lock; - wait_queue_head_t kcp_ctl_waitq; - wait_queue_head_t kcp_thr_waitq; + spl_wait_queue_head_t kcp_ctl_waitq; + spl_wait_queue_head_t kcp_thr_waitq; int kcp_flags; int kcp_kct_count; kmem_cache_thread_t *kcp_kct[SPLAT_KMEM_THREADS]; diff --git a/module/splat/splat-rwlock.c b/module/splat/splat-rwlock.c index d7626b2364..5d3ffb1951 100644 --- a/module/splat/splat-rwlock.c +++ b/module/splat/splat-rwlock.c @@ -76,7 +76,7 @@ typedef struct rw_priv { struct file *rw_file; krwlock_t rw_rwlock; spinlock_t rw_lock; - wait_queue_head_t rw_waitq; + spl_wait_queue_head_t rw_waitq; int rw_completed; int rw_holders; int rw_waiters; diff --git a/module/splat/splat-thread.c b/module/splat/splat-thread.c index a043fc74f8..e99d691013 100644 --- a/module/splat/splat-thread.c +++ b/module/splat/splat-thread.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include "splat-internal.h" @@ -54,7 +55,7 @@ typedef struct thread_priv { unsigned long tp_magic; struct file *tp_file; spinlock_t tp_lock; - wait_queue_head_t tp_waitq; + spl_wait_queue_head_t tp_waitq; uint_t tp_keys[SPLAT_THREAD_TEST_KEYS]; int tp_rc; int tp_count;