wait_queue_t|wait_queue_entry_t
DN_MAX_BONUSLEN||DN_BONUS_SIZE(dnodesize)
DN_OLD_MAX_BONUSLEN||DN_BONUS_SIZE(DNODE_MIN_SIZE)
+setup_timer||cfs_timer_setup
+timer_setup||cfs_timer_setup
+from_timer||cfs_from_timer
+DEFINE_TIMER||CFS_DEFINE_TIMER
#include <linux/hrtimer.h>
#include <linux/ktime.h>
],[
+ ktime_t now = ktime_set(0, 0);
struct timespec64 ts;
- ktime_t now = { };
ts = ktime_to_timespec64(now);
],[
]) # LIBCFS_NEW_KERNEL_WRITE
#
+# LIBCFS_TIMER_SETUP
+#
+# Kernel version 4.15 commit e99e88a9d2b067465adaa9c111ada99a041bef9a
+# setup_timer() was replaced by timer_setup(), where the callback
+# argument is the structure already holding the struct timer_list.
+#
+AC_DEFUN([LIBCFS_TIMER_SETUP], [
+LB_CHECK_COMPILE([if setup_timer has been replaced with timer_setup],
+timer_setup, [
+ #include <linux/timer.h>
+],[
+ timer_setup(NULL, NULL, 0);
+],[
+ AC_DEFINE(HAVE_TIMER_SETUP, 1,
+ [timer_setup has replaced setup_timer])
+])
+]) # LIBCFS_TIMER_SETUP
+
+#
# LIBCFS_PROG_LINUX
#
# LibCFS linux kernel checks
LIBCFS_WAIT_QUEUE_ENTRY
# 4.14
LIBCFS_NEW_KERNEL_WRITE
+# 4.15
+LIBCFS_TIMER_SETUP
]) # LIBCFS_PROG_LINUX
#
return nsecs_to_jiffies(seconds * NSEC_PER_SEC);
}
+#ifdef HAVE_TIMER_SETUP
+#define cfs_timer_cb_arg_t struct timer_list *
+#define cfs_from_timer(var, callback_timer, timer_fieldname) \
+ from_timer(var, callback_timer, timer_fieldname)
+#define cfs_timer_setup(timer, callback, data, flags) \
+ timer_setup((timer), (callback), (flags))
+#define CFS_DEFINE_TIMER(_name, _function, _expires, _data) \
+ DEFINE_TIMER((_name), (_function))
+#define cfs_timer_cb_arg(var, timer_fieldname) (&(var)->timer_fieldname)
+#else
+#define cfs_timer_cb_arg_t unsigned long
+#define cfs_from_timer(var, data, timer_fieldname) (typeof(var))(data)
+#define cfs_timer_setup(timer, callback, data, flags) \
+ setup_timer((timer), (callback), (data))
+#define CFS_DEFINE_TIMER(_name, _function, _expires, _data) \
+ DEFINE_TIMER((_name), (_function), (_expires), (_data))
+#define cfs_timer_cb_arg(var, timer_fieldname) (cfs_timer_cb_arg_t)(var)
+#endif
+
#endif /* __LIBCFS_LINUX_LINUX_TIME_H__ */
EXIT;
}
-static void lcw_cb(uintptr_t data)
+static void lcw_cb(cfs_timer_cb_arg_t data)
{
- struct lc_watchdog *lcw = (struct lc_watchdog *)data;
+ struct lc_watchdog *lcw = cfs_from_timer(lcw, data, lcw_timer);
ENTRY;
if (lcw->lcw_state != LC_WATCHDOG_ENABLED) {
lcw->lcw_state = LC_WATCHDOG_DISABLED;
INIT_LIST_HEAD(&lcw->lcw_list);
- setup_timer(&lcw->lcw_timer, lcw_cb, (unsigned long)lcw);
+ cfs_timer_setup(&lcw->lcw_timer, lcw_cb, (unsigned long)lcw, 0);
mutex_lock(&lcw_refcount_mutex);
if (++lcw_refcount == 1)
}
static void
-delay_timer_cb(unsigned long arg)
+delay_timer_cb(cfs_timer_cb_arg_t data)
{
- struct lnet_delay_rule *rule = (struct lnet_delay_rule *)arg;
+ struct lnet_delay_rule *rule = cfs_from_timer(rule, data, dl_timer);
spin_lock_bh(&delay_dd.dd_lock);
if (list_empty(&rule->dl_sched_link) && delay_dd.dd_running) {
wait_event(delay_dd.dd_ctl_waitq, delay_dd.dd_running);
}
- init_timer(&rule->dl_timer);
- rule->dl_timer.function = delay_timer_cb;
- rule->dl_timer.data = (unsigned long)rule;
+ cfs_timer_setup(&rule->dl_timer, delay_timer_cb,
+ (unsigned long)rule, 0);
spin_lock_init(&rule->dl_lock);
INIT_LIST_HEAD(&rule->dl_msg_list);
}
EXPORT_SYMBOL(target_recovery_fini);
-static void target_recovery_expired(unsigned long castmeharder)
+static void target_recovery_expired(cfs_timer_cb_arg_t data)
{
- struct obd_device *obd = (struct obd_device *)castmeharder;
+ struct obd_device *obd = cfs_from_timer(obd, data, obd_recovery_timer);
CDEBUG(D_HA, "%s: recovery timed out; %d clients are still in recovery"
" after %llus (%d clients connected)\n",
obd->obd_name, atomic_read(&obd->obd_lock_replay_clients),
obd->obd_recovery_start = 0;
obd->obd_recovery_end = 0;
- setup_timer(&obd->obd_recovery_timer, target_recovery_expired,
- (unsigned long)obd);
+ cfs_timer_setup(&obd->obd_recovery_timer, target_recovery_expired,
+ (unsigned long)obd, 0);
target_start_recovery_thread(lut, handler);
}
EXPORT_SYMBOL(target_recovery_init);
* All access to it should be under waiting_locks_spinlock.
*/
static LIST_HEAD(waiting_locks_list);
-static void waiting_locks_callback(unsigned long unused);
-static DEFINE_TIMER(waiting_locks_timer, waiting_locks_callback, 0, 0);
+static void waiting_locks_callback(cfs_timer_cb_arg_t unused);
+static CFS_DEFINE_TIMER(waiting_locks_timer, waiting_locks_callback, 0, 0);
enum elt_state {
ELT_STOPPED,
}
/* This is called from within a timer interrupt and cannot schedule */
-static void waiting_locks_callback(unsigned long unused)
+static void waiting_locks_callback(cfs_timer_cb_arg_t unused)
{
struct ldlm_lock *lock;
int need_dump = 0;
/* XXX belongs in setup not attach */
init_rwsem(&newdev->obd_observer_link_sem);
/* recovery data */
- init_timer(&newdev->obd_recovery_timer);
spin_lock_init(&newdev->obd_recovery_task_lock);
init_waitqueue_head(&newdev->obd_next_transno_waitq);
init_waitqueue_head(&newdev->obd_evict_inprogress_waitq);
return !!(d->opd_pre_thread.t_flags & SVC_STOPPED);
}
-static void osp_statfs_timer_cb(unsigned long _d)
+static void osp_statfs_timer_cb(cfs_timer_cb_arg_t data)
{
- struct osp_device *d = (struct osp_device *) _d;
+ struct osp_device *d = cfs_from_timer(d, data, opd_statfs_timer);
LASSERT(d);
if (d->opd_pre != NULL && osp_precreate_running(d))
CDEBUG(D_OTHER, "current %lldns, fresh till %lldns\n",
ktime_get_ns(),
ktime_to_ns(d->opd_statfs_fresh_till));
- setup_timer(&d->opd_statfs_timer, osp_statfs_timer_cb,
- (unsigned long)d);
+ cfs_timer_setup(&d->opd_statfs_timer, osp_statfs_timer_cb,
+ (unsigned long)d, 0);
if (d->opd_storage->dd_rdonly)
RETURN(0);
return -1;
}
-static void ptlrpc_at_timer(unsigned long castmeharder)
+static void ptlrpc_at_timer(cfs_timer_cb_arg_t data)
{
struct ptlrpc_service_part *svcpt;
- svcpt = (struct ptlrpc_service_part *)castmeharder;
+ svcpt = cfs_from_timer(svcpt, data, scp_at_timer);
svcpt->scp_at_check = 1;
svcpt->scp_at_checktime = ktime_get();
if (array->paa_reqs_count == NULL)
goto failed;
- setup_timer(&svcpt->scp_at_timer, ptlrpc_at_timer,
- (unsigned long)svcpt);
+ cfs_timer_setup(&svcpt->scp_at_timer, ptlrpc_at_timer,
+ (unsigned long)svcpt, 0);
/* At SOW, service time should be quick; 10s seems generous. If client
* timeout is less than this, we'll be sending an early reply. */
next = array->paa_deadline - ktime_get_real_seconds() -
at_early_margin;
if (next <= 0) {
- ptlrpc_at_timer((unsigned long)svcpt);
+ ptlrpc_at_timer(cfs_timer_cb_arg(svcpt, scp_at_timer));
} else {
mod_timer(&svcpt->scp_at_timer,
jiffies + nsecs_to_jiffies(next * NSEC_PER_SEC));