experimentation

This commit is contained in:
Zhengyi Chen 2024-02-23 14:06:42 +00:00
parent d53a605774
commit 552d6f9b73
2 changed files with 62 additions and 5 deletions

View file

@ -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_of_vma = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
size_t nr_pages_offset = vma->vm_pgoff; size_t nr_pages_offset = vma->vm_pgoff;
struct my_shmem_page *entry; 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); mutex_lock(&my_shmem_pages_mtx);
list_for_each_entry(entry, &my_shmem_pages, list) { 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", pr_info("[%s] Before flush: 0x%px has 0x%lx [+%ld].\n",
__func__, (void *) kvaddr_bgn, *(ulong *) kvaddr_bgn, __func__, (void *) kvaddr_bgn, *(ulong *) kvaddr_bgn,
sizeof(ulong)); sizeof(ulong));
clean_time_bgn = ktime_get_ns(); __dcache_clean_poc_dbg(kvaddr_bgn, kvaddr_end, &runtime);
__dcache_clean_poc(kvaddr_bgn, kvaddr_end);
clean_time_end = ktime_get_ns();
pr_info("[%s] After flush: 0x%px has 0x%lx [+%ld]. Runtime: %lldns.\n", pr_info("[%s] After flush: 0x%px has 0x%lx [+%ld]. Runtime: %lldns.\n",
__func__, (void *) kvaddr_bgn, *(ulong *) kvaddr_bgn, __func__, (void *) kvaddr_bgn, *(ulong *) kvaddr_bgn,
sizeof(ulong), clean_time_end - clean_time_bgn); sizeof(ulong), runtime);
put_page(pg); put_page(pg);

View file

@ -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 <asm/cache.h>
#include <asm/tlbflush.h>
+#include <asm/cacheflush_extra.h>
+
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,