Loading drivers/gpu/msm/kgsl.c +8 −1 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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); Loading drivers/gpu/msm/kgsl_device.h +28 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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, Loading drivers/gpu/msm/kgsl_pool.c +9 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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; } Loading Loading @@ -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: Loading @@ -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); Loading drivers/gpu/msm/kgsl_sharedmem.c +8 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); Loading Loading @@ -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); Loading Loading
drivers/gpu/msm/kgsl.c +8 −1 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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); Loading
drivers/gpu/msm/kgsl_device.h +28 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -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, Loading
drivers/gpu/msm/kgsl_pool.c +9 −1 Original line number Diff line number Diff line Loading @@ -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 */ Loading @@ -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; } Loading Loading @@ -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: Loading @@ -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); Loading
drivers/gpu/msm/kgsl_sharedmem.c +8 −0 Original line number Diff line number Diff line Loading @@ -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); } Loading Loading @@ -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); Loading Loading @@ -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); Loading