源码来源:https://armkeil.blob.core.windows.net/developer/Files/downloads/mali-drivers/kernel/mali-valhall-gpu/VX504X08X-SW-99002-r41p0-01eac0.tar

这篇文章详解 kbase_ioctl 中的 KBASE_IOCTL_MEM_ALLOC_EX 命令。最新的 mali GPU 支持了 CSF,因此这篇的讲解基于 MALI_USE_CSF 使能的配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static long kbase_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
{
void __user *uarg = (void __user *)arg;
...;
switch (cmd) {
#if MALI_USE_CSF
case KBASE_IOCTL_MEM_ALLOC_EX:
KBASE_HANDLE_IOCTL_INOUT(KBASE_IOCTL_MEM_ALLOC_EX, kbase_api_mem_alloc_ex,
union kbase_ioctl_mem_alloc_ex, kctx);
break;
#endif
...;
}
...;
}

KBASE_HANDLE_IOCTL_INOUT 表示 KBASE_IOCTL_MEM_ALLOC_EX 是有输入并且有输出的 cmd,输入输出都是 uarg。在 KBASE_HANDLE_IOCTL_INOUT 中先将 uarg 通过 copy_from_user(&param, uarg, sizeof(param)); 拷贝到一个临时变量 union kbase_ioctl_mem_alloc_ex param 中,然后调用 ret = kbase_api_mem_alloc_ex(kctx, param);,再调用 copy_to_user(uarg, &param, sizeof(param));param 拷贝到 uarg 中,最终返回 ret(如果在两处 copy 中出错,则返回 -EFAULT)。

阅读全文 »

在 kernel 的开发调试过程中,经常需要知道这个 page 的某个 page flag 在哪条路径被 Set、被 Clear 了。甚至是在项目死机问题 debug 上,由于 page 不知道在哪里不合时宜地被 mlock 了,被 lock 住了,单纯地看代码可能比较难看出设置 page flag 的路径在哪,除非是对代码很熟悉,甚至需要对同事的代码比较熟悉,知道哪位同事之前有某个需求用了一种“奇怪”的方式来实现,然后你可以灵光一闪想到这个死机问题没准和这个同事的修改有关。不过大部分情况我们是没有这个灵光一闪的,那就需要特别的 debug 手段了。page_owner 很适合这种场景。

阅读全文 »
0%