#include <linux/dtrace_os.h>
#include <linux/hrtimer.h>
#include <linux/module.h>
+#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <asm/stacktrace.h>
cyclic_t *nxt;
};
-static cyclic_t *cyc_arr = NULL;
-static cyclic_t *cyc_flst = NULL;
-static unsigned long cyc_size = 0;
-
-#define CHUNKSIZE 12
-
-DEFINE_MUTEX(cyclic_lock);
-
-/*
- * Find a free cyclic slot. Returns NULL in out-of-memory conditions.
- */
-static cyclic_t *cyc_alloc(void)
-{
- cyclic_t *np;
-
- mutex_lock(&cyclic_lock);
-
- if (cyc_flst == NULL) {
- unsigned long nsize = cyc_size + CHUNKSIZE;
- unsigned long idx = nsize;
- cyclic_t *narr;
-
- if (!(narr = (cyclic_t *)vmalloc(nsize * sizeof(cyclic_t)))) {
- mutex_unlock(&cyclic_lock);
- return NULL;
- }
-
- memcpy(narr, cyc_arr, cyc_size * sizeof(cyclic_t));
- vfree(cyc_arr);
- cyc_arr = narr;
-
- idx = nsize;
- cyc_flst = &cyc_arr[cyc_size];
- cyc_arr[--idx].nxt = NULL;
- while (idx-- > cyc_size)
- cyc_arr[idx].nxt = &cyc_arr[idx + 1];
-
- cyc_size = nsize;
- }
-
- np = cyc_flst;
- cyc_flst = cyc_flst->nxt;
-
- mutex_unlock(&cyclic_lock);
-
- np->cyc.hdlr.cyh_func = NULL;
- return np;
-}
-
static enum hrtimer_restart cyclic_fire_fn(struct hrtimer *timr)
{
cyclic_t *cyc = container_of(timr, cyclic_t, cyc.timr);
if (hdlr == NULL || when == NULL)
return CYCLIC_NONE;
- if ((cyc = cyc_alloc()) == NULL)
+ if ((cyc = kmalloc(sizeof(cyclic_t), GFP_KERNEL)) == NULL)
return CYCLIC_NONE;
cyc->cyc.when = *when;
hrtimer_cancel(&cyc->cyc.timr);
- mutex_lock(&cyclic_lock);
-
- cyc->nxt = cyc_flst;
- cyc_flst = cyc;
-
- mutex_unlock(&cyclic_lock);
+ kfree(cyc);
}
EXPORT_SYMBOL(cyclic_remove);