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

Commit 6422a30d authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "msm: kgsl: add kgsl stats to vm_stat and rss_stat counters"

parents fd905d75 5bb10263
Loading
Loading
Loading
Loading
+8 −1
Original line number Diff line number Diff line
@@ -331,6 +331,10 @@ kgsl_mem_entry_destroy(struct kref *kref)
	/* pull out the memtype before the flags get cleared */
	memtype = kgsl_memdesc_usermem_type(&entry->memdesc);

	if (!(entry->memdesc.flags & KGSL_MEMFLAGS_SPARSE_VIRT))
		kgsl_process_sub_stats(entry->priv, memtype,
			entry->memdesc.size);

	/* Detach from process list */
	kgsl_mem_entry_detach_process(entry);

@@ -489,7 +493,6 @@ static void kgsl_mem_entry_detach_process(struct kgsl_mem_entry *entry)
	entry->id = 0;

	type = kgsl_memdesc_usermem_type(&entry->memdesc);
	entry->priv->stats[type].cur -= entry->memdesc.size;

	if (type != KGSL_MEM_ENTRY_ION)
		entry->priv->gpumem_mapped -= entry->memdesc.mapsize;
@@ -3675,6 +3678,10 @@ long kgsl_ioctl_sparse_phys_alloc(struct kgsl_device_private *dev_priv,
	param->id = entry->id;
	param->flags = entry->memdesc.flags;

	kgsl_process_add_stats(process,
			kgsl_memdesc_usermem_type(&entry->memdesc),
			entry->memdesc.size);

	trace_sparse_phys_alloc(entry->id, param->size, param->pagesize);
	kgsl_mem_entry_commit_process(entry);

+28 −0
Original line number Diff line number Diff line
@@ -5,6 +5,9 @@
#ifndef __KGSL_DEVICE_H
#define __KGSL_DEVICE_H

#include <linux/sched/mm.h>
#include <linux/sched/task.h>

#include "kgsl.h"
#include "kgsl_drawobj.h"
#include "kgsl_mmu.h"
@@ -553,6 +556,31 @@ static inline void kgsl_process_add_stats(struct kgsl_process_private *priv,
	priv->stats[type].cur += size;
	if (priv->stats[type].max < priv->stats[type].cur)
		priv->stats[type].max = priv->stats[type].cur;
	add_mm_counter(current->mm, MM_UNRECLAIMABLE, (size >> PAGE_SHIFT));
}

static inline void kgsl_process_sub_stats(struct kgsl_process_private *priv,
	unsigned int type, uint64_t size)
{
	struct pid *pid_struct;
	struct task_struct *task;
	struct mm_struct *mm;

	priv->stats[type].cur -= size;
	pid_struct = find_get_pid(priv->pid);
	if (pid_struct) {
		task = get_pid_task(pid_struct, PIDTYPE_PID);
		if (task) {
			mm = get_task_mm(task);
			if (mm) {
				add_mm_counter(mm, MM_UNRECLAIMABLE,
					-(size >> PAGE_SHIFT));
				mmput(mm);
			}
			put_task_struct(task);
		}
		put_pid(pid_struct);
	}
}

static inline bool kgsl_is_register_offset(struct kgsl_device *device,
+9 −1
Original line number Diff line number Diff line
@@ -80,6 +80,8 @@ _kgsl_pool_add_page(struct kgsl_page_pool *pool, struct page *p)
	list_add_tail(&p->lru, &pool->page_list);
	pool->page_count++;
	spin_unlock(&pool->list_lock);
	mod_node_page_state(page_pgdat(p), NR_INDIRECTLY_RECLAIMABLE_BYTES,
				(PAGE_SIZE << pool->pool_order));
}

/* Returns a page from specified pool */
@@ -95,7 +97,8 @@ _kgsl_pool_get_page(struct kgsl_page_pool *pool)
		list_del(&p->lru);
	}
	spin_unlock(&pool->list_lock);

	mod_node_page_state(page_pgdat(p), NR_INDIRECTLY_RECLAIMABLE_BYTES,
				-(PAGE_SIZE << pool->pool_order));
	return p;
}

@@ -397,6 +400,8 @@ int kgsl_pool_alloc_page(int *page_size, struct page **pages,
		pcount++;
	}

	mod_node_page_state(page_pgdat(page), NR_UNRECLAIMABLE_PAGES,
					(1 << order));
	return pcount;

eagain:
@@ -416,6 +421,9 @@ void kgsl_pool_free_page(struct page *page)

	page_order = compound_order(page);

	mod_node_page_state(page_pgdat(page), NR_UNRECLAIMABLE_PAGES,
					-(1 << page_order));

	if (!kgsl_pool_max_pages ||
			(kgsl_pool_size_total() < kgsl_pool_max_pages)) {
		pool = _kgsl_get_pool_from_order(page_order);
+8 −0
Original line number Diff line number Diff line
@@ -650,6 +650,9 @@ static void kgsl_cma_coherent_free(struct kgsl_memdesc *memdesc)
			atomic_long_sub(memdesc->size,
				&kgsl_driver.stats.coherent);

		mod_node_page_state(page_pgdat(phys_to_page(memdesc->physaddr)),
			NR_UNRECLAIMABLE_PAGES, -(memdesc->size >> PAGE_SHIFT));

		dma_free_attrs(memdesc->dev, (size_t) memdesc->size,
			memdesc->hostptr, memdesc->physaddr, attrs);
	}
@@ -1332,6 +1335,8 @@ int kgsl_sharedmem_alloc_contig(struct kgsl_device *device,
	KGSL_STATS_ADD(size, &kgsl_driver.stats.coherent,
		&kgsl_driver.stats.coherent_max);

	mod_node_page_state(page_pgdat(phys_to_page(memdesc->physaddr)),
			NR_UNRECLAIMABLE_PAGES, (size >> PAGE_SHIFT));
err:
	if (result)
		kgsl_sharedmem_free(memdesc);
@@ -1447,6 +1452,9 @@ static int kgsl_cma_alloc_secure(struct kgsl_device *device,
	/* Record statistics */
	KGSL_STATS_ADD(aligned, &kgsl_driver.stats.secure,
	       &kgsl_driver.stats.secure_max);

	mod_node_page_state(page_pgdat(phys_to_page(memdesc->physaddr)),
			NR_UNRECLAIMABLE_PAGES, (aligned >> PAGE_SHIFT));
err:
	if (result)
		kgsl_sharedmem_free(memdesc);