Skip to content

Commit f6845b0

Browse files
committed
userspace: llext: enable cache for loadable modules
Modules, loaded via LLEXT and running in userspace should have all their sections mapped with enabled cache. This fixes performance degradation in userspace with DP. Signed-off-by: Guennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
1 parent ac805f1 commit f6845b0

File tree

1 file changed

+17
-14
lines changed

1 file changed

+17
-14
lines changed

src/library_manager/llext_manager.c

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -787,21 +787,21 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
787787
size_t data_size = mctx->segment[LIB_MANAGER_DATA].size;
788788

789789
int ret = llext_manager_add_partition(domain, va_base_text, text_size,
790-
K_MEM_PARTITION_P_RX_U_RX);
790+
K_MEM_PARTITION_P_RX_U_RX | XTENSA_MMU_CACHED_WB);
791791

792792
if (ret < 0)
793793
return ret;
794794

795795
if (rodata_size) {
796796
ret = llext_manager_add_partition(domain, va_base_rodata, rodata_size,
797-
K_MEM_PARTITION_P_RO_U_RO);
797+
K_MEM_PARTITION_P_RO_U_RO | XTENSA_MMU_CACHED_WB);
798798
if (ret < 0)
799799
goto e_text;
800800
}
801801

802802
if (data_size) {
803803
ret = llext_manager_add_partition(domain, va_base_data, data_size,
804-
K_MEM_PARTITION_P_RW_U_RW);
804+
K_MEM_PARTITION_P_RW_U_RW | XTENSA_MMU_CACHED_WB);
805805
if (ret < 0)
806806
goto e_rodata;
807807
}
@@ -864,7 +864,7 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
864864
shdr_cold.sh_size, (uintptr_t)text_addr + text_offset);
865865
ret = llext_manager_add_partition(domain, (uintptr_t)text_addr + text_offset,
866866
shdr_cold.sh_size,
867-
K_MEM_PARTITION_P_RX_U_RX);
867+
K_MEM_PARTITION_P_RX_U_RX | XTENSA_MMU_CACHED_WB);
868868
if (ret < 0)
869869
goto e_data;
870870
mctx->segment[LIB_MANAGER_COLD].addr = (uintptr_t)text_addr + text_offset;
@@ -876,7 +876,7 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
876876
shdr_coldrodata.sh_size, (uintptr_t)rodata_addr + rodata_offset);
877877
ret = llext_manager_add_partition(domain, (uintptr_t)rodata_addr + rodata_offset,
878878
shdr_coldrodata.sh_size,
879-
K_MEM_PARTITION_P_RO_U_RO);
879+
K_MEM_PARTITION_P_RO_U_RO | XTENSA_MMU_CACHED_WB);
880880
if (ret < 0)
881881
goto e_cold;
882882
mctx->segment[LIB_MANAGER_COLDRODATA].addr = (uintptr_t)rodata_addr + rodata_offset;
@@ -887,15 +887,18 @@ int llext_manager_add_domain(const uint32_t component_id, struct k_mem_domain *d
887887

888888
e_cold:
889889
llext_manager_rm_partition(domain, (uintptr_t)text_addr + text_offset, shdr_cold.sh_size,
890-
K_MEM_PARTITION_P_RX_U_RX);
890+
K_MEM_PARTITION_P_RX_U_RX | XTENSA_MMU_CACHED_WB);
891891
mctx->segment[LIB_MANAGER_COLD].addr = 0;
892892
mctx->segment[LIB_MANAGER_COLD].size = 0;
893893
e_data:
894-
llext_manager_rm_partition(domain, va_base_data, data_size, K_MEM_PARTITION_P_RW_U_RW);
894+
llext_manager_rm_partition(domain, va_base_data, data_size,
895+
K_MEM_PARTITION_P_RW_U_RW | XTENSA_MMU_CACHED_WB);
895896
e_rodata:
896-
llext_manager_rm_partition(domain, va_base_rodata, rodata_size, K_MEM_PARTITION_P_RO_U_RO);
897+
llext_manager_rm_partition(domain, va_base_rodata, rodata_size,
898+
K_MEM_PARTITION_P_RO_U_RO | XTENSA_MMU_CACHED_WB);
897899
e_text:
898-
llext_manager_rm_partition(domain, va_base_text, text_size, K_MEM_PARTITION_P_RX_U_RX);
900+
llext_manager_rm_partition(domain, va_base_text, text_size,
901+
K_MEM_PARTITION_P_RX_U_RX | XTENSA_MMU_CACHED_WB);
899902
return ret;
900903
}
901904

@@ -920,14 +923,14 @@ int llext_manager_rm_domain(const uint32_t component_id, struct k_mem_domain *do
920923
size_t data_size = mctx->segment[LIB_MANAGER_DATA].size;
921924

922925
int err, ret = llext_manager_rm_partition(domain, va_base_text, text_size,
923-
K_MEM_PARTITION_P_RX_U_RX);
926+
K_MEM_PARTITION_P_RX_U_RX | XTENSA_MMU_CACHED_WB);
924927

925928
if (ret < 0)
926929
tr_err(&lib_manager_tr, "failed to remove .text memory partition: %d", ret);
927930

928931
if (rodata_size) {
929932
err = llext_manager_rm_partition(domain, va_base_rodata, rodata_size,
930-
K_MEM_PARTITION_P_RO_U_RO);
933+
K_MEM_PARTITION_P_RO_U_RO | XTENSA_MMU_CACHED_WB);
931934
if (err < 0) {
932935
tr_err(&lib_manager_tr, "failed to remove .rodata memory partition: %d",
933936
err);
@@ -938,7 +941,7 @@ int llext_manager_rm_domain(const uint32_t component_id, struct k_mem_domain *do
938941

939942
if (data_size) {
940943
err = llext_manager_rm_partition(domain, va_base_data, data_size,
941-
K_MEM_PARTITION_P_RW_U_RW);
944+
K_MEM_PARTITION_P_RW_U_RW | XTENSA_MMU_CACHED_WB);
942945
if (err < 0) {
943946
tr_err(&lib_manager_tr, "failed to remove .data memory partition: %d", err);
944947
if (!ret)
@@ -950,7 +953,7 @@ int llext_manager_rm_domain(const uint32_t component_id, struct k_mem_domain *do
950953
err = llext_manager_rm_partition(domain,
951954
mctx->segment[LIB_MANAGER_COLD].addr,
952955
mctx->segment[LIB_MANAGER_COLD].size,
953-
K_MEM_PARTITION_P_RX_U_RX);
956+
K_MEM_PARTITION_P_RX_U_RX | XTENSA_MMU_CACHED_WB);
954957
if (err < 0) {
955958
tr_err(&lib_manager_tr, "failed to remove .cold memory partition: %d", err);
956959
if (!ret)
@@ -962,7 +965,7 @@ int llext_manager_rm_domain(const uint32_t component_id, struct k_mem_domain *do
962965
err = llext_manager_rm_partition(domain,
963966
mctx->segment[LIB_MANAGER_COLDRODATA].addr,
964967
mctx->segment[LIB_MANAGER_COLDRODATA].size,
965-
K_MEM_PARTITION_P_RO_U_RO);
968+
K_MEM_PARTITION_P_RO_U_RO | XTENSA_MMU_CACHED_WB);
966969
if (err < 0) {
967970
tr_err(&lib_manager_tr,
968971
"failed to remove .coldrodata memory partition: %d", err);

0 commit comments

Comments
 (0)