diff --git a/arch/x86/include/asm/svm.h b/arch/x86/include/asm/svm.h index f20e582d..cd2737ea 100644 --- a/arch/x86/include/asm/svm.h +++ b/arch/x86/include/asm/svm.h @@ -21,7 +21,6 @@ #define __ARCH_SVM_H__ #include -#include #ifdef CONFIG_ROCKCREEK #include #endif @@ -69,22 +68,32 @@ int svm_access_request(size_t addr); */ int svm_emit_page(size_t addr, int ue); +/* @brief invalidate the cache entries for all SVM regions + */ static inline void svm_invalidate(void) { asm volatile ( ".byte 0x0f; .byte 0x0a;\n" ); // CL1FLUSHMB } +/* *brief flushs the cache for all SVM regions + */ +#ifdef CONFIG_ROCKCREEK +#ifndef SVM_WB static inline void svm_flush(void) { -#ifdef CONFIG_ROCKCREEK // need to write to another line to make sure the write combine buffer gets flushed *(int *)RCCE_fool_write_combine_buffer = 1; -#endif -#ifdef SVM_WB - flush_cache(); -#endif } +#else +void svm_flush(void); +#endif +#endif +/* @brief dumps the some performance counters (e.g. numbers of page migrations) + * + * @retrun + * - 0 on success + */ int svm_statistics(void); #endif diff --git a/arch/x86/mm/svm.c b/arch/x86/mm/svm.c index 713c50eb..10a55d49 100644 --- a/arch/x86/mm/svm.c +++ b/arch/x86/mm/svm.c @@ -24,6 +24,7 @@ #include #include #include +#include #ifdef CONFIG_ROCKCREEK #include #include @@ -229,21 +230,42 @@ int svm_emit_page(size_t phyaddr, int ue) forward[remote_rank]++; } else { - size_t viraddr = phys2virt[(phyaddr - shmbegin) >> PAGE_SHIFT]; + size_t viraddr; svm_flush(); - change_page_permissions(viraddr, viraddr+PAGE_SIZE, VMA_NOACCESS|VMA_READ|VMA_CACHEABLE); - page_owner[pageid] = ue; - // need to write to another line to make sure the write combine buffer gets flushed - *(int *)RCCE_fool_write_combine_buffer = 1; emit[ue]++; + viraddr = phys2virt[(phyaddr - shmbegin) >> PAGE_SHIFT]; + change_page_permissions(viraddr, viraddr+PAGE_SIZE, VMA_NOACCESS|VMA_READ|VMA_CACHEABLE); } return 0; } +#ifdef SVM_WB +void svm_flush(void) +{ + int z, tmp; + + // need to write to another line to make sure the write combine buffer gets flushed + *(int *)RCCE_fool_write_combine_buffer = 1; + flush_cache(); + +#if 0 + // try to flush L2 cache + z = Z_PID(RC_COREID[my_ue]); + tmp=ReadConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1)); + tmp &= ~(1 << GLCFG_XFLSHNN_BIT); + SetConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1), tmp); + + while(!(ReadConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1)) & (1 << GLCFG_XFLSHNN_BIT))) { + NOP8; + } +#endif +} +#endif + int svm_statistics(void) { uint32_t i; diff --git a/arch/x86/scc/icc.c b/arch/x86/scc/icc.c index a1254138..1d3b4df7 100644 --- a/arch/x86/scc/icc.c +++ b/arch/x86/scc/icc.c @@ -164,9 +164,18 @@ int icc_init(void) // reset INTR/LINT0 flag z = Z_PID(RC_COREID[my_ue]); tmp=ReadConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1)); - tmp &= ~2; + tmp &= ~(1 << GLCFG_XINTR_BIT); SetConfigReg(CRB_OWN + (z==0 ? GLCFG0 : GLCFG1), tmp); +#if 0 + // disable L2 cache + z = Z_PID(RC_COREID[my_ue]); + tmp=ReadConfigReg(CRB_OWN + (z==0 ? L2CFG0 : L2CFG1)); + tmp |= (1 << L2CFG_WAYDISABLE_BIT); + SetConfigReg(CRB_OWN + (z==0 ? L2CFG0 : L2CFG1), tmp); + kprintf("set L2CFG to 0x%x\n", (uint32_t) tmp); +#endif + // set interrupt handler (INTR/LINT0) irq_install_handler(124, intr_handler); diff --git a/kernel/tests.c b/kernel/tests.c index efa081b5..7ad3c4f1 100644 --- a/kernel/tests.c +++ b/kernel/tests.c @@ -131,7 +131,7 @@ static int svm_test(void *arg) my_ue = RCCE_ue(); num_ues = RCCE_num_ues(); -#if 1 +#if 0 if (!my_ue) { // allocate and initialize SVM region A[0] = (int*) kmalloc(3*N*N*sizeof(int)); @@ -192,6 +192,7 @@ static int svm_test(void *arg) svm_flush(); + RCCE_barrier(&RCCE_COMM_WORLD); kputs("Start parallel calculation...\n"); start = rdtsc(); @@ -399,14 +400,14 @@ int test_init(void) // create_kernel_task(NULL,client_task,NULL); #endif - create_kernel_task(NULL, foo, "Hello from foo1"); - create_kernel_task(NULL, join_test, NULL); + //create_kernel_task(NULL, foo, "Hello from foo1"); + //create_kernel_task(NULL, join_test, NULL); //create_kernel_task(NULL, producer, NULL); //create_kernel_task(NULL, consumer, NULL); //create_kernel_task(NULL, mail_ping, NULL); - //create_kernel_task(NULL, svm_test, NULL); + create_kernel_task(NULL, svm_test, NULL); //create_user_task(NULL, "/bin/hello", argv); - create_user_task(NULL, "/bin/tests", argv); + //create_user_task(NULL, "/bin/tests", argv); //create_user_task(NULL, "/bin/jacobi", argv); //create_user_task(NULL, "/bin/jacobi", argv); //create_user_task(NULL, "/bin/server", server_argv);