From 552d6f9b7341c9352568658cb3efcf0ec57efc18 Mon Sep 17 00:00:00 2001 From: rubberhead Date: Fri, 23 Feb 2024 14:06:42 +0000 Subject: [PATCH] experimentation --- src/aarch64-linux-flush-dcache/my_shmem.c | 9 ++- .../0000-export-dcache-clean-poc-dbg.patch | 58 +++++++++++++++++++ 2 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 src/patch/0000-export-dcache-clean-poc-dbg.patch diff --git a/src/aarch64-linux-flush-dcache/my_shmem.c b/src/aarch64-linux-flush-dcache/my_shmem.c index eb00830..965a8b2 100644 --- a/src/aarch64-linux-flush-dcache/my_shmem.c +++ b/src/aarch64-linux-flush-dcache/my_shmem.c @@ -59,7 +59,8 @@ static void my_shmem_vmops_close(struct vm_area_struct *vma) size_t nr_pages_of_vma = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; size_t nr_pages_offset = vma->vm_pgoff; struct my_shmem_page *entry; - u64 clean_time_bgn, clean_time_end; + // u64 clean_time_bgn, clean_time_end; + u64 runtime; mutex_lock(&my_shmem_pages_mtx); list_for_each_entry(entry, &my_shmem_pages, list) { @@ -82,12 +83,10 @@ static void my_shmem_vmops_close(struct vm_area_struct *vma) pr_info("[%s] Before flush: 0x%px has 0x%lx [+%ld].\n", __func__, (void *) kvaddr_bgn, *(ulong *) kvaddr_bgn, sizeof(ulong)); - clean_time_bgn = ktime_get_ns(); - __dcache_clean_poc(kvaddr_bgn, kvaddr_end); - clean_time_end = ktime_get_ns(); + __dcache_clean_poc_dbg(kvaddr_bgn, kvaddr_end, &runtime); pr_info("[%s] After flush: 0x%px has 0x%lx [+%ld]. Runtime: %lldns.\n", __func__, (void *) kvaddr_bgn, *(ulong *) kvaddr_bgn, - sizeof(ulong), clean_time_end - clean_time_bgn); + sizeof(ulong), runtime); put_page(pg); diff --git a/src/patch/0000-export-dcache-clean-poc-dbg.patch b/src/patch/0000-export-dcache-clean-poc-dbg.patch new file mode 100644 index 0000000..89b4e0d --- /dev/null +++ b/src/patch/0000-export-dcache-clean-poc-dbg.patch @@ -0,0 +1,58 @@ +diff --git a/arch/arm64/include/asm/cacheflush_extra.h b/arch/arm64/include/asm/cacheflush_extra.h +new file mode 100644 +index 000000000000..98eadccbcde4 +--- /dev/null ++++ b/arch/arm64/include/asm/cacheflush_extra.h +@@ -0,0 +1,13 @@ ++/* ++ * Get dcache_clean|inval_poc out to driverland! ++ */ ++ ++#ifndef __ASM_CACHEFLUSH_EX_H ++#define __ASM_CACHEFLUSH_EX_H ++ ++/* Ref. cacheflush.h */ ++extern void __dcache_clean_poc(unsigned long start, unsigned long end); ++extern void __dcache_clean_poc_dbg( ++ unsigned long start, unsigned long end, unsigned long long *runtime); ++ ++#endif /* __ASM_CACHEFLUSH_EX_H */ +\ No newline at end of file +diff --git a/arch/arm64/mm/flush.c b/arch/arm64/mm/flush.c +index 013eead9b695..f8920b1187ef 100644 +--- a/arch/arm64/mm/flush.c ++++ b/arch/arm64/mm/flush.c +@@ -15,6 +15,8 @@ + #include + #include + ++#include ++ + void sync_icache_aliases(unsigned long start, unsigned long end) + { + if (icache_is_aliasing()) { +@@ -62,6 +64,24 @@ void __sync_icache_dcache(pte_t pte) + } + EXPORT_SYMBOL_GPL(__sync_icache_dcache); + ++void __dcache_clean_poc(ulong start, ulong end) ++{ ++ dcache_clean_poc(start, end); ++} ++EXPORT_SYMBOL(__dcache_clean_poc); ++ ++void __dcache_clean_poc_dbg(ulong start, ulong end, u64 *runtime) ++{ ++ u64 calltime, rettime; ++ ++ calltime = ktime_get_ns(); ++ dcache_clean_poc(start, end); ++ rettime = ktime_get_ns(); ++ ++ *runtime = rettime - calltime; ++} ++EXPORT_SYMBOL(__dcache_clean_poc_dbg); ++ + /* + * This function is called when a page has been modified by the kernel. Mark + * it as dirty for later flushing when mapped in user space (if executable,