tracing: Modify saved_tgids size for change in saved_cmdline_size

saved_tgids is fixed size array but uses index upto
savedcmd->cmdline_num. savedcmd->cmdline_num can change
with modification to saved_cmdlines_size node. Fix
this indexing by making saved_tgid part of savedcmd
and modify it's size with changes to saved_cmdline_size.

Change-Id: Ia493f99a3d86d4624414e7605037a1cad35473a9
Signed-off-by: Omprakash Dhyade <odhyade@codeaurora.org>
This commit is contained in:
Omprakash Dhyade 2017-02-15 04:30:15 -08:00
parent 3a7e752617
commit be0b454d52

View file

@ -1357,11 +1357,11 @@ void tracing_reset_all_online_cpus(void)
#define SAVED_CMDLINES_DEFAULT 128 #define SAVED_CMDLINES_DEFAULT 128
#define NO_CMDLINE_MAP UINT_MAX #define NO_CMDLINE_MAP UINT_MAX
static unsigned saved_tgids[SAVED_CMDLINES_DEFAULT];
static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED; static arch_spinlock_t trace_cmdline_lock = __ARCH_SPIN_LOCK_UNLOCKED;
struct saved_cmdlines_buffer { struct saved_cmdlines_buffer {
unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1]; unsigned map_pid_to_cmdline[PID_MAX_DEFAULT+1];
unsigned *map_cmdline_to_pid; unsigned *map_cmdline_to_pid;
unsigned *saved_tgids;
unsigned cmdline_num; unsigned cmdline_num;
int cmdline_idx; int cmdline_idx;
char *saved_cmdlines; char *saved_cmdlines;
@ -1395,12 +1395,22 @@ static int allocate_cmdlines_buffer(unsigned int val,
return -ENOMEM; return -ENOMEM;
} }
s->saved_tgids = kmalloc_array(val, sizeof(*s->saved_tgids),
GFP_KERNEL);
if (!s->saved_tgids) {
kfree(s->map_cmdline_to_pid);
kfree(s->saved_cmdlines);
return -ENOMEM;
}
s->cmdline_idx = 0; s->cmdline_idx = 0;
s->cmdline_num = val; s->cmdline_num = val;
memset(&s->map_pid_to_cmdline, NO_CMDLINE_MAP, memset(&s->map_pid_to_cmdline, NO_CMDLINE_MAP,
sizeof(s->map_pid_to_cmdline)); sizeof(s->map_pid_to_cmdline));
memset(s->map_cmdline_to_pid, NO_CMDLINE_MAP, memset(s->map_cmdline_to_pid, NO_CMDLINE_MAP,
val * sizeof(*s->map_cmdline_to_pid)); val * sizeof(*s->map_cmdline_to_pid));
memset(s->saved_tgids, 0,
val * sizeof(*s->saved_tgids));
return 0; return 0;
} }
@ -1596,7 +1606,7 @@ static int trace_save_cmdline(struct task_struct *tsk)
} }
set_cmdline(idx, tsk->comm); set_cmdline(idx, tsk->comm);
saved_tgids[idx] = tsk->tgid; savedcmd->saved_tgids[idx] = tsk->tgid;
arch_spin_unlock(&trace_cmdline_lock); arch_spin_unlock(&trace_cmdline_lock);
return 1; return 1;
@ -1648,7 +1658,7 @@ int trace_find_tgid(int pid)
arch_spin_lock(&trace_cmdline_lock); arch_spin_lock(&trace_cmdline_lock);
map = savedcmd->map_pid_to_cmdline[pid]; map = savedcmd->map_pid_to_cmdline[pid];
if (map != NO_CMDLINE_MAP) if (map != NO_CMDLINE_MAP)
tgid = saved_tgids[map]; tgid = savedcmd->saved_tgids[map];
else else
tgid = -1; tgid = -1;
@ -4221,13 +4231,13 @@ tracing_saved_tgids_read(struct file *file, char __user *ubuf,
int pid; int pid;
int i; int i;
file_buf = kmalloc(SAVED_CMDLINES_DEFAULT*(16+1+16), GFP_KERNEL); file_buf = kmalloc(savedcmd->cmdline_num*(16+1+16), GFP_KERNEL);
if (!file_buf) if (!file_buf)
return -ENOMEM; return -ENOMEM;
buf = file_buf; buf = file_buf;
for (i = 0; i < SAVED_CMDLINES_DEFAULT; i++) { for (i = 0; i < savedcmd->cmdline_num; i++) {
int tgid; int tgid;
int r; int r;