高通平台采用gpu-mmu的时候发生显存耗完而整个系统内存尚有的情况导致crash和重启
来源:互联网 发布:软件安装管理器 编辑:程序博客网 时间:2024/04/29 01:43
原因在于kgsl_mmu.c中,定义了gpu使用的内存大小,7x30中限定了256MB,当显存耗光而内存尚剩余很多的时候就会发生问题:不能触发LMK或OOM来释放内存,而又没有显存可用,进而可能引起各进程watchdogtimeout,如果系统进程发生watchdogtimeout,会导致system serverrestart,而restart之后也不能释放gpu显存,会一直反复重启:
unsigned int kgsl_mmu_get_ptsize(void){/* * For IOMMU, we could do up to 4G virtual range if we wanted to, but * it makes more sense to return a smaller range and leave the rest of * the virtual range for future improvements */if (KGSL_MMU_TYPE_GPU == kgsl_mmu_type)return CONFIG_MSM_KGSL_PAGE_TABLE_SIZE;else if (KGSL_MMU_TYPE_IOMMU == kgsl_mmu_type)return SZ_2G - KGSL_PAGETABLE_BASE;elsereturn 0;}
Lowmemorykiller.c 添加一个新函数
void lowmem_shrink_gpu(void){struct task_struct *tsk;struct task_struct *selected = NULL;int tasksize;int selected_tasksize = 0;rcu_read_lock();for_each_process(tsk) {struct task_struct *p;if (tsk->flags & PF_KTHREAD)continue;p = find_lock_task_mm(tsk);if (!p)continue;if (test_tsk_thread_flag(p, TIF_MEMDIE) && time_before_eq(jiffies, lowmem_deathpending_timeout)) {task_unlock(p);rcu_read_unlock();return ;}tasksize = get_mm_rss(p->mm);task_unlock(p);if ((tasksize <= 0) || (p->signal->oom_score_adj <= 1))continue;if (selected) {if (tasksize <= selected_tasksize)continue;}selected = p;selected_tasksize = tasksize;lowmem_print(2, "AKeywordSE select %d (%s), size %d, to kill\n", p->pid, p->comm, tasksize);}if (selected) {lowmem_print(1, "AKeywordSE send sigkill to %d (%s), size %d\n", selected->pid, selected->comm,selected_tasksize);lowmem_deathpending_timeout = jiffies + HZ;send_sig(SIGKILL, selected, 0);set_tsk_thread_flag(selected, TIF_MEMDIE);}rcu_read_unlock();return ;}
Kgs_mmu.c中声明
extern void lowmem_shrink_gpu(void );
并在kgsl_mmu_map中调用
if (memdesc->gpuaddr == 0) {lowmem_shrink_gpu();KGSL_CORE_ERR("gen_pool_alloc(%d) failed from pool: %s\n",size,(pool == pagetable->kgsl_pool) ?"kgsl_pool" : "general_pool");KGSL_CORE_ERR(" [%d] allocated=%d, entries=%d\n",pagetable->name, pagetable->stats.mapped,pagetable->stats.entries);return -ENOMEM;}
0 0
- 高通平台采用gpu-mmu的时候发生显存耗完而整个系统内存尚有的情况导致crash和重启
- 如何获取显卡的GPU占用率和显存占用情况
- 如何获取显卡的GPU占用率和显存占用情况
- 如何获取显卡的GPU占用率和显存占用情况
- 关于使用PyTorch设置多线程(threads)进行数据读取而导致GPU显存始终不释放的问题
- 显卡显存和内存显存的区别
- 显卡显存和内存显存的区别
- 获取DX9设备占用系统内存和显存的方法
- 记一次qcom平台i2c和uart配置问题导致的系统重启
- AGP内存,系统内存,显存的区别
- AGP内存,系统内存,显存的区别
- AGP内存,系统内存,显存的区别 .
- VC编译的时候发生桌面crash
- Android 系统自动重启Bug(高通平台)
- Android 系统自动重启Bug(高通平台)
- Android 系统自动重启Bug(高通平台)
- Android 系统自动重启Bug(高通平台)
- Android 系统自动重启Bug(高通平台)
- libiconv字符集转换库在C#中的使用
- leetcode 148: Word Break
- 解决微信开放平台分享图片失败问题
- Java Web连接数据库MySql的一种方法
- jquery 插件 起步代码
- 高通平台采用gpu-mmu的时候发生显存耗完而整个系统内存尚有的情况导致crash和重启
- javascript深入理解js闭包
- 提高系统体验建议(持续更新)
- MySQL存储引擎MyISAM与InnoDB的主要区别对比
- 【小话设计模式】类之间的关系
- freemarker简单入门
- 浅谈面向对象
- C函数的参数传递过程
- 织梦CMS如何修改网站地图的生成路径