lkml.org 
[lkml]   [2008]   [Oct]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH/RFC v2 2/6] workqueue: introduce create_rt_workqueue
    Date
    On Tuesday 14 October 2008 08:50:09 Heiko Carstens wrote:
    > From: Heiko Carstens <heiko.carstens@de.ibm.com>
    >
    > create_rt_workqueue will create a real time prioritized workqueue.
    > This is needed for the conversion of stop_machine to a workqueue based
    > implementation.
    > This patch adds yet another parameter to __create_workqueue_key to tell
    > it that we want an rt workqueue.
    > However it looks like we rather should have something like "int type"
    > instead of singlethread, freezable and rt.

    Ingo didn't ack this, but he didn't nack it either and it's a straightforward
    transformation. If we want to enum the type we can always do it later.

    I'll push this now as part of my stop_machine and module series.

    Thanks!
    Rusty.


    >
    > Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
    > ---
    > include/linux/workqueue.h | 18 ++++++++++--------
    > kernel/workqueue.c | 7 ++++++-
    > 2 files changed, 16 insertions(+), 9 deletions(-)
    >
    > Index: linux-2.6/include/linux/workqueue.h
    > ===================================================================
    > --- linux-2.6.orig/include/linux/workqueue.h
    > +++ linux-2.6/include/linux/workqueue.h
    > @@ -149,11 +149,11 @@ struct execute_work {
    >
    > extern struct workqueue_struct *
    > __create_workqueue_key(const char *name, int singlethread,
    > - int freezeable, struct lock_class_key *key,
    > + int freezeable, int rt, struct lock_class_key *key,
    > const char *lock_name);
    >
    > #ifdef CONFIG_LOCKDEP
    > -#define __create_workqueue(name, singlethread, freezeable) \
    > +#define __create_workqueue(name, singlethread, freezeable, rt) \
    > ({ \
    > static struct lock_class_key __key; \
    > const char *__lock_name; \
    > @@ -164,17 +164,19 @@ __create_workqueue_key(const char *name,
    > __lock_name = #name; \
    > \
    > __create_workqueue_key((name), (singlethread), \
    > - (freezeable), &__key, \
    > + (freezeable), (rt), &__key, \
    > __lock_name); \
    > })
    > #else
    > -#define __create_workqueue(name, singlethread, freezeable) \
    > - __create_workqueue_key((name), (singlethread), (freezeable), NULL, NULL)
    > +#define __create_workqueue(name, singlethread, freezeable, rt) \
    > + __create_workqueue_key((name), (singlethread), (freezeable), (rt), \
    > + NULL, NULL)
    > #endif
    >
    > -#define create_workqueue(name) __create_workqueue((name), 0, 0)
    > -#define create_freezeable_workqueue(name) __create_workqueue((name), 1, 1)
    > -#define create_singlethread_workqueue(name) __create_workqueue((name), 1,
    > 0) +#define create_workqueue(name) __create_workqueue((name), 0, 0, 0)
    > +#define create_rt_workqueue(name) __create_workqueue((name), 0, 0, 1)
    > +#define create_freezeable_workqueue(name) __create_workqueue((name), 1, 1,
    > 0) +#define create_singlethread_workqueue(name) __create_workqueue((name),
    > 1, 0, 0)
    >
    > extern void destroy_workqueue(struct workqueue_struct *wq);
    >
    > Index: linux-2.6/kernel/workqueue.c
    > ===================================================================
    > --- linux-2.6.orig/kernel/workqueue.c
    > +++ linux-2.6/kernel/workqueue.c
    > @@ -62,6 +62,7 @@ struct workqueue_struct {
    > const char *name;
    > int singlethread;
    > int freezeable; /* Freeze threads during suspend */
    > + int rt;
    > #ifdef CONFIG_LOCKDEP
    > struct lockdep_map lockdep_map;
    > #endif
    > @@ -766,6 +767,7 @@ init_cpu_workqueue(struct workqueue_stru
    >
    > static int create_workqueue_thread(struct cpu_workqueue_struct *cwq, int
    > cpu) {
    > + struct sched_param param = { .sched_priority = MAX_RT_PRIO-1 };
    > struct workqueue_struct *wq = cwq->wq;
    > const char *fmt = is_single_threaded(wq) ? "%s" : "%s/%d";
    > struct task_struct *p;
    > @@ -781,7 +783,8 @@ static int create_workqueue_thread(struc
    > */
    > if (IS_ERR(p))
    > return PTR_ERR(p);
    > -
    > + if (cwq->wq->rt)
    > + sched_setscheduler_nocheck(p, SCHED_FIFO, &param);
    > cwq->thread = p;
    >
    > return 0;
    > @@ -801,6 +804,7 @@ static void start_workqueue_thread(struc
    > struct workqueue_struct *__create_workqueue_key(const char *name,
    > int singlethread,
    > int freezeable,
    > + int rt,
    > struct lock_class_key *key,
    > const char *lock_name)
    > {
    > @@ -822,6 +826,7 @@ struct workqueue_struct *__create_workqu
    > lockdep_init_map(&wq->lockdep_map, lock_name, key, 0);
    > wq->singlethread = singlethread;
    > wq->freezeable = freezeable;
    > + wq->rt = rt;
    > INIT_LIST_HEAD(&wq->list);
    >
    > if (singlethread) {




    \
     
     \ /
      Last update: 2008-10-22 00:17    [W:0.031 / U:0.464 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site