Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openeuler
Kernel
提交
e1e9db2c
K
Kernel
项目概览
openeuler
/
Kernel
1 年多 前同步成功
通知
8
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
e1e9db2c
编写于
5月 27, 2016
作者:
R
Rob Clark
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
drm/msm: wire up vmap shrinker
Signed-off-by:
N
Rob Clark
<
robdclark@gmail.com
>
上级
18f23049
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
72 addition
and
5 deletion
+72
-5
drivers/gpu/drm/msm/msm_drv.h
drivers/gpu/drm/msm/msm_drv.h
+2
-0
drivers/gpu/drm/msm/msm_gem.c
drivers/gpu/drm/msm/msm_gem.c
+20
-5
drivers/gpu/drm/msm/msm_gem.h
drivers/gpu/drm/msm/msm_gem.h
+10
-0
drivers/gpu/drm/msm/msm_gem_shrinker.c
drivers/gpu/drm/msm/msm_gem_shrinker.c
+40
-0
未找到文件。
drivers/gpu/drm/msm/msm_drv.h
浏览文件 @
e1e9db2c
...
...
@@ -153,6 +153,7 @@ struct msm_drm_private {
struct
drm_mm
mm
;
}
vram
;
struct
notifier_block
vmap_notifier
;
struct
shrinker
shrinker
;
struct
msm_vblank_ctrl
vblank_ctrl
;
...
...
@@ -206,6 +207,7 @@ void msm_gem_put_vaddr_locked(struct drm_gem_object *obj);
void
msm_gem_put_vaddr
(
struct
drm_gem_object
*
obj
);
int
msm_gem_madvise
(
struct
drm_gem_object
*
obj
,
unsigned
madv
);
void
msm_gem_purge
(
struct
drm_gem_object
*
obj
);
void
msm_gem_vunmap
(
struct
drm_gem_object
*
obj
);
int
msm_gem_sync_object
(
struct
drm_gem_object
*
obj
,
struct
msm_fence_context
*
fctx
,
bool
exclusive
);
void
msm_gem_move_to_active
(
struct
drm_gem_object
*
obj
,
...
...
drivers/gpu/drm/msm/msm_gem.c
浏览文件 @
e1e9db2c
...
...
@@ -421,6 +421,7 @@ void *msm_gem_get_vaddr_locked(struct drm_gem_object *obj)
if
(
msm_obj
->
vaddr
==
NULL
)
return
ERR_PTR
(
-
ENOMEM
);
}
msm_obj
->
vmap_count
++
;
return
msm_obj
->
vaddr
;
}
...
...
@@ -435,13 +436,17 @@ void *msm_gem_get_vaddr(struct drm_gem_object *obj)
void
msm_gem_put_vaddr_locked
(
struct
drm_gem_object
*
obj
)
{
struct
msm_gem_object
*
msm_obj
=
to_msm_bo
(
obj
);
WARN_ON
(
!
mutex_is_locked
(
&
obj
->
dev
->
struct_mutex
));
/* no-op for now */
WARN_ON
(
msm_obj
->
vmap_count
<
1
);
msm_obj
->
vmap_count
--
;
}
void
msm_gem_put_vaddr
(
struct
drm_gem_object
*
obj
)
{
/* no-op for now */
mutex_lock
(
&
obj
->
dev
->
struct_mutex
);
msm_gem_put_vaddr_locked
(
obj
);
mutex_unlock
(
&
obj
->
dev
->
struct_mutex
);
}
/* Update madvise status, returns true if not purged, else
...
...
@@ -470,8 +475,7 @@ void msm_gem_purge(struct drm_gem_object *obj)
put_iova
(
obj
);
vunmap
(
msm_obj
->
vaddr
);
msm_obj
->
vaddr
=
NULL
;
msm_gem_vunmap
(
obj
);
put_pages
(
obj
);
...
...
@@ -491,6 +495,17 @@ void msm_gem_purge(struct drm_gem_object *obj)
0
,
(
loff_t
)
-
1
);
}
void
msm_gem_vunmap
(
struct
drm_gem_object
*
obj
)
{
struct
msm_gem_object
*
msm_obj
=
to_msm_bo
(
obj
);
if
(
!
msm_obj
->
vaddr
||
WARN_ON
(
!
is_vunmapable
(
msm_obj
)))
return
;
vunmap
(
msm_obj
->
vaddr
);
msm_obj
->
vaddr
=
NULL
;
}
/* must be called before _move_to_active().. */
int
msm_gem_sync_object
(
struct
drm_gem_object
*
obj
,
struct
msm_fence_context
*
fctx
,
bool
exclusive
)
...
...
@@ -694,7 +709,7 @@ void msm_gem_free_object(struct drm_gem_object *obj)
drm_prime_gem_destroy
(
obj
,
msm_obj
->
sgt
);
}
else
{
vunmap
(
msm_obj
->
vaddr
);
msm_gem_vunmap
(
obj
);
put_pages
(
obj
);
}
...
...
drivers/gpu/drm/msm/msm_gem.h
浏览文件 @
e1e9db2c
...
...
@@ -34,6 +34,11 @@ struct msm_gem_object {
*/
uint8_t
madv
;
/**
* count of active vmap'ing
*/
uint8_t
vmap_count
;
/* And object is either:
* inactive - on priv->inactive_list
* active - on one one of the gpu's active_list.. well, at
...
...
@@ -83,6 +88,11 @@ static inline bool is_purgeable(struct msm_gem_object *msm_obj)
!
msm_obj
->
base
.
dma_buf
&&
!
msm_obj
->
base
.
import_attach
;
}
static
inline
bool
is_vunmapable
(
struct
msm_gem_object
*
msm_obj
)
{
return
(
msm_obj
->
vmap_count
==
0
)
&&
msm_obj
->
vaddr
;
}
#define MAX_CMDS 4
/* Created per submit-ioctl, to track bo's and cmdstream bufs, etc,
...
...
drivers/gpu/drm/msm/msm_gem_shrinker.c
浏览文件 @
e1e9db2c
...
...
@@ -100,6 +100,42 @@ msm_gem_shrinker_scan(struct shrinker *shrinker, struct shrink_control *sc)
return
freed
;
}
static
int
msm_gem_shrinker_vmap
(
struct
notifier_block
*
nb
,
unsigned
long
event
,
void
*
ptr
)
{
struct
msm_drm_private
*
priv
=
container_of
(
nb
,
struct
msm_drm_private
,
vmap_notifier
);
struct
drm_device
*
dev
=
priv
->
dev
;
struct
msm_gem_object
*
msm_obj
;
unsigned
unmapped
=
0
;
bool
unlock
;
if
(
!
msm_gem_shrinker_lock
(
dev
,
&
unlock
))
return
NOTIFY_DONE
;
list_for_each_entry
(
msm_obj
,
&
priv
->
inactive_list
,
mm_list
)
{
if
(
is_vunmapable
(
msm_obj
))
{
msm_gem_vunmap
(
&
msm_obj
->
base
);
/* since we don't know any better, lets bail after a few
* and if necessary the shrinker will be invoked again.
* Seems better than unmapping *everything*
*/
if
(
++
unmapped
>=
15
)
break
;
}
}
if
(
unlock
)
mutex_unlock
(
&
dev
->
struct_mutex
);
*
(
unsigned
long
*
)
ptr
+=
unmapped
;
if
(
unmapped
>
0
)
pr_info_ratelimited
(
"Purging %u vmaps
\n
"
,
unmapped
);
return
NOTIFY_DONE
;
}
/**
* msm_gem_shrinker_init - Initialize msm shrinker
* @dev_priv: msm device
...
...
@@ -113,6 +149,9 @@ void msm_gem_shrinker_init(struct drm_device *dev)
priv
->
shrinker
.
scan_objects
=
msm_gem_shrinker_scan
;
priv
->
shrinker
.
seeks
=
DEFAULT_SEEKS
;
WARN_ON
(
register_shrinker
(
&
priv
->
shrinker
));
priv
->
vmap_notifier
.
notifier_call
=
msm_gem_shrinker_vmap
;
WARN_ON
(
register_vmap_purge_notifier
(
&
priv
->
vmap_notifier
));
}
/**
...
...
@@ -124,5 +163,6 @@ void msm_gem_shrinker_init(struct drm_device *dev)
void
msm_gem_shrinker_cleanup
(
struct
drm_device
*
dev
)
{
struct
msm_drm_private
*
priv
=
dev
->
dev_private
;
WARN_ON
(
unregister_vmap_purge_notifier
(
&
priv
->
vmap_notifier
));
unregister_shrinker
(
&
priv
->
shrinker
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录