/*
* Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
* Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
*/
/*
* This file is part of Lustre, http://www.lustre.org/
#ifndef __LIBCFS_WORKITEM_H__
#define __LIBCFS_WORKITEM_H__
+struct cfs_wi_sched;
+
+void cfs_wi_sched_destroy(struct cfs_wi_sched *);
+int cfs_wi_sched_create(char *name, struct cfs_cpt_table *cptab, int cpt,
+ int nthrs, struct cfs_wi_sched **);
+
struct cfs_workitem;
typedef int (*cfs_wi_action_t) (struct cfs_workitem *);
typedef struct cfs_workitem {
- /** chain on runq or rerunq */
- cfs_list_t wi_list;
- /** working function */
- cfs_wi_action_t wi_action;
- /** arg for working function */
- void *wi_data;
- /** scheduler id, can be negative */
- short wi_sched_id;
- /** in running */
- unsigned short wi_running:1;
- /** scheduled */
- unsigned short wi_scheduled:1;
+ /** chain on runq or rerunq */
+ struct list_head wi_list;
+ /** working function */
+ cfs_wi_action_t wi_action;
+ /** arg for working function */
+ void *wi_data;
+ /** in running */
+ unsigned short wi_running:1;
+ /** scheduled */
+ unsigned short wi_scheduled:1;
} cfs_workitem_t;
-/**
- * positive values are reserved as CPU id of future implementation of
- * per-cpu scheduler, so user can "bind" workitem on specific CPU.
- */
-#define CFS_WI_SCHED_ANY (-1)
-#define CFS_WI_SCHED_SERIAL (-2)
-
static inline void
-cfs_wi_init(cfs_workitem_t *wi, void *data,
- cfs_wi_action_t action, short sched_id)
+cfs_wi_init(cfs_workitem_t *wi, void *data, cfs_wi_action_t action)
{
- CFS_INIT_LIST_HEAD(&wi->wi_list);
+ INIT_LIST_HEAD(&wi->wi_list);
- wi->wi_sched_id = sched_id;
- wi->wi_running = 0;
- wi->wi_scheduled = 0;
- wi->wi_data = data;
- wi->wi_action = action;
+ wi->wi_running = 0;
+ wi->wi_scheduled = 0;
+ wi->wi_data = data;
+ wi->wi_action = action;
}
-void cfs_wi_exit(cfs_workitem_t *wi);
-int cfs_wi_cancel(cfs_workitem_t *wi);
-void cfs_wi_schedule(cfs_workitem_t *wi);
+void cfs_wi_schedule(struct cfs_wi_sched *sched, cfs_workitem_t *wi);
+int cfs_wi_deschedule(struct cfs_wi_sched *sched, cfs_workitem_t *wi);
+void cfs_wi_exit(struct cfs_wi_sched *sched, cfs_workitem_t *wi);
+
int cfs_wi_startup(void);
void cfs_wi_shutdown(void);