diff options
| author | Zhao Yan <yan.y.zhao@intel.com> | 2018-08-01 00:15:09 -0400 |
|---|---|---|
| committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2018-08-02 01:27:09 -0400 |
| commit | db47685da1d8224f0eaa35c32e1a1ea97b05bae0 (patch) | |
| tree | bda95c8b610763468b3f387ec5ac2b92a6b530b5 /drivers | |
| parent | 279ce5d117078ee8ea40c40199399889981fd808 (diff) | |
drm/i915/gvt: add a fastpath for cmd parsing on MI_NOOP
MI_NOOP is a common command appearing in almost all command buffers, put it
into a fastpath can improve perfomance, especially in command buffers
contains lots of MI_NOOPs (0s).
Take glmark2 as an example, 3% performance increase is observed after
introduced this patch. Meanwhile, in case where abundant in MI_NOOPs,
up to 12% performance increase is measured.
v2: use lowercase for index of MI_NOOP in cmd_info (zhenyu wang)
Signed-off-by: Li Weinan <weinan.z.li@intel.com>
Signed-off-by: Zhao Yan <yan.y.zhao@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gpu/drm/i915/gvt/cmd_parser.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/gvt/cmd_parser.c b/drivers/gpu/drm/i915/gvt/cmd_parser.c index 0dd88fe2e39a..4ba503ef5d2c 100644 --- a/drivers/gpu/drm/i915/gvt/cmd_parser.c +++ b/drivers/gpu/drm/i915/gvt/cmd_parser.c | |||
| @@ -1817,6 +1817,8 @@ static int cmd_handler_mi_batch_buffer_start(struct parser_exec_state *s) | |||
| 1817 | return ret; | 1817 | return ret; |
| 1818 | } | 1818 | } |
| 1819 | 1819 | ||
| 1820 | static int mi_noop_index; | ||
| 1821 | |||
| 1820 | static struct cmd_info cmd_info[] = { | 1822 | static struct cmd_info cmd_info[] = { |
| 1821 | {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL}, | 1823 | {"MI_NOOP", OP_MI_NOOP, F_LEN_CONST, R_ALL, D_ALL, 0, 1, NULL}, |
| 1822 | 1824 | ||
| @@ -2502,7 +2504,12 @@ static int cmd_parser_exec(struct parser_exec_state *s) | |||
| 2502 | 2504 | ||
| 2503 | cmd = cmd_val(s, 0); | 2505 | cmd = cmd_val(s, 0); |
| 2504 | 2506 | ||
| 2505 | info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id); | 2507 | /* fastpath for MI_NOOP */ |
| 2508 | if (cmd == MI_NOOP) | ||
| 2509 | info = &cmd_info[mi_noop_index]; | ||
| 2510 | else | ||
| 2511 | info = get_cmd_info(s->vgpu->gvt, cmd, s->ring_id); | ||
| 2512 | |||
| 2506 | if (info == NULL) { | 2513 | if (info == NULL) { |
| 2507 | gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n", | 2514 | gvt_vgpu_err("unknown cmd 0x%x, opcode=0x%x, addr_type=%s, ring %d, workload=%p\n", |
| 2508 | cmd, get_opcode(cmd, s->ring_id), | 2515 | cmd, get_opcode(cmd, s->ring_id), |
| @@ -2904,6 +2911,8 @@ static int init_cmd_table(struct intel_gvt *gvt) | |||
| 2904 | info->name); | 2911 | info->name); |
| 2905 | return -EEXIST; | 2912 | return -EEXIST; |
| 2906 | } | 2913 | } |
| 2914 | if (cmd_info[i].opcode == OP_MI_NOOP) | ||
| 2915 | mi_noop_index = i; | ||
| 2907 | 2916 | ||
| 2908 | INIT_HLIST_NODE(&e->hlist); | 2917 | INIT_HLIST_NODE(&e->hlist); |
| 2909 | add_cmd_entry(gvt, e); | 2918 | add_cmd_entry(gvt, e); |
