first steps to realiz "affinity-on-first-touch"
This commit is contained in:
parent
e9cbe88e21
commit
aba9731610
1 changed files with 33 additions and 12 deletions
|
@ -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);
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue