linux内存从0到1学习笔记(8.9可恢复硬件页面错误的含义)

高桐@BILL 高桐@BILL     2023-01-29     581

关键词:

    现代硬件支持可恢复的页错误,这对DMA围栏有很多影响。

    首先,挂起的页面错误显然会阻碍加速器上运行的任务,通常需要内存分配来解决错误。但是,不允许内存分配来控制 DMA 围栏的完成,这意味着使用可恢复页面错误的任何工作负载都不能使用 DMA 围栏进行同步,而必须改用由用户空间控制的同步围栏。

    这在 GPU 上会带来一个问题,因为 Linux 上的当前桌面合成器协议依赖于 DMA 围栏,这意味着如果没有在用户空间围栏之上构建的全新用户空间堆栈,它们将无法从可恢复的页面错误中受益。具体而言,这意味着无法进行隐式同步。例外情况是页面错误仅用作迁移提示,并且从不按需填充内存请求。目前,这意味着 GPU 上的可恢复页面错误仅限于纯计算工作负载。

    此外,GPU 通常在 3D 渲染和计算端之间共享资源,例如计算单元或命令提交引擎。如果具有 DMA 围栏的 3D 作业和使用可恢复页面错误的计算工作负载都处于挂起状态,则它们可能会死锁:

  • 3D 工作负载可能需要等待计算作业完成并首先释放硬件资源。
  • 计算工作负荷可能停滞在页面错误中,因为内存分配正在等待 3D 工作负荷的 DMA 围栏完成。

有几个选项可以防止此问题,其中一个驱动程序需要确保:

  • 计算工作负载始终可以被抢占,即使页面错误处于挂起状态且尚未修复也是如此。并非所有硬件都支持此功能。
  • DMA 围栏工作负载和需要页面错误处理的工作负载具有独立的硬件资源来保证前进进度。这可以通过例如通过专用引擎和 DMA 围栏工作负载的最小计算单元预留来实现。
  • 通过仅在 DMA 围栏工作负载进行中时为其预留硬件资源,可以进一步优化预留方法。这必须涵盖从 DMA 围栏对其他线程可见到围栏通过 dma_fence_signal()

linux内存从0到1学习笔记(8.9可恢复硬件页面错误的含义)

...起的页面错误显然会阻碍加速器上运行的任务,通常需要内存分配来解决错误。但是,不允许内存分配来控制DMA围栏的完成,这意味着使用可恢复页面错误的任何工作负载都不能使用DMA围栏进行同步,而必须改用由用户空间控制... 查看详情

linux内存从0到1学习笔记(10.1bugsshooter之cma配置过小导致页迁移繁忙而内存申请失败)

...程tombstone中的CALLSTACK,确认为_M_allocate_bucket进行bucket内存分配时发生异常;2.2kernel或串口日志alloc_congit_range:(xxx,xxx)PFNsbusy;cm 查看详情

linux内存从0到1学习笔记(五,内存分类)

一、内存类型ARMv8架构处理器定义了两种类型的内存类型,分别是普通内存(NormalMemory)和设备内存(DeviceMemory)。二、普通内存        普通内存对应MT_NORMAL属性;        普通内存由于其弱一致... 查看详情

linux内存从0到1学习笔记(七,用户空间虚拟内存之三-内存映射)(代码片段)

...通常C标准库只提供了一个函数,由应用程序用来创建内存映射,接下来该函数调用在内部转换为适合于体系结构的系统调用mmap和mmap2。可使用munmap系统调用删除映射。一、内存映射简介        mmap完成的是将物理内... 查看详情

linux内存从0到1学习笔记(6.3,物理内存初始化之内存基本数据结构初始化)(代码片段)

写在前面这部分主要介绍,bootmem_init()内存基本数据结构初始化,如内存节点,内存域。linux_mainline-5.17.0/arch/arm64/mm/init.c321void__initbootmem_init(void)322323 unsignedlongmin,max;324//获取最大最小页号;325 min=PFN_UP(memblock_start_of_DRAM( 查看详情

linux内存从0到1学习笔记(8.6dma-buf简介)

一,为什么需要DMA?  CPU指令系统通常只支持CPU(寄存器)-存储器,以及CPU-外设之间的数据传送,那么如果外设需要和存储器进行数据交换就必须经过CPU寄存器进行中转。很显然,中转会大大降低CPU的工作效率,浪费时... 查看详情

linux内存从0到1学习笔记(8.6dma-buf简介)

一,为什么需要DMA?  CPU指令系统通常只支持CPU(寄存器)-存储器,以及CPU-外设之间的数据传送,那么如果外设需要和存储器进行数据交换就必须经过CPU寄存器进行中转。很显然,中转会大大降低CPU的工作效率,浪费时... 查看详情

linux内存从0到1学习笔记(四,tlb)

...、TLB简介        Kernel初始化的时候,会在初始化内存中创建页表;而处理器读取指令和数据的时候需要首先通过MMU查表得到物理地址,然后在访问物理地址读取指令或数据。MMU查表过程汇中需要4次访问内存,... 查看详情

linux内存从0到1学习笔记(七,用户空间虚拟内存之二-内存空间的建立)(代码片段)

在使用load_elf_binary装在一个ELF二进制文件时,将创建进程的地址空间。Linux下的exec系统调用该函数来加载ELF文件。linux_mainline-5.17.0/fs/binfmt_elf.c823staticintload_elf_binary(structlinux_binprm*bprm)824825 structfile*interpreter= 查看详情

linux内存从0到1学习笔记(二,arm64物理内存)

写在前面我们先通过一张图来里哦啊接下ARM处理器的内存管理架构;2.1ARM处理器的内存管理架构ARM处理器内核:是指ARM架构的CPU中间的核心芯片,由单晶硅制成,用来完成所有的计算、接受/存储命令、处理数据等... 查看详情

linux内存从0到1学习笔记(8.8无限dmafence)

在不同时间,结构体dma_fence具有无限期的时间,直到dma_fence_wait()执行完成。例如:FutureFence(未来围栏),在HWC1中使用的,用于在显示器不再使用缓冲区时发出信号,并在屏幕更新时创建,以使得缓冲区可见。此围栏完成的时... 查看详情

linux内存从0到1学习笔记(8.8无限dmafence)

在不同时间,结构体dma_fence具有无限期的时间,直到dma_fence_wait()执行完成。例如:FutureFence(未来围栏),在HWC1中使用的,用于在显示器不再使用缓冲区时发出信号,并在屏幕更新时创建,以使得缓冲区可见。此围栏完成的时... 查看详情

linux内存从0到1学习笔记(8.13dma内存调试一)

...常使用过程中常常会遇到哪些问题呢?当然,dma-buf也是内存使用大法的一部分,那就免不了遇到这几大件:1.dma不足(合理使用),这部分的优化慎之又慎,要么从系统内存的大锅里多盛一点,要么自己节衣缩食;2.dma-buf泄漏(... 查看详情

linux内存从0到1学习笔记(8.13dma内存调试一)

...常使用过程中常常会遇到哪些问题呢?当然,dma-buf也是内存使用大法的一部分,那就免不了遇到这几大件:1.dma不足(合理使用),这部分的优化慎之又慎,要么从系统内存的大锅里多盛一点,要么自己节衣缩食;2.dma-buf泄漏(... 查看详情

linux内存从0到1学习笔记(6.8,物理内存初始化之buddy伙伴系统)

写在前面在linux启动的那一刻,内存管理就已经开始了。在内核中,实现物理内存管理的allocator包括:初始化阶段物理内存管理memblock连续物理内存管理buddy非连续物理内存管理vmallocallocator小块物理内存管理slaballocator在系统初始... 查看详情

linux内存从0到1学习笔记(三,高速缓存)

...RMv8最多可以支持7级的高速缓存,即L1级~L7级。接着是内存,本地磁盘。越往上的缓存存储空间越小,速度越快,成本也更高;越往下的存 查看详情

linux内存从0到1学习笔记(九,内存优化调试之三-内存拆解)---持续更新(代码片段)

写在前面我们在日常的工作当中需要各种手段来调试内存,尤其是在内存泄漏的情况下,我们需要一种手段来统计内存的使用去向,以确定内存使用不合理的方向。或者物理内存有限的情况下,需要对内存进行优... 查看详情

linux内存从0到1学习笔记(9.10内存优化调试之panic_on_oom介绍

通过配置/proc/sys/vm/panic_on_oom文件节点可以使能或禁用out-of-memory的panic。接下来我分享下在对该节点功能及代码架构的学习笔记;一,简介文件节点路径:/proc/sys/vm/panic_on_oom相关变量:vm.panic_on_oom该节点有三个值,分别是0,1,2... 查看详情