workqueue: move hot fields of workqueue_struct to the end
authorTejun Heo <tj@kernel.org>
Mon, 1 Apr 2013 18:23:35 +0000 (11:23 -0700)
committerTejun Heo <tj@kernel.org>
Mon, 1 Apr 2013 18:23:35 +0000 (11:23 -0700)
Move wq->flags and ->cpu_pwqs to the end of workqueue_struct and align
them to the cacheline.  These two fields are used in the work item
issue path and thus hot.  The scheduled NUMA affinity support will add
dispatch table at the end of workqueue_struct and relocating these two
fields will allow us hitting only single cacheline on hot paths.

Note that wq->pwqs isn't moved although it currently is being used in
the work item issue path for unbound workqueues.  The dispatch table
mentioned above will replace its use in the issue path, so it will
become cold once NUMA support is implemented.

Signed-off-by: Tejun Heo <tj@kernel.org>
Reviewed-by: Lai Jiangshan <laijs@cn.fujitsu.com>
kernel/workqueue.c

index c8c5838c52c9d889896d4c7f53d74badad2a12b9..4c53fa216732a0f468b764cdeefc45bf736197ab 100644 (file)
@@ -227,8 +227,6 @@ struct wq_device;
  * the appropriate worker_pool through its pool_workqueues.
  */
 struct workqueue_struct {
-       unsigned int            flags;          /* WQ: WQ_* flags */
-       struct pool_workqueue __percpu *cpu_pwqs; /* I: per-cpu pwq's */
        struct list_head        pwqs;           /* WR: all pwqs of this wq */
        struct list_head        list;           /* PL: list of all workqueues */
 
@@ -255,6 +253,10 @@ struct workqueue_struct {
        struct lockdep_map      lockdep_map;
 #endif
        char                    name[WQ_NAME_LEN]; /* I: workqueue name */
+
+       /* hot fields used during command issue, aligned to cacheline */
+       unsigned int            flags ____cacheline_aligned; /* WQ: WQ_* flags */
+       struct pool_workqueue __percpu *cpu_pwqs; /* I: per-cpu pwqs */
 };
 
 static struct kmem_cache *pwq_cache;