1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
/******************************************************************************
* tasklet.h
*
* Tasklets are dynamically-allocatable tasks run in either VCPU context
* (specifically, the idle VCPU's context) or in softirq context, on at most
* one CPU at a time. Softirq versus VCPU context execution is specified
* during per-tasklet initialisation.
*/
#ifndef __XEN_TASKLET_H__
#define __XEN_TASKLET_H__
#include <xen/types.h>
#include <xen/list.h>
#include <xen/percpu.h>
struct tasklet
{
struct list_head list;
int scheduled_on;
bool_t is_softirq;
bool_t is_running;
bool_t is_dead;
void (*func)(unsigned long);
unsigned long data;
};
#define _DECLARE_TASKLET(name, func, data, softirq) \
struct tasklet name = { \
LIST_HEAD_INIT(name.list), -1, softirq, 0, 0, func, data }
#define DECLARE_TASKLET(name, func, data) \
_DECLARE_TASKLET(name, func, data, 0)
#define DECLARE_SOFTIRQ_TASKLET(name, func, data) \
_DECLARE_TASKLET(name, func, data, 1)
/* Indicates status of tasklet work on each CPU. */
DECLARE_PER_CPU(unsigned long, tasklet_work_to_do);
#define _TASKLET_enqueued 0 /* Tasklet work is enqueued for this CPU. */
#define _TASKLET_scheduled 1 /* Scheduler has scheduled do_tasklet(). */
#define TASKLET_enqueued (1ul << _TASKLET_enqueued)
#define TASKLET_scheduled (1ul << _TASKLET_scheduled)
void tasklet_schedule_on_cpu(struct tasklet *t, unsigned int cpu);
void tasklet_schedule(struct tasklet *t);
void do_tasklet(void);
void tasklet_kill(struct tasklet *t);
void tasklet_init(
struct tasklet *t, void (*func)(unsigned long), unsigned long data);
void softirq_tasklet_init(
struct tasklet *t, void (*func)(unsigned long), unsigned long data);
void tasklet_subsys_init(void);
#endif /* __XEN_TASKLET_H__ */
|