diff options
Diffstat (limited to 'kernel/workqueue.c')
| -rw-r--r-- | kernel/workqueue.c | 32 | 
1 files changed, 22 insertions, 10 deletions
| diff --git a/kernel/workqueue.c b/kernel/workqueue.c index 42fa9ad0a81..bec7b5b53e0 100644 --- a/kernel/workqueue.c +++ b/kernel/workqueue.c @@ -242,10 +242,10 @@ struct workqueue_struct {  	int			nr_drainers;	/* W: drain in progress */  	int			saved_max_active; /* W: saved cwq max_active */ -	const char		*name;		/* I: workqueue name */  #ifdef CONFIG_LOCKDEP  	struct lockdep_map	lockdep_map;  #endif +	char			name[];		/* I: workqueue name */  };  struct workqueue_struct *system_wq __read_mostly; @@ -2954,14 +2954,29 @@ static int wq_clamp_max_active(int max_active, unsigned int flags,  	return clamp_val(max_active, 1, lim);  } -struct workqueue_struct *__alloc_workqueue_key(const char *name, +struct workqueue_struct *__alloc_workqueue_key(const char *fmt,  					       unsigned int flags,  					       int max_active,  					       struct lock_class_key *key, -					       const char *lock_name) +					       const char *lock_name, ...)  { +	va_list args, args1;  	struct workqueue_struct *wq;  	unsigned int cpu; +	size_t namelen; + +	/* determine namelen, allocate wq and format name */ +	va_start(args, lock_name); +	va_copy(args1, args); +	namelen = vsnprintf(NULL, 0, fmt, args) + 1; + +	wq = kzalloc(sizeof(*wq) + namelen, GFP_KERNEL); +	if (!wq) +		goto err; + +	vsnprintf(wq->name, namelen, fmt, args1); +	va_end(args); +	va_end(args1);  	/*  	 * Workqueues which may be used during memory reclaim should @@ -2978,12 +2993,9 @@ struct workqueue_struct *__alloc_workqueue_key(const char *name,  		flags |= WQ_HIGHPRI;  	max_active = max_active ?: WQ_DFL_ACTIVE; -	max_active = wq_clamp_max_active(max_active, flags, name); - -	wq = kzalloc(sizeof(*wq), GFP_KERNEL); -	if (!wq) -		goto err; +	max_active = wq_clamp_max_active(max_active, flags, wq->name); +	/* init wq */  	wq->flags = flags;  	wq->saved_max_active = max_active;  	mutex_init(&wq->flush_mutex); @@ -2991,7 +3003,6 @@ struct workqueue_struct *__alloc_workqueue_key(const char *name,  	INIT_LIST_HEAD(&wq->flusher_queue);  	INIT_LIST_HEAD(&wq->flusher_overflow); -	wq->name = name;  	lockdep_init_map(&wq->lockdep_map, lock_name, key, 0);  	INIT_LIST_HEAD(&wq->list); @@ -3020,7 +3031,8 @@ struct workqueue_struct *__alloc_workqueue_key(const char *name,  		if (!rescuer)  			goto err; -		rescuer->task = kthread_create(rescuer_thread, wq, "%s", name); +		rescuer->task = kthread_create(rescuer_thread, wq, "%s", +					       wq->name);  		if (IS_ERR(rescuer->task))  			goto err; | 
