*
* You should have received a copy of the GNU General Public License
* version 2 along with this program; If not, see
- * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
+ * http://www.gnu.org/licenses/gpl-2.0.html
*
* GPL HEADER END
*/
* Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
*
- * Copyright (c) 2011, 2012, Intel Corporation.
+ * Copyright (c) 2011, 2013, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
/*
- * Timers are implemented as a sorted queue of expiry times. The queue
- * is slotted, with each slot holding timers which expire in a
- * 2**STTIMER_MINPOLL (8) second period. The timers in each slot are
+ * Timers are implemented as a sorted queue of expiry times. The queue
+ * is slotted, with each slot holding timers which expire in a
+ * 2**STTIMER_MINPOLL (8) second period. The timers in each slot are
* sorted by increasing expiry time. The number of slots is 2**7 (128),
* to cover a time period of 1024 seconds into the future before wrapping.
*/
#define STTIMER_SLOT(t) (&stt_data.stt_hash[(((t) >> STTIMER_MINPOLL) & \
(STTIMER_NSLOTS - 1))])
-struct st_timer_data {
+static struct st_timer_data {
spinlock_t stt_lock;
/* start time of the slot processed previously */
- cfs_time_t stt_prev_slot;
- cfs_list_t stt_hash[STTIMER_NSLOTS];
+ time64_t stt_prev_slot;
+ struct list_head stt_hash[STTIMER_NSLOTS];
int stt_shuttingdown;
-#ifdef __KERNEL__
wait_queue_head_t stt_waitq;
int stt_nthreads;
-#endif
} stt_data;
void
-stt_add_timer(stt_timer_t *timer)
+stt_add_timer(struct stt_timer *timer)
{
- cfs_list_t *pos;
+ struct list_head *pos;
spin_lock(&stt_data.stt_lock);
-#ifdef __KERNEL__
- LASSERT (stt_data.stt_nthreads > 0);
-#endif
- LASSERT (!stt_data.stt_shuttingdown);
- LASSERT (timer->stt_func != NULL);
- LASSERT (cfs_list_empty(&timer->stt_list));
- LASSERT (cfs_time_after(timer->stt_expires, cfs_time_current_sec()));
+ LASSERT(stt_data.stt_nthreads > 0);
+ LASSERT(!stt_data.stt_shuttingdown);
+ LASSERT(timer->stt_func != NULL);
+ LASSERT(list_empty(&timer->stt_list));
+ LASSERT(timer->stt_expires > ktime_get_real_seconds());
- /* a simple insertion sort */
- cfs_list_for_each_prev (pos, STTIMER_SLOT(timer->stt_expires)) {
- stt_timer_t *old = cfs_list_entry(pos, stt_timer_t, stt_list);
+ /* a simple insertion sort */
+ list_for_each_prev(pos, STTIMER_SLOT(timer->stt_expires)) {
+ struct stt_timer *old = list_entry(pos, struct stt_timer,
+ stt_list);
- if (cfs_time_aftereq(timer->stt_expires, old->stt_expires))
- break;
- }
- cfs_list_add(&timer->stt_list, pos);
+ if (timer->stt_expires >= old->stt_expires)
+ break;
+ }
+ list_add(&timer->stt_list, pos);
spin_unlock(&stt_data.stt_lock);
}
* another CPU.
*/
int
-stt_del_timer (stt_timer_t *timer)
+stt_del_timer(struct stt_timer *timer)
{
int ret = 0;
spin_lock(&stt_data.stt_lock);
-#ifdef __KERNEL__
- LASSERT (stt_data.stt_nthreads > 0);
-#endif
- LASSERT (!stt_data.stt_shuttingdown);
+ LASSERT(stt_data.stt_nthreads > 0);
+ LASSERT(!stt_data.stt_shuttingdown);
- if (!cfs_list_empty(&timer->stt_list)) {
- ret = 1;
- cfs_list_del_init(&timer->stt_list);
- }
+ if (!list_empty(&timer->stt_list)) {
+ ret = 1;
+ list_del_init(&timer->stt_list);
+ }
spin_unlock(&stt_data.stt_lock);
return ret;
}
/* called with stt_data.stt_lock held */
-int
-stt_expire_list (cfs_list_t *slot, cfs_time_t now)
+static int
+stt_expire_list(struct list_head *slot, time64_t now)
{
- int expired = 0;
- stt_timer_t *timer;
+ int expired = 0;
+ struct stt_timer *timer;
- while (!cfs_list_empty(slot)) {
- timer = cfs_list_entry(slot->next, stt_timer_t, stt_list);
+ while (!list_empty(slot)) {
+ timer = list_entry(slot->next, struct stt_timer, stt_list);
- if (cfs_time_after(timer->stt_expires, now))
- break;
+ if (timer->stt_expires > now)
+ break;
- cfs_list_del_init(&timer->stt_list);
+ list_del_init(&timer->stt_list);
spin_unlock(&stt_data.stt_lock);
expired++;
return expired;
}
-int
-stt_check_timers (cfs_time_t *last)
+static int
+stt_check_timers(time64_t *last)
{
- int expired = 0;
- cfs_time_t now;
- cfs_time_t this_slot;
+ int expired = 0;
+ time64_t now;
+ time64_t this_slot;
- now = cfs_time_current_sec();
- this_slot = now & STTIMER_SLOTTIMEMASK;
+ now = ktime_get_real_seconds();
+ this_slot = now & STTIMER_SLOTTIMEMASK;
spin_lock(&stt_data.stt_lock);
- while (cfs_time_aftereq(this_slot, *last)) {
+ while (this_slot >= *last) {
expired += stt_expire_list(STTIMER_SLOT(this_slot), now);
- this_slot = cfs_time_sub(this_slot, STTIMER_SLOTTIME);
+ this_slot = this_slot - STTIMER_SLOTTIME;
}
*last = now & STTIMER_SLOTTIMEMASK;
return expired;
}
-#ifdef __KERNEL__
-int
+static int
stt_timer_main (void *arg)
{
int rc = 0;
- cfs_block_allsigs();
-
while (!stt_data.stt_shuttingdown) {
stt_check_timers(&stt_data.stt_prev_slot);
return rc;
}
-int
+static int
stt_start_timer_thread (void)
{
struct task_struct *task;
return 0;
}
-#else /* !__KERNEL__ */
-
-int
-stt_check_events (void)
-{
- return stt_check_timers(&stt_data.stt_prev_slot);
-}
-
-int
-stt_poll_interval (void)
-{
- return STTIMER_SLOTTIME;
-}
-
-#endif
int
stt_startup (void)
int i;
stt_data.stt_shuttingdown = 0;
- stt_data.stt_prev_slot = cfs_time_current_sec() & STTIMER_SLOTTIMEMASK;
+ stt_data.stt_prev_slot = ktime_get_real_seconds() & STTIMER_SLOTTIMEMASK;
spin_lock_init(&stt_data.stt_lock);
for (i = 0; i < STTIMER_NSLOTS; i++)
- CFS_INIT_LIST_HEAD(&stt_data.stt_hash[i]);
+ INIT_LIST_HEAD(&stt_data.stt_hash[i]);
-#ifdef __KERNEL__
stt_data.stt_nthreads = 0;
init_waitqueue_head(&stt_data.stt_waitq);
rc = stt_start_timer_thread();
if (rc != 0)
CERROR ("Can't spawn timer thread: %d\n", rc);
-#endif
return rc;
}
void
-stt_shutdown (void)
+stt_shutdown(void)
{
- int i;
+ int i;
spin_lock(&stt_data.stt_lock);
- for (i = 0; i < STTIMER_NSLOTS; i++)
- LASSERT (cfs_list_empty(&stt_data.stt_hash[i]));
+ for (i = 0; i < STTIMER_NSLOTS; i++)
+ LASSERT(list_empty(&stt_data.stt_hash[i]));
- stt_data.stt_shuttingdown = 1;
+ stt_data.stt_shuttingdown = 1;
-#ifdef __KERNEL__
wake_up(&stt_data.stt_waitq);
lst_wait_until(stt_data.stt_nthreads == 0, stt_data.stt_lock,
"waiting for %d threads to terminate\n",
stt_data.stt_nthreads);
-#endif
spin_unlock(&stt_data.stt_lock);
}