Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c819db3d authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: use seq_file for mem_entry debugfs"

parents 1242c048 89462e23
Loading
Loading
Loading
Loading
+71 −9
Original line number Diff line number Diff line
@@ -125,7 +125,7 @@ static char get_cacheflag(const struct kgsl_memdesc *m)
}


static int print_mem_entry(int id, void *ptr, void *data)
static int print_mem_entry(void *data, void *ptr)
{
	struct seq_file *s = data;
	struct kgsl_mem_entry *entry = ptr;
@@ -164,25 +164,83 @@ static int print_mem_entry(int id, void *ptr, void *data)
	return 0;
}

static int process_mem_print(struct seq_file *s, void *unused)
static struct kgsl_mem_entry *process_mem_seq_find(struct seq_file *s,
						void *ptr, loff_t pos)
{
	struct kgsl_mem_entry *entry = ptr;
	struct kgsl_process_private *private = s->private;
	int id = 0;
	loff_t temp_pos = 1;

	seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s\n",
		   "gpuaddr", "useraddr", "size", "id", "flags", "type",
		   "usage", "sglen", "mapsize");
	if (entry != SEQ_START_TOKEN)
		id = entry->id + 1;

	spin_lock(&private->mem_lock);
	idr_for_each(&private->mem_idr, print_mem_entry, s);
	for (entry = idr_get_next(&private->mem_idr, &id); entry;
		id++, entry = idr_get_next(&private->mem_idr, &id),
							temp_pos++) {
		if (temp_pos == pos && kgsl_mem_entry_get(entry)) {
			spin_unlock(&private->mem_lock);
			goto found;
		}
	}
	spin_unlock(&private->mem_lock);

	entry = NULL;
found:
	if (ptr != SEQ_START_TOKEN)
		kgsl_mem_entry_put(ptr);

	return entry;
}

static void *process_mem_seq_start(struct seq_file *s, loff_t *pos)
{
	loff_t seq_file_offset = *pos;

	if (seq_file_offset == 0)
		return SEQ_START_TOKEN;
	else
		return process_mem_seq_find(s, SEQ_START_TOKEN,
						seq_file_offset);
}

static void process_mem_seq_stop(struct seq_file *s, void *ptr)
{
	if (ptr && ptr != SEQ_START_TOKEN)
		kgsl_mem_entry_put(ptr);
}

static void *process_mem_seq_next(struct seq_file *s, void *ptr,
							loff_t *pos)
{
	++*pos;
	return process_mem_seq_find(s, ptr, 1);
}

static int process_mem_seq_show(struct seq_file *s, void *ptr)
{
	if (ptr == SEQ_START_TOKEN) {
		seq_printf(s, "%16s %16s %16s %5s %9s %10s %16s %5s %16s\n",
				"gpuaddr", "useraddr", "size", "id", "flags",
				"type", "usage", "sglen", "mapsize");
		return 0;
	} else
		return print_mem_entry(s, ptr);
}

static const struct seq_operations process_mem_seq_fops = {
	.start = process_mem_seq_start,
	.stop = process_mem_seq_stop,
	.next = process_mem_seq_next,
	.show = process_mem_seq_show,
};

static int process_mem_open(struct inode *inode, struct file *file)
{
	int ret;
	pid_t pid = (pid_t) (unsigned long) inode->i_private;
	struct seq_file *s = NULL;
	struct kgsl_process_private *private = NULL;

	private = kgsl_process_private_find(pid);
@@ -190,9 +248,13 @@ static int process_mem_open(struct inode *inode, struct file *file)
	if (!private)
		return -ENODEV;

	ret = single_open(file, process_mem_print, private);
	ret = seq_open(file, &process_mem_seq_fops);
	if (ret)
		kgsl_process_private_put(private);
	else {
		s = file->private_data;
		s->private = private;
	}

	return ret;
}
@@ -205,7 +267,7 @@ static int process_mem_release(struct inode *inode, struct file *file)
	if (private)
		kgsl_process_private_put(private);

	return single_release(inode, file);
	return seq_release(inode, file);
}

static const struct file_operations process_mem_fops = {