first steps to realiz "affinity-on-first-touch"

This commit is contained in:
Stefan Lankes 2011-11-10 00:58:34 -08:00
parent e9cbe88e21
commit aba9731610

View file

@ -34,7 +34,7 @@
#include <asm/icc.h>
#include <asm/svm.h>
#define SHARED_PAGES ((4*RCCE_SHM_SIZE_MAX) >> PAGE_SHIFT)
#define SHARED_PAGES (4*(RCCE_SHM_SIZE_MAX >> PAGE_SHIFT))
#define OWNER_SIZE ((SHARED_PAGES * sizeof(uint8_t) + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1))
#define AIREG1 0
@ -157,9 +157,9 @@ int svm_init(void)
return -ENOMEM;
}
// per default is core 0 owner
// per default is no owner specified
if (!RCCE_IAM)
memset((void*)page_owner, 0x00, OWNER_SIZE);
memset((void*)page_owner, 0xFF, OWNER_SIZE);
// initialize svm barrier
incregs = (volatile atomic_increg_t*) map_region(0, 0xF900E000, 2, MAP_KERNEL_SPACE|MAP_NO_CACHE);
@ -198,6 +198,12 @@ int svm_access_request(size_t addr)
uint8_t payload[iRCCE_MAIL_HEADER_PAYLOAD];
int ret;
if (!phyaddr) {
kputs("Need new shared page\n");
while(1);
}
if (phyaddr < shmbegin)
return -EINVAL;
if (phyaddr >= shmbegin + RCCE_SHM_SIZE_MAX)
@ -212,7 +218,7 @@ int svm_access_request(size_t addr)
((size_t*) payload)[1] = phyaddr;
/* send ping request */
iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank);
iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, (char*) payload, remote_rank);
icc_send_gic_irq(remote_rank);
request[remote_rank]++;
@ -237,8 +243,9 @@ static atomic_int32_t size_counter = ATOMIC_INIT(0);
void* svm_malloc(size_t size, uint32_t consistency)
{
size_t phyaddr, viraddr, i;
uint32_t flags;
size_t viraddr;
//size_t phyaddr, viraddr, i;
//uint32_t flags;
uint32_t map_flags = MAP_KERNEL_SPACE;
if( !(consistency & SVM_L2) )
@ -248,12 +255,12 @@ void* svm_malloc(size_t size, uint32_t consistency)
map_flags |= MAP_SVM_STRONG;
else if (consistency & SVM_LAZYRELEASE)
map_flags |= MAP_SVM_LAZYRELEASE;
else return 0;
else return NULL;
// currently, we allocate memory in page size granulation
size = (size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
#if 1 // Workaround for our MARC paper
#if 0 // Workaround for our MARC paper
// iRCCE is not thread save => disable interrupts
flags = irq_nested_disable();
@ -302,7 +309,8 @@ void* svm_malloc(size_t size, uint32_t consistency)
kprintf("shmmalloc returns 0x%x\n", viraddr);
return (void*) viraddr;
#else
#endif
#if 0
// iRCCE is not thread save => disable interrupts
flags = irq_nested_disable();
phyaddr = (size_t) RCCE_shmalloc(size);
@ -326,16 +334,28 @@ void* svm_malloc(size_t size, uint32_t consistency)
return (void*) viraddr;
#endif
map_flags |= MAP_NO_ACCESS;
viraddr = map_region(0, 0, size >> PAGE_SHIFT, map_flags);
kprintf("svmmalloc: viraddr 0x%x, size 0x%x\n", viraddr, size);
return (void*) viraddr;
}
void svm_free(void* addr, size_t size)
{
size_t phyaddr, i;
uint32_t flags;
//size_t phyaddr, i;
//uint32_t flags;
if (BUILTIN_EXPECT(!addr || !size, 0))
return;
// TODO: free is currently not implemented
return;
#if 0
phyaddr = virt_to_phys((size_t) addr);
// currently, we allocate memory in page size granulation
@ -351,6 +371,7 @@ void svm_free(void* addr, size_t size)
flags = irq_nested_disable();
RCCE_shfree((t_vcharp) phyaddr);
irq_nested_enable(flags);
#endif
}
/*
@ -382,7 +403,7 @@ int svm_emit_page(size_t phyaddr, int ue)
((size_t*) payload)[1] = phyaddr;
/* send ping request */
iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank);
iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, (char*)payload, remote_rank);
/* send interrupt */
icc_send_gic_irq(remote_rank);