Merge branch 'akpm' (patches from Andrew)
Merge more updates from Andrew Morton: "55 patches. Subsystems affected by this patch series: percpu, procfs, sysctl, misc, core-kernel, get_maintainer, lib, checkpatch, binfmt, nilfs2, hfs, fat, adfs, panic, delayacct, kconfig, kcov, and ubsan" * emailed patches from Andrew Morton <akpm@linux-foundation.org>: (55 commits) lib: remove redundant assignment to variable ret ubsan: remove CONFIG_UBSAN_OBJECT_SIZE kcov: fix generic Kconfig dependencies if ARCH_WANTS_NO_INSTR lib/Kconfig.debug: make TEST_KMOD depend on PAGE_SIZE_LESS_THAN_256KB btrfs: use generic Kconfig option for 256kB page size limit arch/Kconfig: split PAGE_SIZE_LESS_THAN_256KB from PAGE_SIZE_LESS_THAN_64KB configs: introduce debug.config for CI-like setup delayacct: track delays from memory compact Documentation/accounting/delay-accounting.rst: add thrashing page cache and direct compact delayacct: cleanup flags in struct task_delay_info and functions use it delayacct: fix incomplete disable operation when switch enable to disable delayacct: support swapin delay accounting for swapping without blkio panic: remove oops_id panic: use error_report_end tracepoint on warnings fs/adfs: remove unneeded variable make code cleaner FAT: use io_schedule_timeout() instead of congestion_wait() hfsplus: use struct_group_attr() for memcpy() region nilfs2: remove redundant pointer sbufs fs/binfmt_elf: use PT_LOAD p_align values for static PIE const_structs.checkpatch: add frequently used ops structs ...
This commit is contained in:
+30
-2
@@ -61,6 +61,8 @@ struct kthread {
|
||||
#ifdef CONFIG_BLK_CGROUP
|
||||
struct cgroup_subsys_state *blkcg_css;
|
||||
#endif
|
||||
/* To store the full name if task comm is truncated. */
|
||||
char *full_name;
|
||||
};
|
||||
|
||||
enum KTHREAD_BITS {
|
||||
@@ -94,6 +96,18 @@ static inline struct kthread *__to_kthread(struct task_struct *p)
|
||||
return kthread;
|
||||
}
|
||||
|
||||
void get_kthread_comm(char *buf, size_t buf_size, struct task_struct *tsk)
|
||||
{
|
||||
struct kthread *kthread = to_kthread(tsk);
|
||||
|
||||
if (!kthread || !kthread->full_name) {
|
||||
__get_task_comm(buf, buf_size, tsk);
|
||||
return;
|
||||
}
|
||||
|
||||
strscpy_pad(buf, kthread->full_name, buf_size);
|
||||
}
|
||||
|
||||
bool set_kthread_struct(struct task_struct *p)
|
||||
{
|
||||
struct kthread *kthread;
|
||||
@@ -121,10 +135,14 @@ void free_kthread_struct(struct task_struct *k)
|
||||
* Can be NULL if kmalloc() in set_kthread_struct() failed.
|
||||
*/
|
||||
kthread = to_kthread(k);
|
||||
if (!kthread)
|
||||
return;
|
||||
|
||||
#ifdef CONFIG_BLK_CGROUP
|
||||
WARN_ON_ONCE(kthread && kthread->blkcg_css);
|
||||
WARN_ON_ONCE(kthread->blkcg_css);
|
||||
#endif
|
||||
k->worker_private = NULL;
|
||||
kfree(kthread->full_name);
|
||||
kfree(kthread);
|
||||
}
|
||||
|
||||
@@ -438,12 +456,22 @@ struct task_struct *__kthread_create_on_node(int (*threadfn)(void *data),
|
||||
task = create->result;
|
||||
if (!IS_ERR(task)) {
|
||||
char name[TASK_COMM_LEN];
|
||||
va_list aq;
|
||||
int len;
|
||||
|
||||
/*
|
||||
* task is already visible to other tasks, so updating
|
||||
* COMM must be protected.
|
||||
*/
|
||||
vsnprintf(name, sizeof(name), namefmt, args);
|
||||
va_copy(aq, args);
|
||||
len = vsnprintf(name, sizeof(name), namefmt, aq);
|
||||
va_end(aq);
|
||||
if (len >= TASK_COMM_LEN) {
|
||||
struct kthread *kthread = to_kthread(task);
|
||||
|
||||
/* leave it truncated when out of memory. */
|
||||
kthread->full_name = kvasprintf(GFP_KERNEL, namefmt, args);
|
||||
}
|
||||
set_task_comm(task, name);
|
||||
}
|
||||
kfree(create);
|
||||
|
||||
Reference in New Issue
Block a user