From ac2ffac8d4aade216cc361c6c7120c13a8780719 Mon Sep 17 00:00:00 2001 From: "Soon, Thean Siew" Date: Thu, 28 Dec 2023 18:42:59 +0000 Subject: [PATCH 08/12] Limit INTEL MEDIA ALLOC MODE to MTL and ARL only Upstream-Status: Submitted [https://github.com/intel/media-driver/pull/1754] Signed-off-by: Soon, Thean Siew --- .../common/os/i915/include/mos_bufmgr_api.h | 1 + .../common/os/i915/include/mos_bufmgr_priv.h | 2 +- .../linux/common/os/i915/mos_bufmgr.c | 69 +++++++++++++++---- .../linux/common/os/i915/mos_bufmgr_api.c | 19 +++++ .../os/i915_production/mos_bufmgr_priv.h | 1 + .../common/os/mos_context_specific_next.cpp | 36 +++++----- 6 files changed, 94 insertions(+), 34 deletions(-) diff --git a/media_softlet/linux/common/os/i915/include/mos_bufmgr_api.h b/media_softlet/linux/common/os/i915/include/mos_bufmgr_api.h index 71cc01099..ab4f1ba89 100644 --- a/media_softlet/linux/common/os/i915/include/mos_bufmgr_api.h +++ b/media_softlet/linux/common/os/i915/include/mos_bufmgr_api.h @@ -299,6 +299,7 @@ void mos_bufmgr_enable_vmbind(struct mos_bufmgr *bufmgr); void mos_bufmgr_disable_object_capture(struct mos_bufmgr *bufmgr); int mos_bufmgr_get_memory_info(struct mos_bufmgr *bufmgr, char *info, uint32_t length); int mos_bufmgr_get_devid(struct mos_bufmgr *bufmgr); +void mos_bufmgr_realloc_cache(struct mos_bufmgr *bufmgr, uint8_t alloc_mode); int mos_bo_map_unsynchronized(struct mos_linux_bo *bo); int mos_bo_map_gtt(struct mos_linux_bo *bo); diff --git a/media_softlet/linux/common/os/i915/include/mos_bufmgr_priv.h b/media_softlet/linux/common/os/i915/include/mos_bufmgr_priv.h index 63f69f985..6fd58f827 100644 --- a/media_softlet/linux/common/os/i915/include/mos_bufmgr_priv.h +++ b/media_softlet/linux/common/os/i915/include/mos_bufmgr_priv.h @@ -358,9 +358,9 @@ struct mos_bufmgr { void (*disable_object_capture)(struct mos_bufmgr *bufmgr) = nullptr; int (*get_memory_info)(struct mos_bufmgr *bufmgr, char *info, uint32_t length) = nullptr; int (*get_devid)(struct mos_bufmgr *bufmgr) = nullptr; + void (*realloc_cache)(struct mos_bufmgr *bufmgr, uint8_t alloc_mode) = nullptr; int (*query_engines_count)(struct mos_bufmgr *bufmgr, unsigned int *nengine) = nullptr; - int (*query_engines)(struct mos_bufmgr *bufmgr, __u16 engine_class, __u64 caps, diff --git a/media_softlet/linux/common/os/i915/mos_bufmgr.c b/media_softlet/linux/common/os/i915/mos_bufmgr.c index b623d0129..2814ddbb7 100644 --- a/media_softlet/linux/common/os/i915/mos_bufmgr.c +++ b/media_softlet/linux/common/os/i915/mos_bufmgr.c @@ -2426,19 +2426,9 @@ mos_gem_bo_start_gtt_access(struct mos_linux_bo *bo, int write_enable) } static void -mos_bufmgr_gem_destroy(struct mos_bufmgr *bufmgr) +mos_bufmgr_cleanup_cache(struct mos_bufmgr_gem *bufmgr_gem) { - struct mos_bufmgr_gem *bufmgr_gem = (struct mos_bufmgr_gem *) bufmgr; - struct drm_gem_close close_bo; - int i, ret; - - free(bufmgr_gem->exec2_objects); - free(bufmgr_gem->exec_objects); - free(bufmgr_gem->exec_bos); - pthread_mutex_destroy(&bufmgr_gem->lock); - - /* Free any cached buffer objects we were going to reuse */ - for (i = 0; i < bufmgr_gem->num_buckets; i++) { + for (int i = 0; i < bufmgr_gem->num_buckets; i++) { struct mos_gem_bo_bucket *bucket = &bufmgr_gem->cache_bucket[i]; struct mos_bo_gem *bo_gem; @@ -2450,7 +2440,25 @@ mos_bufmgr_gem_destroy(struct mos_bufmgr *bufmgr) mos_gem_bo_free(&bo_gem->bo); } + bufmgr_gem->cache_bucket[i].size = 0; } + bufmgr_gem->num_buckets = 0; +} + +static void +mos_bufmgr_gem_destroy(struct mos_bufmgr *bufmgr) +{ + struct mos_bufmgr_gem *bufmgr_gem = (struct mos_bufmgr_gem *)bufmgr; + struct drm_gem_close close_bo; + int ret; + + free(bufmgr_gem->exec2_objects); + free(bufmgr_gem->exec_objects); + free(bufmgr_gem->exec_bos); + pthread_mutex_destroy(&bufmgr_gem->lock); + + /* Free any cached buffer objects we were going to reuse */ + mos_bufmgr_cleanup_cache(bufmgr_gem); /* Release userptr bo kept hanging around for optimisation. */ if (bufmgr_gem->userptr_active.ptr) { @@ -3852,9 +3860,41 @@ add_bucket(struct mos_bufmgr_gem *bufmgr_gem, int size) } static void -init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem, uint8_t alloc_mode) +init_cache_buckets(struct mos_bufmgr_gem *bufmgr_gem) +{ + unsigned long size, cache_max_size = 64 * 1024 * 1024; + + /* OK, so power of two buckets was too wasteful of memory. + * Give 3 other sizes between each power of two, to hopefully + * cover things accurately enough. (The alternative is + * probably to just go for exact matching of sizes, and assume + * that for things like composited window resize the tiled + * width/height alignment and rounding of sizes to pages will + * get us useful cache hit rates anyway) + */ + add_bucket(bufmgr_gem, 4096); + add_bucket(bufmgr_gem, 4096 * 2); + add_bucket(bufmgr_gem, 4096 * 3); + + /* Initialize the linked lists for BO reuse cache. */ + for (size = 4 * 4096; size <= cache_max_size; size *= 2) { + add_bucket(bufmgr_gem, size); + + add_bucket(bufmgr_gem, size + size * 1 / 4); + add_bucket(bufmgr_gem, size + size * 2 / 4); + add_bucket(bufmgr_gem, size + size * 3 / 4); + } +} + +static void +mos_gem_realloc_cache(struct mos_bufmgr *bufmgr, uint8_t alloc_mode) { unsigned long size, cache_max_size = 64 * 1024 * 1024, unit_size; + struct mos_bufmgr_gem *bufmgr_gem = (struct mos_bufmgr_gem *)bufmgr; + + // Clean up the pre-allocated cache before re-allocating according + // to alloc_mode + mos_bufmgr_cleanup_cache(bufmgr_gem); /* OK, so power of two buckets was too wasteful of memory. * Give 3 other sizes between each power of two, to hopefully @@ -5218,6 +5258,7 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size) bufmgr_gem->bufmgr.disable_object_capture = mos_gem_disable_object_capture; bufmgr_gem->bufmgr.get_memory_info = mos_gem_get_memory_info; bufmgr_gem->bufmgr.get_devid = mos_gem_get_devid; + bufmgr_gem->bufmgr.realloc_cache = mos_gem_realloc_cache; bufmgr_gem->bufmgr.set_context_param = mos_gem_set_context_param; bufmgr_gem->bufmgr.set_context_param_parallel = mos_gem_set_context_param_parallel; bufmgr_gem->bufmgr.set_context_param_load_balance = mos_gem_set_context_param_load_balance; @@ -5404,7 +5445,7 @@ mos_bufmgr_gem_init_i915(int fd, int batch_size) bufmgr_gem->max_relocs = batch_size / sizeof(uint32_t) / 2 - 2; DRMINITLISTHEAD(&bufmgr_gem->named); - init_cache_buckets(bufmgr_gem,alloc_mode); + init_cache_buckets(bufmgr_gem); DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list); diff --git a/media_softlet/linux/common/os/i915/mos_bufmgr_api.c b/media_softlet/linux/common/os/i915/mos_bufmgr_api.c index abe8ef96a..d0e02c267 100644 --- a/media_softlet/linux/common/os/i915/mos_bufmgr_api.c +++ b/media_softlet/linux/common/os/i915/mos_bufmgr_api.c @@ -1204,6 +1204,25 @@ mos_bufmgr_get_devid(struct mos_bufmgr *bufmgr) } } +void +mos_bufmgr_realloc_cache(struct mos_bufmgr *bufmgr, uint8_t alloc_mode) +{ + if(!bufmgr) + { + MOS_OS_CRITICALMESSAGE("Input null ptr\n"); + return; + } + + if (bufmgr->realloc_cache) + { + return bufmgr->realloc_cache(bufmgr, alloc_mode); + } + else + { + MOS_OS_CRITICALMESSAGE("Unsupported\n"); + } +} + int mos_query_engines_count(struct mos_bufmgr *bufmgr, unsigned int *nengine) diff --git a/media_softlet/linux/common/os/i915_production/mos_bufmgr_priv.h b/media_softlet/linux/common/os/i915_production/mos_bufmgr_priv.h index c3b765a4c..1d7f7edb0 100644 --- a/media_softlet/linux/common/os/i915_production/mos_bufmgr_priv.h +++ b/media_softlet/linux/common/os/i915_production/mos_bufmgr_priv.h @@ -358,6 +358,7 @@ struct mos_bufmgr { void (*disable_object_capture)(struct mos_bufmgr *bufmgr) = nullptr; int (*get_memory_info)(struct mos_bufmgr *bufmgr, char *info, uint32_t length) = nullptr; int (*get_devid)(struct mos_bufmgr *bufmgr) = nullptr; + void (*realloc_cache)(struct mos_bufmgr *bufmgr, uint8_t alloc_mode) = nullptr; int (*query_engines_count)(struct mos_bufmgr *bufmgr, unsigned int *nengine) = nullptr; diff --git a/media_softlet/linux/common/os/mos_context_specific_next.cpp b/media_softlet/linux/common/os/mos_context_specific_next.cpp index 543e262d1..87059f538 100644 --- a/media_softlet/linux/common/os/mos_context_specific_next.cpp +++ b/media_softlet/linux/common/os/mos_context_specific_next.cpp @@ -90,25 +90,7 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext) userSettingPtr = MosInterface::MosGetUserSettingInstance(osDriverContext); - mode = BATCH_BUFFER_SIZE; - ReadUserSetting( - userSettingPtr, - value, - "INTEL MEDIA ALLOC MODE", - MediaUserSetting::Group::Device); - - if (value) - { - mode |= (value & 0x000000ff); - } - value = 0; - /* no need to set batch buffer size after switch to softpin - * keep it, just for test during relocation to softpin transition - * now , it could be a debug method , but is actually useless - * so it is safe to reuse the lowest 8bit to convey addtional information - * more suitable solution is deleting it , or add additional parameter*/ - - m_bufmgr = mos_bufmgr_gem_init(m_fd, (int)mode, &m_deviceType); + m_bufmgr = mos_bufmgr_gem_init(m_fd, BATCH_BUFFER_SIZE, &m_deviceType); if (nullptr == m_bufmgr) { MOS_OS_ASSERTMESSAGE("Not able to allocate buffer manager, fd=0x%d", m_fd); @@ -151,6 +133,22 @@ MOS_STATUS OsContextSpecificNext::Init(DDI_DEVICE_CONTEXT ddiDriverContext) return eStatus; } + if (m_platformInfo.eProductFamily == IGFX_METEORLAKE || + m_platformInfo.eProductFamily == IGFX_ARROWLAKE) + { + ReadUserSetting( + userSettingPtr, + value, + "INTEL MEDIA ALLOC MODE", + MediaUserSetting::Group::Device); + + if (value) + { + mode = (value & 0x000000ff); + } + mos_bufmgr_realloc_cache(m_bufmgr, mode); + } + ReadUserSetting( userSettingPtr, value, -- 2.40.1