• Joonsoo Kim's avatar
    workqueue: change value of lcpu in __queue_delayed_work_on() · e42986de
    Joonsoo Kim authored
    We assign cpu id into work struct's data field in __queue_delayed_work_on().
    In current implementation, when work is come in first time,
    current running cpu id is assigned.
    If we do __queue_delayed_work_on() with CPU A on CPU B,
    __queue_work() invoked in delayed_work_timer_fn() go into
    the following sub-optimal path in case of WQ_NON_REENTRANT.
    
    	gcwq = get_gcwq(cpu);
    	if (wq->flags & WQ_NON_REENTRANT &&
    		(last_gcwq = get_work_gcwq(work)) && last_gcwq != gcwq) {
    
    Change lcpu to @cpu and rechange lcpu to local cpu if lcpu is WORK_CPU_UNBOUND.
    It is sufficient to prevent to go into sub-optimal path.
    
    tj: Slightly rephrased the comment.
    Signed-off-by: default avatarJoonsoo Kim <js1304@gmail.com>
    Signed-off-by: default avatarTejun Heo <tj@kernel.org>
    e42986de
workqueue.c 108 KB