Skip to content

Commit 5eafd46

Browse files
committed
llext: add a function to remove a memory domain
When a LLEXT module is freed, its partitioins should be removed from any memory domains. Add a function for that. Signed-off-by: Guennadi Liakhovetski <[email protected]>
1 parent ee6269f commit 5eafd46

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

src/include/sof/llext_manager.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ int llext_manager_free_module(const uint32_t component_id);
3131
int llext_manager_add_library(uint32_t module_id);
3232

3333
int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *domain);
34+
int llext_manager_rm_domain(const uint32_t component_id, struct k_mem_domain *domain);
3435

3536
bool comp_is_llext(struct comp_dev *comp);
3637
#else

src/library_manager/llext_manager.c

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -740,7 +740,6 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
740740
const uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id);
741741
const unsigned int mod_idx = llext_manager_mod_find(ctx, entry_index);
742742
struct lib_manager_module *mctx = ctx->mod + mod_idx;
743-
int ret;
744743

745744
/* Executable code (.text) */
746745
uintptr_t va_base_text = mctx->segment[LIB_MANAGER_TEXT].addr;
@@ -754,8 +753,9 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
754753
uintptr_t va_base_data = mctx->segment[LIB_MANAGER_DATA].addr;
755754
size_t data_size = mctx->segment[LIB_MANAGER_DATA].size;
756755

757-
ret = llext_manager_add_partition(domain, va_base_text, text_size,
758-
K_MEM_PARTITION_P_RX_U_RX);
756+
int ret = llext_manager_add_partition(domain, va_base_text, text_size,
757+
K_MEM_PARTITION_P_RX_U_RX);
758+
759759
if (ret < 0)
760760
return ret;
761761

@@ -775,6 +775,64 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
775775

776776
return 0;
777777
}
778+
779+
static int llext_manager_rm_partition(struct k_mem_domain *domain,
780+
uintptr_t addr, size_t size,
781+
k_mem_partition_attr_t attr)
782+
{
783+
size_t pre_pad_size = addr & (PAGE_SZ - 1);
784+
struct k_mem_partition part = {
785+
.start = addr - pre_pad_size,
786+
.size = ALIGN_UP(pre_pad_size + size, PAGE_SZ),
787+
.attr = attr,
788+
};
789+
790+
tr_dbg(&lib_manager_tr, "remove %#zx @ %lx partition", part.size, part.start);
791+
return k_mem_domain_remove_partition(domain, &part);
792+
}
793+
794+
int llext_manager_rm_domain(const uint32_t component_id, struct k_mem_domain *domain)
795+
{
796+
const uint32_t module_id = IPC4_MOD_ID(component_id);
797+
struct lib_manager_mod_ctx *ctx = lib_manager_get_mod_ctx(module_id);
798+
const uint32_t entry_index = LIB_MANAGER_GET_MODULE_INDEX(module_id);
799+
const unsigned int mod_idx = llext_manager_mod_find(ctx, entry_index);
800+
struct lib_manager_module *mctx = ctx->mod + mod_idx;
801+
802+
/* Executable code (.text) */
803+
uintptr_t va_base_text = mctx->segment[LIB_MANAGER_TEXT].addr;
804+
size_t text_size = mctx->segment[LIB_MANAGER_TEXT].size;
805+
806+
/* Read-only data (.rodata and others) */
807+
uintptr_t va_base_rodata = mctx->segment[LIB_MANAGER_RODATA].addr;
808+
size_t rodata_size = mctx->segment[LIB_MANAGER_RODATA].size;
809+
810+
/* Writable data (.data, .bss and others) */
811+
uintptr_t va_base_data = mctx->segment[LIB_MANAGER_DATA].addr;
812+
size_t data_size = mctx->segment[LIB_MANAGER_DATA].size;
813+
814+
int ret = llext_manager_rm_partition(domain, va_base_text, text_size,
815+
K_MEM_PARTITION_P_RX_U_RX);
816+
817+
if (ret < 0)
818+
return ret;
819+
820+
if (rodata_size) {
821+
ret = llext_manager_rm_partition(domain, va_base_rodata, rodata_size,
822+
K_MEM_PARTITION_P_RO_U_RO);
823+
if (ret < 0)
824+
return ret;
825+
}
826+
827+
if (data_size) {
828+
ret = llext_manager_rm_partition(domain, va_base_data, data_size,
829+
K_MEM_PARTITION_P_RW_U_RW);
830+
if (ret < 0)
831+
return ret;
832+
}
833+
834+
return 0;
835+
}
778836
#endif
779837

780838
int llext_manager_free_module(const uint32_t component_id)

0 commit comments

Comments
 (0)