Changeset View
Changeset View
Standalone View
Standalone View
head/sys/sys/gtaskqueue.h
Show All 25 Lines | |||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | ||||
* SUCH DAMAGE. | * SUCH DAMAGE. | ||||
* | * | ||||
* $FreeBSD$ | * $FreeBSD$ | ||||
*/ | */ | ||||
#ifndef _SYS_GTASKQUEUE_H_ | #ifndef _SYS_GTASKQUEUE_H_ | ||||
#define _SYS_GTASKQUEUE_H_ | #define _SYS_GTASKQUEUE_H_ | ||||
#include <sys/taskqueue.h> | |||||
#ifndef _KERNEL | #ifndef _KERNEL | ||||
#error "no user-serviceable parts inside" | #error "no user-serviceable parts inside" | ||||
#endif | #endif | ||||
#include <sys/_task.h> | |||||
#include <sys/bus.h> | |||||
#include <sys/taskqueue.h> | |||||
#include <sys/types.h> | |||||
struct gtaskqueue; | struct gtaskqueue; | ||||
typedef void (*gtaskqueue_enqueue_fn)(void *context); | |||||
/* | /* | ||||
* Taskqueue groups. Manages dynamic thread groups and irq binding for | * Taskqueue groups. Manages dynamic thread groups and irq binding for | ||||
* device and other tasks. | * device and other tasks. | ||||
*/ | */ | ||||
struct grouptask { | |||||
struct gtask gt_task; | |||||
void *gt_taskqueue; | |||||
LIST_ENTRY(grouptask) gt_list; | |||||
void *gt_uniq; | |||||
#define GROUPTASK_NAMELEN 32 | |||||
char gt_name[GROUPTASK_NAMELEN]; | |||||
device_t gt_dev; | |||||
struct resource *gt_irq; | |||||
int gt_cpu; | |||||
}; | |||||
void gtaskqueue_block(struct gtaskqueue *queue); | void gtaskqueue_block(struct gtaskqueue *queue); | ||||
void gtaskqueue_unblock(struct gtaskqueue *queue); | void gtaskqueue_unblock(struct gtaskqueue *queue); | ||||
int gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask); | int gtaskqueue_cancel(struct gtaskqueue *queue, struct gtask *gtask); | ||||
void gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *task); | void gtaskqueue_drain(struct gtaskqueue *queue, struct gtask *task); | ||||
void gtaskqueue_drain_all(struct gtaskqueue *queue); | void gtaskqueue_drain_all(struct gtaskqueue *queue); | ||||
void grouptask_block(struct grouptask *grouptask); | void grouptask_block(struct grouptask *grouptask); | ||||
void grouptask_unblock(struct grouptask *grouptask); | void grouptask_unblock(struct grouptask *grouptask); | ||||
int grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *task); | int grouptaskqueue_enqueue(struct gtaskqueue *queue, struct gtask *task); | ||||
void taskqgroup_attach(struct taskqgroup *qgroup, struct grouptask *grptask, | void taskqgroup_attach(struct taskqgroup *qgroup, struct grouptask *grptask, | ||||
void *uniq, int irq, const char *name); | void *uniq, device_t dev, struct resource *irq, const char *name); | ||||
int taskqgroup_attach_cpu(struct taskqgroup *qgroup, struct grouptask *grptask, | int taskqgroup_attach_cpu(struct taskqgroup *qgroup, | ||||
void *uniq, int cpu, int irq, const char *name); | struct grouptask *grptask, void *uniq, int cpu, device_t dev, | ||||
struct resource *irq, const char *name); | |||||
void taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask); | void taskqgroup_detach(struct taskqgroup *qgroup, struct grouptask *gtask); | ||||
struct taskqgroup *taskqgroup_create(const char *name); | struct taskqgroup *taskqgroup_create(const char *name); | ||||
void taskqgroup_destroy(struct taskqgroup *qgroup); | void taskqgroup_destroy(struct taskqgroup *qgroup); | ||||
int taskqgroup_adjust(struct taskqgroup *qgroup, int cnt, int stride); | int taskqgroup_adjust(struct taskqgroup *qgroup, int cnt, int stride); | ||||
void taskqgroup_config_gtask_init(void *ctx, struct grouptask *gtask, gtask_fn_t *fn, | void taskqgroup_config_gtask_init(void *ctx, struct grouptask *gtask, | ||||
const char *name); | gtask_fn_t *fn, const char *name); | ||||
void taskqgroup_config_gtask_deinit(struct grouptask *gtask); | void taskqgroup_config_gtask_deinit(struct grouptask *gtask); | ||||
#define TASK_ENQUEUED 0x1 | #define TASK_ENQUEUED 0x1 | ||||
#define TASK_SKIP_WAKEUP 0x2 | #define TASK_SKIP_WAKEUP 0x2 | ||||
#define TASK_NOENQUEUE 0x4 | #define TASK_NOENQUEUE 0x4 | ||||
#define GTASK_INIT(gtask, flags, priority, func, context) do { \ | |||||
#define GTASK_INIT(task, flags, priority, func, context) do { \ | (gtask)->ta_flags = flags; \ | ||||
(task)->ta_flags = flags; \ | (gtask)->ta_priority = (priority); \ | ||||
(task)->ta_priority = (priority); \ | (gtask)->ta_func = (func); \ | ||||
(task)->ta_func = (func); \ | (gtask)->ta_context = (context); \ | ||||
(task)->ta_context = (context); \ | |||||
} while (0) | } while (0) | ||||
#define GROUPTASK_INIT(gtask, priority, func, context) \ | #define GROUPTASK_INIT(gtask, priority, func, context) \ | ||||
GTASK_INIT(&(gtask)->gt_task, TASK_SKIP_WAKEUP, priority, func, context) | GTASK_INIT(&(gtask)->gt_task, TASK_SKIP_WAKEUP, priority, func, context) | ||||
#define GROUPTASK_ENQUEUE(gtask) \ | #define GROUPTASK_ENQUEUE(gtask) \ | ||||
grouptaskqueue_enqueue((gtask)->gt_taskqueue, &(gtask)->gt_task) | grouptaskqueue_enqueue((gtask)->gt_taskqueue, &(gtask)->gt_task) | ||||
Show All 29 Lines |