Skip to content

Commit 57b427a

Browse files
drm/i915/guc: Speed up GuC log dumps
Add support for telling the debugfs interface the size of the GuC log dump in advance. Without that, the underlying framework keeps calling the 'show' function with larger and larger buffer allocations until it fits. That means reading the log from graphics memory many times - 16 times with the full 18MB log size. v2: Don't return error codes from size query. Report overflow in the error dump as well (review feedback from Daniele). Signed-off-by: John Harrison <John.C.Harrison@Intel.com> Reviewed-by: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20211211065859.2248188-2-John.C.Harrison@Intel.com
1 parent 9606ca2 commit 57b427a

2 files changed

Lines changed: 71 additions & 8 deletions

File tree

drivers/gpu/drm/i915/gt/intel_gt_debugfs.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,7 @@
1010

1111
struct intel_gt;
1212

13-
#define DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE(__name) \
14-
static int __name ## _open(struct inode *inode, struct file *file) \
15-
{ \
16-
return single_open(file, __name ## _show, inode->i_private); \
17-
} \
13+
#define __GT_DEBUGFS_ATTRIBUTE_FOPS(__name) \
1814
static const struct file_operations __name ## _fops = { \
1915
.owner = THIS_MODULE, \
2016
.open = __name ## _open, \
@@ -23,6 +19,21 @@ static const struct file_operations __name ## _fops = { \
2319
.release = single_release, \
2420
}
2521

22+
#define DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE(__name) \
23+
static int __name ## _open(struct inode *inode, struct file *file) \
24+
{ \
25+
return single_open(file, __name ## _show, inode->i_private); \
26+
} \
27+
__GT_DEBUGFS_ATTRIBUTE_FOPS(__name)
28+
29+
#define DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE_WITH_SIZE(__name, __size_vf) \
30+
static int __name ## _open(struct inode *inode, struct file *file) \
31+
{ \
32+
return single_open_size(file, __name ## _show, inode->i_private, \
33+
__size_vf(inode->i_private)); \
34+
} \
35+
__GT_DEBUGFS_ATTRIBUTE_FOPS(__name)
36+
2637
void intel_gt_debugfs_register(struct intel_gt *gt);
2738

2839
struct intel_gt_debugfs_file {

drivers/gpu/drm/i915/gt/uc/intel_guc_log_debugfs.c

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,74 @@
1010
#include "intel_guc.h"
1111
#include "intel_guc_log.h"
1212
#include "intel_guc_log_debugfs.h"
13+
#include "intel_uc.h"
14+
15+
static u32 obj_to_guc_log_dump_size(struct drm_i915_gem_object *obj)
16+
{
17+
u32 size;
18+
19+
if (!obj)
20+
return PAGE_SIZE;
21+
22+
/* "0x%08x 0x%08x 0x%08x 0x%08x\n" => 16 bytes -> 44 chars => x2.75 */
23+
size = ((obj->base.size * 11) + 3) / 4;
24+
25+
/* Add padding for final blank line, any extra header info, etc. */
26+
size = PAGE_ALIGN(size + PAGE_SIZE);
27+
28+
return size;
29+
}
30+
31+
static u32 guc_log_dump_size(struct intel_guc_log *log)
32+
{
33+
struct intel_guc *guc = log_to_guc(log);
34+
35+
if (!intel_guc_is_supported(guc))
36+
return PAGE_SIZE;
37+
38+
if (!log->vma)
39+
return PAGE_SIZE;
40+
41+
return obj_to_guc_log_dump_size(log->vma->obj);
42+
}
1343

1444
static int guc_log_dump_show(struct seq_file *m, void *data)
1545
{
1646
struct drm_printer p = drm_seq_file_printer(m);
47+
int ret;
1748

18-
return intel_guc_log_dump(m->private, &p, false);
49+
ret = intel_guc_log_dump(m->private, &p, false);
50+
51+
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) && seq_has_overflowed(m))
52+
pr_warn_once("preallocated size:%zx for %s exceeded\n",
53+
m->size, __func__);
54+
55+
return ret;
56+
}
57+
DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE_WITH_SIZE(guc_log_dump, guc_log_dump_size);
58+
59+
static u32 guc_load_err_dump_size(struct intel_guc_log *log)
60+
{
61+
struct intel_guc *guc = log_to_guc(log);
62+
struct intel_uc *uc = container_of(guc, struct intel_uc, guc);
63+
64+
if (!intel_guc_is_supported(guc))
65+
return PAGE_SIZE;
66+
67+
return obj_to_guc_log_dump_size(uc->load_err_log);
1968
}
20-
DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE(guc_log_dump);
2169

2270
static int guc_load_err_log_dump_show(struct seq_file *m, void *data)
2371
{
2472
struct drm_printer p = drm_seq_file_printer(m);
2573

74+
if (IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM) && seq_has_overflowed(m))
75+
pr_warn_once("preallocated size:%zx for %s exceeded\n",
76+
m->size, __func__);
77+
2678
return intel_guc_log_dump(m->private, &p, true);
2779
}
28-
DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE(guc_load_err_log_dump);
80+
DEFINE_INTEL_GT_DEBUGFS_ATTRIBUTE_WITH_SIZE(guc_load_err_log_dump, guc_load_err_dump_size);
2981

3082
static int guc_log_level_get(void *data, u64 *val)
3183
{

0 commit comments

Comments
 (0)