Integration of Simon's mailbox system into the SVM subsystem
This commit is contained in:
parent
a8cfbf3e93
commit
5f4c1f8aaa
5 changed files with 32 additions and 36 deletions
|
@ -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);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <metalsvm/stdio.h>
|
||||
#include <metalsvm/stdlib.h>
|
||||
#include <metalsvm/mmu.h>
|
||||
#include <metalsvm/tasks.h>
|
||||
#include <metalsvm/page.h>
|
||||
#include <metalsvm/errno.h>
|
||||
#include <asm/irqflags.h>
|
||||
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Add table
Reference in a new issue