From 7f0abd9048b6fbe54a500cbe89ebdf749877113c Mon Sep 17 00:00:00 2001 From: Rob Clark Date: Thu, 22 Apr 2021 11:09:56 -0700 Subject: [PATCH] freedreno/drm: Cleanup bo allocation flags Most of them were actually unused. The memory type (KMEM vs SMI) only applied to very old a2xx era devices that had a small/fast stacked memory (SMI) vs normal memory (KMEM). And the cache flags are ignored (ie. everything is writecombine), but we can add new cache flags later when they actually do something. Signed-off-by: Rob Clark Part-of: --- src/freedreno/computerator/a6xx.c | 5 ++--- src/freedreno/computerator/ir3_asm.c | 4 +--- src/freedreno/computerator/main.c | 3 +-- src/freedreno/drm/freedreno_bo.c | 2 +- src/freedreno/drm/freedreno_drmif.h | 15 ++++----------- src/freedreno/drm/msm_bo.c | 4 ++-- src/gallium/drivers/freedreno/a2xx/fd2_gmem.c | 3 +-- src/gallium/drivers/freedreno/a3xx/fd3_context.c | 6 +++--- src/gallium/drivers/freedreno/a3xx/fd3_gmem.c | 2 +- src/gallium/drivers/freedreno/a4xx/fd4_context.c | 6 +++--- src/gallium/drivers/freedreno/a4xx/fd4_gmem.c | 2 +- src/gallium/drivers/freedreno/a5xx/fd5_context.c | 4 ++-- src/gallium/drivers/freedreno/a5xx/fd5_gmem.c | 2 +- src/gallium/drivers/freedreno/a5xx/fd5_resource.c | 4 +--- src/gallium/drivers/freedreno/a6xx/fd6_context.c | 2 +- src/gallium/drivers/freedreno/a6xx/fd6_gmem.c | 8 ++++---- src/gallium/drivers/freedreno/a6xx/fd6_program.c | 2 +- src/gallium/drivers/freedreno/a6xx/fd6_resource.c | 4 +--- .../drivers/freedreno/freedreno_autotune.c | 2 +- .../drivers/freedreno/freedreno_resource.c | 3 +-- src/gallium/drivers/freedreno/ir3/ir3_gallium.c | 3 +-- 21 files changed, 34 insertions(+), 52 deletions(-) diff --git a/src/freedreno/computerator/a6xx.c b/src/freedreno/computerator/a6xx.c index e31745ac427..069d2496c2a 100644 --- a/src/freedreno/computerator/a6xx.c +++ b/src/freedreno/computerator/a6xx.c @@ -389,8 +389,7 @@ a6xx_emit_grid(struct kernel *kernel, uint32_t grid[3], if (a6xx_backend->num_perfcntrs > 0) { a6xx_backend->query_mem = fd_bo_new( a6xx_backend->dev, - a6xx_backend->num_perfcntrs * sizeof(struct fd6_query_sample), - DRM_FREEDRENO_GEM_TYPE_KMEM, "query"); + a6xx_backend->num_perfcntrs * sizeof(struct fd6_query_sample), 0, "query"); /* configure the performance counters to count the requested * countables: @@ -489,7 +488,7 @@ a6xx_init(struct fd_device *dev, uint32_t gpu_id) a6xx_backend->dev = dev; a6xx_backend->control_mem = - fd_bo_new(dev, 0x1000, DRM_FREEDRENO_GEM_TYPE_KMEM, "control"); + fd_bo_new(dev, 0x1000, 0, "control"); return &a6xx_backend->base; } diff --git a/src/freedreno/computerator/ir3_asm.c b/src/freedreno/computerator/ir3_asm.c index 0a57c37ca05..efca35e83f5 100644 --- a/src/freedreno/computerator/ir3_asm.c +++ b/src/freedreno/computerator/ir3_asm.c @@ -49,9 +49,7 @@ ir3_asm_assemble(struct ir3_compiler *c, FILE *in) unsigned sz = v->info.size; - v->bo = fd_bo_new(c->dev, sz, - DRM_FREEDRENO_GEM_CACHE_WCOMBINE | DRM_FREEDRENO_GEM_TYPE_KMEM, - "%s", ir3_shader_stage(v)); + v->bo = fd_bo_new(c->dev, sz, 0, "%s", ir3_shader_stage(v)); memcpy(fd_bo_map(v->bo), kernel->bin, sz); diff --git a/src/freedreno/computerator/main.c b/src/freedreno/computerator/main.c index 626139a751e..f4969c81f17 100644 --- a/src/freedreno/computerator/main.c +++ b/src/freedreno/computerator/main.c @@ -263,8 +263,7 @@ main(int argc, char **argv) kernel->local_size[2]); for (int i = 0; i < kernel->num_bufs; i++) { printf("buf[%d]: size=%u\n", i, kernel->buf_sizes[i]); - kernel->bufs[i] = fd_bo_new(dev, kernel->buf_sizes[i] * 4, - DRM_FREEDRENO_GEM_TYPE_KMEM, "buf[%d]", i); + kernel->bufs[i] = fd_bo_new(dev, kernel->buf_sizes[i] * 4, 0, "buf[%d]", i); } if (disasm) diff --git a/src/freedreno/drm/freedreno_bo.c b/src/freedreno/drm/freedreno_bo.c index 2d0407120b0..f7adb452cb4 100644 --- a/src/freedreno/drm/freedreno_bo.c +++ b/src/freedreno/drm/freedreno_bo.c @@ -134,7 +134,7 @@ _fd_bo_set_name(struct fd_bo *bo, const char *fmt, va_list ap) struct fd_bo * fd_bo_new_ring(struct fd_device *dev, uint32_t size) { - uint32_t flags = DRM_FREEDRENO_GEM_GPUREADONLY; + uint32_t flags = FD_BO_GPUREADONLY; struct fd_bo *bo = bo_new(dev, size, flags, &dev->ring_cache); if (bo) { bo->bo_reuse = RING_CACHE; diff --git a/src/freedreno/drm/freedreno_drmif.h b/src/freedreno/drm/freedreno_drmif.h index b243dc1cdb2..52b323aa0b1 100644 --- a/src/freedreno/drm/freedreno_drmif.h +++ b/src/freedreno/drm/freedreno_drmif.h @@ -29,6 +29,7 @@ #include +#include "util/bitset.h" #include "util/u_debug.h" #ifdef __cplusplus @@ -63,17 +64,9 @@ enum fd_param_id { }; /* bo flags: */ -#define DRM_FREEDRENO_GEM_TYPE_SMI 0x00000001 -#define DRM_FREEDRENO_GEM_TYPE_KMEM 0x00000002 -#define DRM_FREEDRENO_GEM_TYPE_MEM_MASK 0x0000000f -#define DRM_FREEDRENO_GEM_CACHE_NONE 0x00000000 -#define DRM_FREEDRENO_GEM_CACHE_WCOMBINE 0x00100000 -#define DRM_FREEDRENO_GEM_CACHE_WTHROUGH 0x00200000 -#define DRM_FREEDRENO_GEM_CACHE_WBACK 0x00400000 -#define DRM_FREEDRENO_GEM_CACHE_WBACKWA 0x00800000 -#define DRM_FREEDRENO_GEM_CACHE_MASK 0x00f00000 -#define DRM_FREEDRENO_GEM_GPUREADONLY 0x01000000 -#define DRM_FREEDRENO_GEM_SCANOUT 0x02000000 +#define FD_BO_GPUREADONLY BITSET_BIT(1) +#define FD_BO_SCANOUT BITSET_BIT(2) +/* Default caching is WRITECOMBINE, we can add new bo flags later for cached/etc */ /* bo access flags: (keep aligned to MSM_PREP_x) */ #define DRM_FREEDRENO_PREP_READ 0x01 diff --git a/src/freedreno/drm/msm_bo.c b/src/freedreno/drm/msm_bo.c index 57d25adf3e0..3f43793648d 100644 --- a/src/freedreno/drm/msm_bo.c +++ b/src/freedreno/drm/msm_bo.c @@ -174,10 +174,10 @@ msm_bo_new_handle(struct fd_device *dev, uint32_t size, uint32_t flags, }; int ret; - if (flags & DRM_FREEDRENO_GEM_SCANOUT) + if (flags & FD_BO_SCANOUT) req.flags |= MSM_BO_SCANOUT; - if (flags & DRM_FREEDRENO_GEM_GPUREADONLY) + if (flags & FD_BO_GPUREADONLY) req.flags |= MSM_BO_GPU_READONLY; ret = drmCommandWriteRead(dev->fd, DRM_MSM_GEM_NEW, &req, sizeof(req)); diff --git a/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c b/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c index c427bd1fec6..3c241a6a395 100644 --- a/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c +++ b/src/gallium/drivers/freedreno/a2xx/fd2_gmem.c @@ -602,8 +602,7 @@ fd2_emit_tile_init(struct fd_batch *batch) assert_dt if (ctx->vsc_pipe_bo[i]) fd_bo_del(ctx->vsc_pipe_bo[i]); ctx->vsc_pipe_bo[i] = - fd_bo_new(ctx->dev, bo_size, DRM_FREEDRENO_GEM_TYPE_KMEM, - "vsc_pipe[%u]", i); + fd_bo_new(ctx->dev, bo_size, 0, "vsc_pipe[%u]", i); assert(ctx->vsc_pipe_bo[i]); } diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_context.c b/src/gallium/drivers/freedreno/a3xx/fd3_context.c index 43aa86e19bc..d85ed792927 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_context.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_context.c @@ -107,13 +107,13 @@ fd3_context_create(struct pipe_screen *pscreen, void *priv, fd_hw_query_init(pctx); fd3_ctx->vs_pvt_mem = - fd_bo_new(screen->dev, 0x2000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vs_pvt"); + fd_bo_new(screen->dev, 0x2000, 0, "vs_pvt"); fd3_ctx->fs_pvt_mem = - fd_bo_new(screen->dev, 0x2000, DRM_FREEDRENO_GEM_TYPE_KMEM, "fs_pvt"); + fd_bo_new(screen->dev, 0x2000, 0, "fs_pvt"); fd3_ctx->vsc_size_mem = - fd_bo_new(screen->dev, 0x1000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size"); + fd_bo_new(screen->dev, 0x1000, 0, "vsc_size"); fd_context_setup_common_vbos(&fd3_ctx->base); diff --git a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c index afa409ef68c..114363155f2 100644 --- a/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c +++ b/src/gallium/drivers/freedreno/a3xx/fd3_gmem.c @@ -806,7 +806,7 @@ update_vsc_pipe(struct fd_batch *batch) assert_dt if (!ctx->vsc_pipe_bo[i]) { ctx->vsc_pipe_bo[i] = fd_bo_new( - ctx->dev, 0x40000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i); + ctx->dev, 0x40000, 0, "vsc_pipe[%u]", i); } OUT_PKT0(ring, REG_A3XX_VSC_PIPE(i), 3); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_context.c b/src/gallium/drivers/freedreno/a4xx/fd4_context.c index dcfc2a2708b..6074fbc2306 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_context.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_context.c @@ -107,13 +107,13 @@ fd4_context_create(struct pipe_screen *pscreen, void *priv, fd_hw_query_init(pctx); fd4_ctx->vs_pvt_mem = - fd_bo_new(screen->dev, 0x2000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vs_pvt"); + fd_bo_new(screen->dev, 0x2000, 0, "vs_pvt"); fd4_ctx->fs_pvt_mem = - fd_bo_new(screen->dev, 0x2000, DRM_FREEDRENO_GEM_TYPE_KMEM, "fs_pvt"); + fd_bo_new(screen->dev, 0x2000, 0, "fs_pvt"); fd4_ctx->vsc_size_mem = - fd_bo_new(screen->dev, 0x1000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size"); + fd_bo_new(screen->dev, 0x1000, 0, "vsc_size"); fd_context_setup_common_vbos(&fd4_ctx->base); diff --git a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c index 157dc1e5629..e139de73bd4 100644 --- a/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c +++ b/src/gallium/drivers/freedreno/a4xx/fd4_gmem.c @@ -587,7 +587,7 @@ update_vsc_pipe(struct fd_batch *batch) assert_dt for (i = 0; i < 8; i++) { if (!ctx->vsc_pipe_bo[i]) { ctx->vsc_pipe_bo[i] = fd_bo_new( - ctx->dev, 0x40000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i); + ctx->dev, 0x40000, 0, "vsc_pipe[%u]", i); } OUT_RELOC(ring, ctx->vsc_pipe_bo[i], 0, 0, 0); /* VSC_PIPE_DATA_ADDRESS[i] */ diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_context.c b/src/gallium/drivers/freedreno/a5xx/fd5_context.c index 763efc8e797..2eddc0df890 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_context.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_context.c @@ -110,10 +110,10 @@ fd5_context_create(struct pipe_screen *pscreen, void *priv, util_blitter_set_texture_multisample(fd5_ctx->base.blitter, true); fd5_ctx->vsc_size_mem = - fd_bo_new(screen->dev, 0x1000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_size"); + fd_bo_new(screen->dev, 0x1000, 0, "vsc_size"); fd5_ctx->blit_mem = - fd_bo_new(screen->dev, 0x1000, DRM_FREEDRENO_GEM_TYPE_KMEM, "blit"); + fd_bo_new(screen->dev, 0x1000, 0, "blit"); fd_context_setup_common_vbos(&fd5_ctx->base); diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c index 7aa5e97da50..786cee985aa 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_gmem.c @@ -291,7 +291,7 @@ update_vsc_pipe(struct fd_batch *batch) assert_dt for (i = 0; i < 16; i++) { if (!ctx->vsc_pipe_bo[i]) { ctx->vsc_pipe_bo[i] = fd_bo_new( - ctx->dev, 0x20000, DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_pipe[%u]", i); + ctx->dev, 0x20000, 0, "vsc_pipe[%u]", i); } OUT_RELOC(ring, ctx->vsc_pipe_bo[i], 0, 0, 0); /* VSC_PIPE_DATA_ADDRESS[i].LO/HI */ diff --git a/src/gallium/drivers/freedreno/a5xx/fd5_resource.c b/src/gallium/drivers/freedreno/a5xx/fd5_resource.c index 8a04c3d9a82..0aaa3e02135 100644 --- a/src/gallium/drivers/freedreno/a5xx/fd5_resource.c +++ b/src/gallium/drivers/freedreno/a5xx/fd5_resource.c @@ -30,8 +30,6 @@ static void setup_lrz(struct fd_resource *rsc) { struct fd_screen *screen = fd_screen(rsc->b.b.screen); - const uint32_t flags = - DRM_FREEDRENO_GEM_CACHE_WCOMBINE | DRM_FREEDRENO_GEM_TYPE_KMEM; /* TODO */ unsigned lrz_pitch = align(DIV_ROUND_UP(rsc->b.b.width0, 8), 64); unsigned lrz_height = DIV_ROUND_UP(rsc->b.b.height0, 8); @@ -51,7 +49,7 @@ setup_lrz(struct fd_resource *rsc) rsc->lrz_height = lrz_height; rsc->lrz_width = lrz_pitch; rsc->lrz_pitch = lrz_pitch; - rsc->lrz = fd_bo_new(screen->dev, size, flags, "lrz"); + rsc->lrz = fd_bo_new(screen->dev, size, 0, "lrz"); } uint32_t diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_context.c b/src/gallium/drivers/freedreno/a6xx/fd6_context.c index c03b652ad56..24eb8e8befb 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_context.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_context.c @@ -241,7 +241,7 @@ fd6_context_create(struct pipe_screen *pscreen, void *priv, fd6_ctx->vsc_prim_strm_pitch = 0x1040; fd6_ctx->control_mem = - fd_bo_new(screen->dev, 0x1000, DRM_FREEDRENO_GEM_TYPE_KMEM, "control"); + fd_bo_new(screen->dev, 0x1000, 0, "control"); memset(fd_bo_map(fd6_ctx->control_mem), 0, sizeof(struct fd6_control)); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c index 40d9cafee31..250b5ed7d8e 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_gmem.c @@ -335,13 +335,13 @@ update_vsc_pipe(struct fd_batch *batch) if (!fd6_ctx->vsc_draw_strm) { fd6_ctx->vsc_draw_strm = fd_bo_new( ctx->screen->dev, VSC_DRAW_STRM_SIZE(fd6_ctx->vsc_draw_strm_pitch), - DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_draw_strm"); + 0, "vsc_draw_strm"); } if (!fd6_ctx->vsc_prim_strm) { fd6_ctx->vsc_prim_strm = fd_bo_new( ctx->screen->dev, VSC_PRIM_STRM_SIZE(fd6_ctx->vsc_prim_strm_pitch), - DRM_FREEDRENO_GEM_TYPE_KMEM, "vsc_prim_strm"); + 0, "vsc_prim_strm"); } OUT_REG( @@ -1443,10 +1443,10 @@ setup_tess_buffers(struct fd_batch *batch, struct fd_ringbuffer *ring) struct fd_context *ctx = batch->ctx; batch->tessfactor_bo = fd_bo_new(ctx->screen->dev, batch->tessfactor_size, - DRM_FREEDRENO_GEM_TYPE_KMEM, "tessfactor"); + 0, "tessfactor"); batch->tessparam_bo = fd_bo_new(ctx->screen->dev, batch->tessparam_size, - DRM_FREEDRENO_GEM_TYPE_KMEM, "tessparam"); + 0, "tessparam"); OUT_PKT4(ring, REG_A6XX_PC_TESSFACTOR_ADDR, 2); OUT_RELOC(ring, batch->tessfactor_bo, 0, 0, 0); diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_program.c b/src/gallium/drivers/freedreno/a6xx/fd6_program.c index 97a000be9b0..067ecbd0702 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_program.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_program.c @@ -107,7 +107,7 @@ fd6_emit_shader(struct fd_context *ctx, struct fd_ringbuffer *ring, uint32_t total_size = ALIGN(per_fiber_size * fibers_per_sp, 1 << 12) * num_sp_cores; ctx->pvtmem[so->pvtmem_per_wave].bo = fd_bo_new( - ctx->screen->dev, total_size, DRM_FREEDRENO_GEM_TYPE_KMEM, + ctx->screen->dev, total_size, 0, "pvtmem_%s_%d", so->pvtmem_per_wave ? "per_wave" : "per_fiber", per_fiber_size); } else { diff --git a/src/gallium/drivers/freedreno/a6xx/fd6_resource.c b/src/gallium/drivers/freedreno/a6xx/fd6_resource.c index 460fdc8fa46..86d45a07b89 100644 --- a/src/gallium/drivers/freedreno/a6xx/fd6_resource.c +++ b/src/gallium/drivers/freedreno/a6xx/fd6_resource.c @@ -132,8 +132,6 @@ static void setup_lrz(struct fd_resource *rsc) { struct fd_screen *screen = fd_screen(rsc->b.b.screen); - const uint32_t flags = - DRM_FREEDRENO_GEM_CACHE_WCOMBINE | DRM_FREEDRENO_GEM_TYPE_KMEM; /* TODO */ unsigned width0 = rsc->b.b.width0; unsigned height0 = rsc->b.b.height0; @@ -154,7 +152,7 @@ setup_lrz(struct fd_resource *rsc) rsc->lrz_height = lrz_height; rsc->lrz_width = lrz_pitch; rsc->lrz_pitch = lrz_pitch; - rsc->lrz = fd_bo_new(screen->dev, size, flags, "lrz"); + rsc->lrz = fd_bo_new(screen->dev, size, 0, "lrz"); } static uint32_t diff --git a/src/gallium/drivers/freedreno/freedreno_autotune.c b/src/gallium/drivers/freedreno/freedreno_autotune.c index f2a8384075c..9f25307f768 100644 --- a/src/gallium/drivers/freedreno/freedreno_autotune.c +++ b/src/gallium/drivers/freedreno/freedreno_autotune.c @@ -251,7 +251,7 @@ fd_autotune_init(struct fd_autotune *at, struct fd_device *dev) list_inithead(&at->lru); at->results_mem = fd_bo_new(dev, sizeof(struct fd_autotune_results), - DRM_FREEDRENO_GEM_TYPE_KMEM, "autotune"); + 0, "autotune"); at->results = fd_bo_map(at->results_mem); list_inithead(&at->pending_results); diff --git a/src/gallium/drivers/freedreno/freedreno_resource.c b/src/gallium/drivers/freedreno/freedreno_resource.c index bac3e71c939..385db856190 100644 --- a/src/gallium/drivers/freedreno/freedreno_resource.c +++ b/src/gallium/drivers/freedreno/freedreno_resource.c @@ -196,8 +196,7 @@ realloc_bo(struct fd_resource *rsc, uint32_t size) struct pipe_resource *prsc = &rsc->b.b; struct fd_screen *screen = fd_screen(rsc->b.b.screen); uint32_t flags = - DRM_FREEDRENO_GEM_CACHE_WCOMBINE | DRM_FREEDRENO_GEM_TYPE_KMEM | - COND(prsc->bind & PIPE_BIND_SCANOUT, DRM_FREEDRENO_GEM_SCANOUT); + COND(prsc->bind & PIPE_BIND_SCANOUT, FD_BO_SCANOUT); /* TODO other flags? */ /* if we start using things other than write-combine, diff --git a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c index ee3b4b437ee..719bd1d6f2f 100644 --- a/src/gallium/drivers/freedreno/ir3/ir3_gallium.c +++ b/src/gallium/drivers/freedreno/ir3/ir3_gallium.c @@ -105,8 +105,7 @@ upload_shader_variant(struct ir3_shader_variant *v) assert(!v->bo); v->bo = - fd_bo_new(compiler->dev, v->info.size, - DRM_FREEDRENO_GEM_CACHE_WCOMBINE | DRM_FREEDRENO_GEM_TYPE_KMEM, + fd_bo_new(compiler->dev, v->info.size, 0, "%s:%s", ir3_shader_stage(v), info->name); /* Always include shaders in kernel crash dumps. */