diff --git a/arch/x86/include/asm/icc.h b/arch/x86/include/asm/icc.h index b3910e36..09c94634 100644 --- a/arch/x86/include/asm/icc.h +++ b/arch/x86/include/asm/icc.h @@ -42,20 +42,16 @@ extern bootinfo_t* bootinfo; enum icc_mail_requests { PING_REQ=1, PING_RESP, + SVM_REQUEST, NOISE, }; - -#define ICC_TAG_IP 0 -#define ICC_TAG_SVMREQUEST 1 -#define ICC_TAG_PINGREQUEST 2 -#define ICC_TAG_PINGRESPONSE 3 - int icc_init(void); int icc_halt(void); int icc_send_irq(int ue); void icc_mail_check(int irq); int icc_mail_ping(void); +int icc_send_gic_irq(int core_num); int icc_irq_ping(void); int icc_mail_ping_irq(void); int icc_mail_noise(void); diff --git a/arch/x86/mm/svm.c b/arch/x86/mm/svm.c index eb31c08c..f0b772d4 100644 --- a/arch/x86/mm/svm.c +++ b/arch/x86/mm/svm.c @@ -21,6 +21,7 @@ #include #include #include +#include #include #include #include @@ -121,17 +122,17 @@ int svm_access_request(size_t addr) //kprintf("send access request to %d of 0x%x\n", remote_rank, phyaddr); /* send ping request */ - iRCCE_mail_send(2*sizeof(size_t), ICC_TAG_SVMREQUEST, 0, payload, remote_rank); + iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank); request[remote_rank]++; NOP8; - icc_send_irq(remote_rank); + icc_send_gic_irq(remote_rank); /* check for incoming messages */ icc_mail_check(0); while (page_owner[pageid] != my_ue) { - NOP4; + check_workqueues_rem_irq(); } return change_page_permissions(addr, addr+PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE); @@ -229,10 +230,9 @@ int svm_emit_page(size_t phyaddr, int ue) ((size_t*) payload)[1] = phyaddr; /* send ping request */ - iRCCE_mail_send(2*sizeof(size_t), ICC_TAG_SVMREQUEST, 0, payload, remote_rank); - - NOP8; - icc_send_irq(remote_rank); + iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank); + /* send interrupt */ + icc_send_gic_irq(remote_rank); forward[remote_rank]++; } else { diff --git a/arch/x86/scc/icc.c b/arch/x86/scc/icc.c index 55670f93..6a415e13 100644 --- a/arch/x86/scc/icc.c +++ b/arch/x86/scc/icc.c @@ -273,7 +273,7 @@ int icc_send_gic_irq(int core_num) { return 0; } -int icc_irq_ping() +int icc_irq_ping(void) { if( my_ue == 2 ) return -1 ; icc_send_gic_irq(2); @@ -297,7 +297,11 @@ static inline void icc_mail_check_tag(iRCCE_MAIL_HEADER* mail) { case PING_REQ: iRCCE_mail_send(0, PING_RESP, 0, NULL, mail->source); break; - + + case SVM_REQUEST: + svm_emit_page(((size_t*) mail->payload)[1], ((size_t*) mail->payload)[0]); + break; + case NOISE: // kprintf( "XXX " ); default: @@ -307,7 +311,7 @@ static inline void icc_mail_check_tag(iRCCE_MAIL_HEADER* mail) { } -int icc_mail_ping( void ) +int icc_mail_ping(void) { uint32_t flags; uint64_t timer = 0; @@ -377,7 +381,7 @@ int icc_mail_ping( void ) } -int icc_mail_ping_irq( void ) +int icc_mail_ping_irq(void) { kprintf( "Hello from mail_ping_irq ... \n" ); /* return if not core A */ @@ -431,11 +435,10 @@ int icc_mail_ping_irq( void ) #define _iRQ_NOISE_ 0 -int icc_mail_noise() { +int icc_mail_noise(void) { int i, j, res; int num_ranks = RCCE_num_ues(); iRCCE_MAIL_HEADER* recv_mail = NULL; - int flags; // leave function if not participating if( !((my_ue == 4) || (my_ue == 2) || (my_ue == CORE_B)) ) { @@ -486,7 +489,7 @@ int icc_mail_noise() { void icc_mail_check(int irq) { iRCCE_MAIL_HEADER* header = NULL; - int i, source, res; + int source, res; volatile uint64_t* irq_status_reg = NULL; volatile uint64_t* irq_reset_reg = NULL; uint64_t irq_status = 0; @@ -531,8 +534,6 @@ void icc_mail_check(int irq) NOP8; NOP8; } - - } #endif diff --git a/kernel/syscall.c b/kernel/syscall.c index 611b721e..8f52a2d2 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -91,7 +91,7 @@ int syscall_handler(uint32_t sys_nr, ...) int ret = -EINVAL; va_list vl; -// check_workqueues(); + check_workqueues_rem_irq(); va_start(vl, sys_nr); diff --git a/kernel/tests.c b/kernel/tests.c index 0fd7cde9..29a4d104 100644 --- a/kernel/tests.c +++ b/kernel/tests.c @@ -104,10 +104,11 @@ static int foo(void* arg) #ifdef CONFIG_ROCKCREEK static int mail_ping(void* arg) { - // icc_mail_ping(); - icc_mail_ping_irq(); - // icc_irq_ping(); -// icc_halt(); + //icc_mail_ping(); + icc_mail_ping_irq(); + //icc_irq_ping(); + //icc_halt(); + return 0; } @@ -119,7 +120,7 @@ static int mail_noise(void*arg) { #define N 1024 //#define N 514 -#define LAZY +//#define LAZY volatile static int* A[N]; volatile static int* B[N]; @@ -168,7 +169,7 @@ static int svm_test(void *arg) end = rdtsc(); - kprintf("Calculation time (seq): %llu\n", end-start); + kprintf("Calculation time (seq): %llu ms (%llu ticks)\n", (end-start)/(1000ULL*get_cpu_frequency()), end-start); kfree(A[0], 3*N*N*sizeof(int)); } @@ -206,11 +207,9 @@ static int svm_test(void *arg) start = rdtsc(); start = rdtsc(); -#ifndef LAZY // Now, we need only read access on A and B change_page_permissions((size_t) A[0], (size_t) (A[0]+2*N*N), VMA_CACHEABLE|VMA_READ); RCCE_barrier(&RCCE_COMM_WORLD); -#endif // start calculation for(i=my_ue*(N/num_ues); i<(my_ue+1)*(N/num_ues); i++) @@ -241,7 +240,7 @@ static int svm_test(void *arg) RCCE_barrier(&RCCE_COMM_WORLD); - kprintf("Calculation time (par): %llu\n", end-start); + kprintf("Calculation time (par): %llu ms (%llu ticks)\n", (end-start)/(1000ULL*get_cpu_frequency()), end-start); svmfree((void*) A[0], 3*N*sizeof(int)); @@ -411,15 +410,15 @@ int test_init(void) // create_kernel_task(NULL,client_task,NULL); #endif - create_kernel_task(NULL, foo, "Hello from foo1", NORMAL_PRIO); - create_kernel_task(NULL, join_test, NULL, NORMAL_PRIO); + //create_kernel_task(NULL, foo, "Hello from foo1", NORMAL_PRIO); + //create_kernel_task(NULL, join_test, NULL, NORMAL_PRIO); //create_kernel_task(NULL, producer, , NORMAL_PRIO); //create_kernel_task(NULL, consumer, NULL, NORMAL_PRIO); //create_kernel_task(NULL, mail_ping, NULL, NORMAL_PRIO); //create_kernel_task(NULL, mail_noise, NULL, NORMAL_PRIO); - //create_kernel_task(NULL, svm_test, NULL, NORMAL_PRIO); + create_kernel_task(NULL, svm_test, NULL, NORMAL_PRIO); //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);