From 3e6331913a470ec2fbcde1eccf3fc1f8bc2f8fce Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Wed, 12 Oct 2011 10:24:22 -0700 Subject: [PATCH 01/43] use RCCE_IAM instead od RCCE_ue --- drivers/net/mmnif.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 9d81ee77..1a0030d3 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -636,7 +636,7 @@ static void mmnif_rxbuff_free(void) uint32_t i, j; uint32_t rpos; - RCCE_acquire_lock(RCCE_ue()); + RCCE_acquire_lock(RCCE_IAM); rpos = b->dread; for (i = 0, j = rpos; i < MMNIF_MAX_DESCRIPTORS; i++) @@ -663,7 +663,7 @@ static void mmnif_rxbuff_free(void) break; } - RCCE_release_lock(RCCE_ue()); + RCCE_release_lock(RCCE_IAM); } /* @@ -1316,7 +1316,6 @@ static int mmnif_rx_bypass(struct netif *netif, int s, void *data, uint32_t len) */ if (b->desc_table[b->dread].stat == MMNIF_STATUS_FREE) { - // spinlock_unlock(&b->rlock); return -1; } @@ -1385,10 +1384,10 @@ static int mmnif_rx_bypass(struct netif *netif, int s, void *data, uint32_t len) return length; drop_packet: - spinlock_lock(&mmnif->rx_buff->rlock); + //spinlock_lock(&mmnif->rx_buff->rlock); /*error handling */ - spinlock_unlock(&mmnif->rx_buff->rlock); + //spinlock_unlock(&mmnif->rx_buff->rlock); LINK_STATS_INC(link.drop); mmnif->stats.rx_err++; From 4c958a0d364d1b59b02f59e5fb073671c3a8859a Mon Sep 17 00:00:00 2001 From: Marian Ohligs Date: Wed, 12 Oct 2011 21:18:12 +0200 Subject: [PATCH 02/43] fix typo --- newlib/src/libgloss/metalsvm/Makefile.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/newlib/src/libgloss/metalsvm/Makefile.in b/newlib/src/libgloss/metalsvm/Makefile.in index 2c37179d..ec4bf0a4 100644 --- a/newlib/src/libgloss/metalsvm/Makefile.in +++ b/newlib/src/libgloss/metalsvm/Makefile.in @@ -105,7 +105,7 @@ readlink.o: $(srcdir)/readlink.c symlink.o: $(srcdir)/symlink.c wait.o: $(srcdir)/wait.c dup.o: $(srcdir)/dup.c -dup.o: $(srcdir)/dup2.c +dup2.o: $(srcdir)/dup2.c install: $($(CPU)_INSTALL) $(INSTALL_DATA) $(CRT0) $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$(CRT0) From aba6a08b701af7f1fcf6962ea7c37b35e7c9dc62 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 13 Oct 2011 15:21:45 -0700 Subject: [PATCH 03/43] use errno to determine socket failures --- apps/netio.c | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/apps/netio.c b/apps/netio.c index 4469cd1a..bb63c89c 100644 --- a/apps/netio.c +++ b/apps/netio.c @@ -46,6 +46,7 @@ #ifdef CONFIG_LWIP #include +#include typedef struct { @@ -75,7 +76,7 @@ static int send_data(int socket, void *buffer, size_t size, int flags) if (rc < 0) { - kprintf("send failed: %d\n", rc); + kprintf("send failed: %d\n", errno); return -1; } @@ -90,7 +91,7 @@ static int recv_data(int socket, void *buffer, size_t size, int flags) size_t rc = recv(socket, buffer, size, flags); if (rc < 0) { - kprintf("recv failed: %d\n", rc); + kprintf("recv failed: %d\n", errno); return -1; } @@ -158,7 +159,7 @@ static int TCPServer(void* arg) if ((err = bind(server, (struct sockaddr *) &sa_server, sizeof(sa_server))) < 0) { - kprintf("bind failed: %d\n", err); + kprintf("bind failed: %d\n", errno); closesocket(server); kfree(cBuffer, TMAXSIZE); return -1; @@ -166,7 +167,7 @@ static int TCPServer(void* arg) if ((err = listen(server, 2)) != 0) { - kprintf("listen failed: %d\n", err); + kprintf("listen failed: %d\n", errno); closesocket(server); kfree(cBuffer, TMAXSIZE); return -1; @@ -183,7 +184,7 @@ static int TCPServer(void* arg) if ((rc = select(FD_SETSIZE, &fds, 0, 0, &tv)) < 0) { - kprintf("select failed: %d\n", rc); + kprintf("select failed: %d\n", errno); break; } @@ -222,7 +223,7 @@ static int TCPServer(void* arg) if (rc < 0) { - kprintf("recv failed: %d\n", rc); + kprintf("recv failed: %d\n", errno); break; } @@ -252,7 +253,7 @@ static int TCPServer(void* arg) if (rc < 0) { - kprintf("send failed: %d\n", rc); + kprintf("send failed: %d\n", errno); break; } @@ -310,7 +311,7 @@ int TCP_Bench(void) if ((server = socket(PF_INET, SOCK_STREAM, 0)) < 0) { - kprintf("socket failed: %d\n", server); + kprintf("socket failed: %d\n", errno); kfree(cBuffer, TMAXSIZE); return -2; } @@ -324,7 +325,7 @@ int TCP_Bench(void) if ((err = connect(server, (struct sockaddr *) &sa_server, sizeof(sa_server))) < 0) { - kprintf("connect failed: %d\n", err); + kprintf("connect failed: %d\n", errno); closesocket(server); kfree(cBuffer, TMAXSIZE); return -2; @@ -360,8 +361,8 @@ int TCP_Bench(void) if (rc < 0) { - kprintf("send failed: %d\n", rc); - break; + kprintf("send failed: %d\n", errno); + return -1; } if (rc > 0) @@ -404,8 +405,8 @@ int TCP_Bench(void) if (rc < 0) { - kprintf("recv failed: %d\n", rc); - break; + kprintf("recv failed: %d\n", errno); + return -1; } if (rc > 0) @@ -448,6 +449,7 @@ int netio_init(void) } else if (RCCE_ue() == 0) { sleep(3); err = TCP_Bench(); + stats_display(); } #else err = create_kernel_task(NULL, TCPServer, NULL, NORMAL_PRIO); From 440b87f92e4191991701ec1404e50bee5234dc60 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 13 Oct 2011 15:23:43 -0700 Subject: [PATCH 04/43] move the definition of the macro errno from sys_arch.h to cc.h --- lwip/src/include/arch/cc.h | 6 ++++++ lwip/src/include/arch/sys_arch.h | 6 ------ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lwip/src/include/arch/cc.h b/lwip/src/include/arch/cc.h index d4b637cc..b330f204 100644 --- a/lwip/src/include/arch/cc.h +++ b/lwip/src/include/arch/cc.h @@ -74,6 +74,12 @@ typedef size_t mem_ptr_t; #define LWIP_CHKSUM_ALGORITHM 2 +/* define errno to determine error code */ +#ifdef CONFIG_LWIP +#define ERRNO +#define errno per_core(current_task)->lwip_err +#endif + /* prototypes for printf() and abort() */ #include #include diff --git a/lwip/src/include/arch/sys_arch.h b/lwip/src/include/arch/sys_arch.h index e71a6d36..6857d983 100644 --- a/lwip/src/include/arch/sys_arch.h +++ b/lwip/src/include/arch/sys_arch.h @@ -43,10 +43,4 @@ static inline void sys_arch_unprotect(sys_prot_t pval) #endif #endif -/* define errno to determine error code */ -#ifdef CONFIG_LWIP -#define ERRNO -#define errno per_core(current_task)->lwip_err -#endif - #endif /* __ARCH_SYS_ARCH_H__ */ From 5bb9e2f066f51232fc6892e23f522e6db1aa5bed Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 13 Oct 2011 15:25:10 -0700 Subject: [PATCH 05/43] add break condition into a possible endless loop --- drivers/net/rckemac.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/net/rckemac.c b/drivers/net/rckemac.c index 0ba62c15..e06b7981 100644 --- a/drivers/net/rckemac.c +++ b/drivers/net/rckemac.c @@ -232,6 +232,7 @@ static err_t rckemacif_output(struct netif* netif, struct pbuf* p) int rest; int packets; int sum = 0; + int chance = 20; /* check for over/underflow */ if (BUILTIN_EXPECT((p->tot_len < 20 /* IP header size */) || (p->tot_len > 1536), 0)) { @@ -257,6 +258,9 @@ again: if (sum < packets) { LWIP_DEBUGF(NETIF_DEBUG, ("Warning: not enough space available, retrying...\n")); + chance--; + if (chance < 0) + return ERR_MEM; goto again; } #endif From 4f534f57328b3dd6fbe5db23fc2132dd55c35787 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 13 Oct 2011 15:38:49 -0700 Subject: [PATCH 06/43] add statistic counters to determine the usage of sys_arch.c --- lwip/src/arch/sys_arch.c | 59 ++++++++++++++++++++++++++++--------- lwip/src/include/lwipopts.h | 2 +- 2 files changed, 46 insertions(+), 15 deletions(-) diff --git a/lwip/src/arch/sys_arch.c b/lwip/src/arch/sys_arch.c index 594cf38d..b305ad72 100644 --- a/lwip/src/arch/sys_arch.c +++ b/lwip/src/arch/sys_arch.c @@ -101,8 +101,11 @@ sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, */ void sys_sem_free(sys_sem_t* sem) { - sem->valid = FALSE; - sem_destroy(&sem->sem); + if (BUILTIN_EXPECT(sem != NULL, 1)) { + sem->valid = FALSE; + SYS_STATS_DEC(sem.used); + sem_destroy(&sem->sem); + } } /* sys_sem_valid(): returns if semaphore is valid @@ -110,16 +113,29 @@ void sys_sem_free(sys_sem_t* sem) */ int sys_sem_valid(sys_sem_t* sem) { + if (BUILTIN_EXPECT(sem == NULL, 0)) + return FALSE; return sem->valid; } /* sys_sem_new(): creates a new semaphre with given count. * This semaphore becomes valid */ -err_t sys_sem_new(sys_sem_t* sem, u8_t count) +err_t sys_sem_new(sys_sem_t* s, u8_t count) { - sem->valid = TRUE; - return sem_init(&sem->sem, count); + int err; + + if (BUILTIN_EXPECT(!s, 0)) + return ERR_VAL; + + err = sem_init(&s->sem, count); + if (err < 0) + return ERR_VAL; + + SYS_STATS_INC_USED(sem); + s->valid = TRUE; + + return ERR_OK; } /* sys_sem_set_invalid(): this semapohore becomes invalid @@ -158,6 +174,8 @@ u32_t sys_arch_sem_wait(sys_sem_t *sem, u32_t timeout) */ int sys_mbox_valid(sys_mbox_t * mbox) { + if (BUILTIN_EXPECT(mbox == NULL, 0)) + return FALSE; return mbox->valid; } @@ -182,8 +200,11 @@ u32_t sys_arch_mbox_fetch(sys_mbox_t * mbox, void **msg, u32_t timeout) */ void sys_mbox_free(sys_mbox_t* mbox) { - mbox->valid = FALSE; - mailbox_ptr_destroy(&mbox->mailbox); + if (BUILTIN_EXPECT(mbox != NULL, 1)) { + mbox->valid = FALSE; + SYS_STATS_DEC(mbox.used); + mailbox_ptr_destroy(&mbox->mailbox); + } } /* sys_arch_mbox_tryfetch(): poll for new data in mailbox @@ -192,7 +213,6 @@ void sys_mbox_free(sys_mbox_t* mbox) u32_t sys_arch_mbox_tryfetch(sys_mbox_t* mbox, void** msg) { int ret = mailbox_ptr_tryfetch(&mbox->mailbox, msg); - if (ret) return SYS_MBOX_EMPTY; return 0; @@ -201,12 +221,20 @@ u32_t sys_arch_mbox_tryfetch(sys_mbox_t* mbox, void** msg) /* sys_mbox_new(): create a new mailbox with a minimum size of "size" * */ -err_t sys_mbox_new(sys_mbox_t* mbox, int size) +err_t sys_mbox_new(sys_mbox_t* mb, int size) { - LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_new: create mailbox with the minimum size: %d\n", size)); + int err; + + //LWIP_DEBUGF(SYS_DEBUG, ("sys_mbox_new: create mailbox with the minimum size: %d\n", size)); + if (BUILTIN_EXPECT(!mb, 0)) + return ERR_VAL; - mbox->valid = TRUE; - return mailbox_ptr_init(&mbox->mailbox); + mb->valid = TRUE; + SYS_STATS_INC_USED(mbox); + err = mailbox_ptr_init(&mb->mailbox); + if (err) + return ERR_MEM; + return ERR_OK; } /* sys_mbox_set_invalid(): set the given mailbox to invald @@ -261,9 +289,12 @@ void sys_mutex_unlock(sys_mutex_t* mutex) /* sys_mutex_new(): create a new mutex * */ -err_t sys_mutex_new(sys_mutex_t * mutex) +err_t sys_mutex_new(sys_mutex_t * m) { - sem_init(mutex, 1); + if (BUILTIN_EXPECT(!m, 0)) + return ERR_VAL; + SYS_STATS_INC_USED(mutex); + sem_init(m, 1); return ERR_OK; } diff --git a/lwip/src/include/lwipopts.h b/lwip/src/include/lwipopts.h index e3de59e0..4bd362be 100644 --- a/lwip/src/include/lwipopts.h +++ b/lwip/src/include/lwipopts.h @@ -235,7 +235,7 @@ #define DHCP_DEBUG LWIP_DBG_OFF #define ETHARP_DEBUG LWIP_DBG_OFF #define TCPIP_DEBUG LWIP_DBG_OFF -#define SYS_DEBUG LWIP_DBG_OFF +#define SYS_DEBUG LWIP_DBG_ON #define RAW_DEBUG LWIP_DBG_OFF #define MEM_DEBUG LWIP_DBG_OFF #define IP_DEBUG LWIP_DBG_OFF From 4ec5d69ed67472f548575b080abc32eed7d9496c Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 13 Oct 2011 15:44:55 -0700 Subject: [PATCH 07/43] use the correct memcpy routince for the MPB --- drivers/net/mmnif.c | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 1a0030d3..90f5a5fe 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -65,7 +65,7 @@ #define USE_CACHE 0 // set to 1 if you want to use the message passing buffer -#define MMNIF_USE_MPB 0 +#define MMNIF_USE_MPB 1 #if USE_CACHE && MMNIF_USE_MBP #error MBP version uses implicitly the cache @@ -124,7 +124,6 @@ static spinlock_t pseudolock; */ static unsigned int own_ip_address = 0xC0A80000; /* 192.168.0.0 */ static unsigned int router_ip_address = 0xC0A80001; /* 192.168.0.1 */ -//static unsigned int budget_overflow_count = 0; /* "message passing buffer" specific constants: * - start address @@ -691,11 +690,12 @@ realloc: { //DEBUGPRINTF("mmnif_tx(): concurrency"); + //chances--; //if (chances <= 0) // goto drop_packet; + //if (chances % 17 == 0) + // mmnif_trigger_irq(dest_ip); - //chances--; - //mmnif_trigger_irq(dest_ip); NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8; //udelay(10); goto realloc; @@ -1007,26 +1007,24 @@ err_t mmnif_init(struct netif *netif) if (!RCCE_malloc(RCCE_LINE_SIZE)) { DEBUGPRINTF("mmnif init(): allocating shared memory failed\n"); - //return ERR_MEM; + return ERR_MEM; } } - #else // align size to the granularity of a page size heap_size = (heap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); - heap_start_address = (void*) RCCE_shmalloc(heap_size * MMNIF_CORES); DEBUGPRINTF("RCCE_shmalloc : %p (size %u)\n", header_start_address, MMNIF_CORES * header_size); // map physical address in the virtual address space #if USE_CACHE //heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES*heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE|MAP_MPE); - uint32_t n = (uint32_t) heap_start_address; + //uint32_t n = (uint32_t) heap_start_address; heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); map_region(heap_start_address + (heap_size) * (own_ip_address - router_ip_address), n + (heap_size) * (own_ip_address - router_ip_address), header_size >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_MPE | MAP_WT | MAP_REMAP); #else heap_start_address = (void*) map_region(0, (size_t) heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); -#endif // USE_CAHCE +#endif // USE_CACHE #endif // MMNIF_USE_MPB DEBUGPRINTF("map_region : %p\n", header_start_address); @@ -1034,9 +1032,6 @@ err_t mmnif_init(struct netif *netif) mmnif->rx_heap = heap_start_address; heap_start_address = heap_start_address - (own_ip_address - router_ip_address) * 0x2000; DEBUGPRINTF("heap_start_address : %p\n", heap_start_address); - -// heap_start_address = 0xC0000000; -// mmnif->rx_heap = heap_start_address + (heap_size) * (own_ip_address - router_ip_address); #else mmnif->rx_heap = heap_start_address + (heap_size) * (own_ip_address - router_ip_address); #endif @@ -1248,7 +1243,7 @@ anotherpacket: /* copy packet to pbuf structure going through linked list */ for (q = p, i = 0; q != NULL; q = q->next) { -#if !USE_CACHE || !MMNIF_USE_MBP +#if !USE_CACHE && !MMNIF_USE_MBP memcpy_from_nc((uint8_t *) q->payload, &packet[i], q->len); #elif MMNIF_USE_MPB memcpy_get((uint8_t *) q->payload, &packet[i], q->len); @@ -1258,6 +1253,7 @@ anotherpacket: i += q->len; } + *((int *)RCCE_fool_write_combine_buffer) = 1; #if MMNIF_USE_MPB asm volatile (".byte 0x0f; .byte 0x0a;\n"); #endif From 14d3aba6ed7f7b8de26b6ad20b7679ead1f1e29d Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sun, 16 Oct 2011 22:10:04 -0700 Subject: [PATCH 08/43] minor optimizations --- drivers/net/rckemac.c | 22 ++-------------------- 1 file changed, 2 insertions(+), 20 deletions(-) diff --git a/drivers/net/rckemac.c b/drivers/net/rckemac.c index e06b7981..67c25f2f 100644 --- a/drivers/net/rckemac.c +++ b/drivers/net/rckemac.c @@ -132,14 +132,6 @@ static struct netif* mynetif; inline static void* memcpy_from_nc(void *dest, const void *src, size_t count) { -#if 0 - size_t i; - - for(i=0; i 1536)) { + if (BUILTIN_EXPECT((length < 20) || (length > 1536), 0)) { LWIP_DEBUGF(NETIF_DEBUG, ("rckemacif_rx_handler(): illegal packet length %d => drop\n", length)); LWIP_DEBUGF(NETIF_DEBUG, ("start read at %d; write_offset at %d; addr: %p, packet len: %d\n", read_offset, write_offset, addr, length)); @@ -443,7 +425,7 @@ again: //LWIP_DEBUGF(NETIF_DEBUG, ("length %u, read_offset %u, write_offset %u\n", length, read_offset, write_offset)); p = pbuf_alloc(PBUF_RAW, length, PBUF_POOL); - if (p) { + if (BUILTIN_EXPECT(p != NULL, 1)) { #if ETH_PAD_SIZE pbuf_header(p, -ETH_PAD_SIZE); /* drop the padding word */ #endif From cd6f8b56fcb4a93b6c48fb3afeed700992b5b6d6 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 17 Oct 2011 01:55:22 -0700 Subject: [PATCH 09/43] remove bug in the initialization of heap_start_address --- drivers/net/mmnif.c | 57 +++++++++------------------------------------ 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 90f5a5fe..8c72600a 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -65,7 +65,7 @@ #define USE_CACHE 0 // set to 1 if you want to use the message passing buffer -#define MMNIF_USE_MPB 1 +#define MMNIF_USE_MPB 0 #if USE_CACHE && MMNIF_USE_MBP #error MBP version uses implicitly the cache @@ -275,14 +275,6 @@ static void mmnif_irqhandler(struct state* s); inline static void* memcpy_from_nc(void *dest, const void *src, size_t count) { -#if 0 - size_t i; - - for(i=0; idcount--; rb->dwrite = (rb->dwrite + 1) % MMNIF_MAX_DESCRIPTORS; rb->tail = (rb->tail + len); - RCCE_release_lock(dest-1); - return ret; } else if (rb->head > len) { rb->desc_table[rb->dwrite].stat = MMNIF_STATUS_PENDING; ret = (uint32_t) memblock; @@ -534,11 +514,6 @@ static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) rb->dcount--; rb->dwrite = (rb->dwrite + 1) % MMNIF_MAX_DESCRIPTORS; rb->tail = len; - RCCE_release_lock(dest-1); - return ret; - } else { - RCCE_release_lock(dest-1); - return 0; } } else { if (rb->head - rb->tail > len) @@ -550,8 +525,6 @@ static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) rb->dcount--; rb->dwrite = (rb->dwrite + 1) % MMNIF_MAX_DESCRIPTORS; rb->tail = (rb->tail + len); - RCCE_release_lock(dest-1); - return ret; } else if (rb->tail == rb->head) { if (MMNIF_RX_BUFFERLEN - rb->tail < len) { @@ -566,17 +539,13 @@ static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) rb->dcount--; rb->dwrite = (rb->dwrite + 1) % MMNIF_MAX_DESCRIPTORS; rb->tail = (rb->tail + len); - RCCE_release_lock(dest-1); - return ret; - } else { - RCCE_release_lock(dest-1); - return 0; } } - } else { - RCCE_release_lock(dest-1); - return 0; } + +out: + RCCE_release_lock(dest-1); + return ret; } /* mmnif_commit_packet: this function set the state of the (in advance) @@ -701,9 +670,6 @@ realloc: goto realloc; } - if (!write_address) - goto drop_packet; - #if MMNIF_USE_MPB asm volatile (".byte 0x0f; .byte 0x0a;\n"); #endif @@ -711,7 +677,7 @@ realloc: for (q = p, i = 0; q != 0; q = q->next) { #if !MMNIF_USE_MBP - memcpy_to_nc((char*) write_address+ i, q->payload, q->len); + memcpy_to_nc((char*) write_address + i, q->payload, q->len); #else memcpy_put((char*) write_address + i, q->payload, q->len); #endif @@ -1018,9 +984,8 @@ err_t mmnif_init(struct netif *netif) // map physical address in the virtual address space #if USE_CACHE - //heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES*heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE|MAP_MPE); - //uint32_t n = (uint32_t) heap_start_address; heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); + uint32_t n = (uint32_t) heap_start_address; map_region(heap_start_address + (heap_size) * (own_ip_address - router_ip_address), n + (heap_size) * (own_ip_address - router_ip_address), header_size >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_MPE | MAP_WT | MAP_REMAP); #else heap_start_address = (void*) map_region(0, (size_t) heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); @@ -1030,7 +995,7 @@ err_t mmnif_init(struct netif *netif) #if MMNIF_USE_MPB mmnif->rx_heap = heap_start_address; - heap_start_address = heap_start_address - (own_ip_address - router_ip_address) * 0x2000; + heap_start_address = heap_start_address - (RC_MY_COREID/2 * 16*1024*1024 ) - (RC_MY_COREID%2 * 0x2000); DEBUGPRINTF("heap_start_address : %p\n", heap_start_address); #else mmnif->rx_heap = heap_start_address + (heap_size) * (own_ip_address - router_ip_address); @@ -1230,7 +1195,7 @@ anotherpacket: * and other higher layer can handle it */ p = pbuf_alloc(PBUF_RAW, length, PBUF_POOL); - if (!p) + if (BUILTIN_EXPECT(!p, 0)) { DEBUGPRINTF("mmnif_rx(): low on mem - packet dropped\n"); goto drop_packet; From bdb0a895f205910497808ba3d07f6a72b1a5b2fc Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 17 Oct 2011 04:57:17 -0700 Subject: [PATCH 10/43] fix bug in the initialize routine --- drivers/net/mmnif.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 8c72600a..329a333c 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -984,8 +984,8 @@ err_t mmnif_init(struct netif *netif) // map physical address in the virtual address space #if USE_CACHE - heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); uint32_t n = (uint32_t) heap_start_address; + heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); map_region(heap_start_address + (heap_size) * (own_ip_address - router_ip_address), n + (heap_size) * (own_ip_address - router_ip_address), header_size >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_MPE | MAP_WT | MAP_REMAP); #else heap_start_address = (void*) map_region(0, (size_t) heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); @@ -1209,11 +1209,11 @@ anotherpacket: for (q = p, i = 0; q != NULL; q = q->next) { #if !USE_CACHE && !MMNIF_USE_MBP - memcpy_from_nc((uint8_t *) q->payload, &packet[i], q->len); + memcpy_from_nc((uint8_t *) q->payload, packet + i, q->len); #elif MMNIF_USE_MPB - memcpy_get((uint8_t *) q->payload, &packet[i], q->len); + memcpy_get((uint8_t *) q->payload, packet + i, q->len); #else - memcpy((uint8_t *) q->payload, &packet[i], q->len); + memcpy((uint8_t *) q->payload, packet + i, q->len); #endif i += q->len; } From 62f2038a6e518172d3ae1b84c62d48f1fa52cc69 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Wed, 19 Oct 2011 04:47:19 -0700 Subject: [PATCH 11/43] add a workaround to avoid the using of the missing select function --- apps/netio.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/apps/netio.c b/apps/netio.c index bb63c89c..c6969fd1 100644 --- a/apps/netio.c +++ b/apps/netio.c @@ -30,6 +30,8 @@ #include #endif +#define USE_SOCKET_BYPASSING 1 + /* * This implements a netio server and client (only TCP version). * The client sends a command word (4 bytes) then a data length word (4 bytes). @@ -45,8 +47,20 @@ /* See http://www.nwlab.net/art/netio/netio.html to get the netio tool */ #ifdef CONFIG_LWIP +#if USE_SOCKET_BYPASSING // for socket bypassing +#include +#undef LWIP_COMPAT_SOCKETS +#endif + #include #include +#include + +#if USE_SOCKET_BYPASSING // for socket bypassing +#include +#undef AF_INET +#define AF_INET AF_MMNIF_NET +#endif typedef struct { @@ -60,10 +74,10 @@ typedef struct #define CMD_RES 3 #define CTLSIZE sizeof(CONTROL) -#define DEFAULTPORT 0x494F /* "IO" */ +#define DEFAULTPORT 0x494F #define TMAXSIZE 65536 -static int tSizes[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767}; +static int tSizes[] = {/*1, 2, 4, 8, 16, */32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767}; static size_t ntSizes = sizeof(tSizes) / sizeof(int); static int nPort = DEFAULTPORT; static const int sobufsize = 131072; @@ -153,6 +167,7 @@ static int TCPServer(void* arg) setsockopt(server, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize)); setsockopt(server, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize)); + memset((char *) &sa_server, 0x00, sizeof(sa_server)); sa_server.sin_family = AF_INET; sa_server.sin_port = htons(nPort); sa_server.sin_addr = addr_local; @@ -177,6 +192,7 @@ static int TCPServer(void* arg) { kprintf("TCP server listening.\n"); +#ifdef select FD_ZERO(&fds); FD_SET(server, &fds); tv.tv_sec = 3600; @@ -190,10 +206,16 @@ static int TCPServer(void* arg) if (rc == 0 || FD_ISSET(server, &fds) == 0) continue; - +#endif length = sizeof(sa_client); - if ((client = accept(server, (struct sockaddr *) &sa_client, &length)) == -1) +#if USE_SOCKET_BYPASSING + // TODO: Bug, not compatible with BSD sockets + memcpy(&sa_client, &sa_server, length); +#endif + if ((client = accept(server, (struct sockaddr *) &sa_client, &length)) < 0) { + kprintf("accept faild: %d\n", errno); continue; + } setsockopt(client, SOL_SOCKET, SO_RCVBUF, (char *) &sobufsize, sizeof(sobufsize)); setsockopt(client, SOL_SOCKET, SO_SNDBUF, (char *) &sobufsize, sizeof(sobufsize)); @@ -215,7 +237,7 @@ static int TCPServer(void* arg) kprintf("\nReceiving from client, packet size %s ... \n", PacketSize(ctl.data)); cBuffer[0] = 0; nData = 0; - + do { for (nByte = 0; nByte < ctl.data; ) { From 5f84a93c01952eb6d66f468400c0c5d9465f2ab9 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Wed, 19 Oct 2011 04:48:16 -0700 Subject: [PATCH 12/43] extending the functionality and increasing the compatability of the Socket API - removing some minor bugs (races) - increasing the readability --- drivers/net/mmnif.c | 298 +++++++++++++++++++------------------------- drivers/net/mmnif.h | 33 ++++- 2 files changed, 158 insertions(+), 173 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 329a333c..a8a728ac 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -18,29 +18,34 @@ * * mmnif.c --- memmory mapped interface * - * Virutal IP Interface for the concept processor SCC + * Virtual IP Interface for the concept processor SCC * */ +/* + * 15th October 2011: + * - Redesign of the interrupt handling (by Stefan Lankes) + * - Add iRCCE support (by Stefan Lankes) + * - Extending the BSD socket interface + */ + #include #if defined(CONFIG_LWIP) && defined(CONFIG_ROCKCREEK) -#include "mmnif.h" /* definitions */ - #include /* lwip netif */ #include /* inteface stats */ #include /* ethernet arp packets */ #include /* struct iphdr */ #include /* tcpip_input() */ #include - -//#include +#include #include /* mailbox_ptr_t */ #include #include #include +#include #include #include @@ -51,7 +56,7 @@ #include #include -#include +#include #define TRUE 1 #define FALSE 0 @@ -80,7 +85,7 @@ #define MMNIF_AUTO_SOCKET_TIMEOUT 500 -#define MMNIF_FAST_SOCKET_BLOCK 1 +#define MMNIF_FAST_SOCKET_BLOCK 0 #ifdef DEBUG_MMNIF #include "util.h" /* hex dump */ @@ -120,11 +125,6 @@ static int npseudosocket = MMNIF_PSEUDO_SOCKET_START; static spinlock_t pseudolock; -/* IP address of the local core and the router core to get packets forwarded - */ -static unsigned int own_ip_address = 0xC0A80000; /* 192.168.0.0 */ -static unsigned int router_ip_address = 0xC0A80001; /* 192.168.0.1 */ - /* "message passing buffer" specific constants: * - start address * - size @@ -152,7 +152,6 @@ typedef struct acceptor { uint8_t stat; uint8_t src_ip; uint16_t port; - spinlock_t alock; int nsock; int rsock; } acceptor_t; @@ -222,7 +221,6 @@ typedef struct mm_rx_buffer { */ uint16_t head; uint16_t tail; - spinlock_t rlock; /* descritpor queue * desc_table : descriptor table @@ -261,10 +259,6 @@ typedef struct mmnif { mm_rx_buffer_t *rx_buff; uint8_t *rx_heap; - /* lock to protect members - */ - spinlock_t lock; - /* semaphore to regulate polling vs. interrupts */ sem_t com_poll; @@ -343,10 +337,10 @@ inline static int mmnif_trigger_irq(dest_ip) addr = CRB_ADDR(x, y) + (z == 0 ? GLCFG0 : GLCFG1); // send interrupt to ue - do { - NOP1; + //do { + // NOP1; tmp = ReadConfigReg(addr); - } while (tmp & 1); + //} while (tmp & 1); tmp |= 1; SetConfigReg(addr, tmp); @@ -437,35 +431,28 @@ void mmnif_print_driver_status(void) static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) { struct ip_hdr *iphdr; + ip_addr_p_t ip; uint8_t core; - uint8_t *ip4addr; - uint8_t addr[4]; - uint32_t netmask = 0xFFFFFF00; /* grab the destination ip address out of the ip header * for internal routing the last ocet is interpreted as core ID. */ iphdr = (struct ip_hdr *)(p->payload); - ip4addr = (uint8_t*) &iphdr->dest.addr; - - /* revert the address to host format */ - addr[3] = ip4addr[0]; - addr[2] = ip4addr[1]; - addr[1] = ip4addr[2]; - addr[0] = ip4addr[3]; + ip = iphdr->dest; /* check if the ip address is in the Local Area Network of the 48 cores */ /* if it's not the same network the router core is addressed * Note: the router core is core 1 */ - if (!((netmask & *(uint32_t *) addr) == (netmask & own_ip_address))) + if (ip_addr_netcmp(&ip, &netif->ip_addr, &netif->netmask)) return 1; - core = addr[0]; + core = ip4_addr4(&ip); /* check if the address is legitimata else return router core again */ if ((core) < 1 || (core > MMNIF_CORES)) core = 1; + kprintf("core %d\n", (int) core); return core; } @@ -477,7 +464,7 @@ static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) { uint32_t ret = 0; - mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); + volatile mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); #if MMNIF_USE_MPB char* memblock = (char*)heap_start_address + (dest-1)/2*16*1024*1024 + (dest-1)%2 * 0x2000; @@ -492,7 +479,7 @@ static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) // if ((rb->head - rb->tail < len)&&(rb->tail != rb->head)) // return NULL; - RCCE_acquire_lock(dest-1); + RCCE_acquire_lock(RC_COREID[dest-1]); if (rb->dcount) { if (rb->tail > rb->head) @@ -542,9 +529,8 @@ static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) } } } + RCCE_release_lock(RC_COREID[dest-1]); -out: - RCCE_release_lock(dest-1); return ret; } @@ -554,7 +540,7 @@ out: */ static int mmnif_commit_packet(uint8_t dest, uint32_t addr) { - mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); + volatile mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); uint32_t i; for (i = 0; i < MMNIF_MAX_DESCRIPTORS; i++) @@ -564,6 +550,7 @@ static int mmnif_commit_packet(uint8_t dest, uint32_t addr) { rb->desc_table[i].stat = MMNIF_STATUS_RDY; rb->desc_table[i].fast_sock = -1; + return 0; } } @@ -577,7 +564,7 @@ static int mmnif_commit_packet(uint8_t dest, uint32_t addr) */ static int mmnif_commit_packet_bypass(uint8_t dest, uint32_t addr, int dest_socket) { - mm_rx_buffer_t* rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); + volatile mm_rx_buffer_t* rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); uint32_t i; for (i = 0; i < MMNIF_MAX_DESCRIPTORS; i++) @@ -600,11 +587,11 @@ static int mmnif_commit_packet_bypass(uint8_t dest, uint32_t addr, int dest_sock static void mmnif_rxbuff_free(void) { mmnif_t *mmnif = mmnif_dev->state; - mm_rx_buffer_t *b = mmnif->rx_buff; + volatile mm_rx_buffer_t *b = mmnif->rx_buff; uint32_t i, j; uint32_t rpos; - RCCE_acquire_lock(RCCE_IAM); + RCCE_acquire_lock(RC_MY_COREID); rpos = b->dread; for (i = 0, j = rpos; i < MMNIF_MAX_DESCRIPTORS; i++) @@ -631,7 +618,7 @@ static void mmnif_rxbuff_free(void) break; } - RCCE_release_lock(RCCE_IAM); + RCCE_release_lock(RC_MY_COREID); } /* @@ -703,6 +690,7 @@ realloc: LINK_STATS_INC(link.xmit); mmnif->stats.tx++; mmnif->stats.tx_bytes += p->tot_len; + mmnif_trigger_irq(dest_ip); return ERR_OK; @@ -756,6 +744,7 @@ static int mmnif_hashadd(int sock, int rsock, uint8_t dest_ip) p->socket = sock; p->remote_socket = rsock; p->dest_ip = dest_ip; + return 0; } } @@ -783,6 +772,7 @@ static int mmnif_hashdelete(int sock) p->socket = -1; p->remote_socket = 0; p->dest_ip = 0; + return 0; } } @@ -801,19 +791,9 @@ static err_t mmnif_tx_bypass(struct netif * netif, void *pbuff, uint16_t size, i //uint32_t exp_delay = 2; //mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest->dest_ip - 1) * header_size); - /* Perform serveral sanity checks on the packet and the buffers: - * - is the output packet to big? - */ - -// if (size > MMNIF_TX_BUFFERLEN) -// { -// DEBUGPRINTF("mmnif_tx(): packet is longer than %d bytes\n",MMNIF_TX_BUFFERLEN); -// goto drop_packet; -// } - /* allocate memory for the packet in the remote buffer */ realloc: - write_address = mmnif_rxbuff_alloc(dest->dest_ip, CLINE_ALIGN(size)); + write_address = mmnif_rxbuff_alloc(dest->dest_ip, size); if (!write_address) { @@ -821,14 +801,7 @@ realloc: // udelay(exp_delay); // exp_delay << 1; // reschedule(); - NOP8; - NOP8; - NOP8; - NOP8; - NOP8; - NOP8; - NOP8; - NOP8; + NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8; goto realloc; } @@ -854,7 +827,7 @@ realloc: if (mmnif_commit_packet_bypass(dest->dest_ip, write_address, dest->remote_socket)) { - DEBUGPRINTF("mmnif_tx(): packet somehow lost during commit\n"); + DEBUGPRINTF("mmnif_tx_bypass(): packet somehow lost during commit\n"); } #ifdef DEBUG_MMNIF_PACKET // DEBUGPRINTF("\n SEND %p with length: %d\n",(char*)mpb_start_address + (dest_ip -1)*mpb_size + pos * 1792,p->tot_len +2); @@ -865,7 +838,9 @@ realloc: LINK_STATS_INC(link.xmit); mmnif->stats.tx++; mmnif->stats.tx_bytes += size; + mmnif_trigger_irq(dest->dest_ip); + return ERR_OK; drop_packet: @@ -882,27 +857,30 @@ drop_packet: int mmnif_send(int s, void *data, size_t size, int flags) { bypass_rxdesc_t *p = mmnif_hashlookup(s); - uint32_t i, j, k, ret; + uint32_t i, j, k; + int total_size = 0; if (p != 0) { - if (size < ((MMNIF_RX_BUFFERLEN / 2) - 1)) - return mmnif_tx_bypass(mmnif_dev, data, size, s); - - else - { + if (size < ((MMNIF_RX_BUFFERLEN / 2) - 1)) { + if (mmnif_tx_bypass(mmnif_dev, data, size, s) == ERR_OK) + return size; + else + return -1; + } else { j = size / (((MMNIF_RX_BUFFERLEN / 2) - 1)); k = size - (j * (((MMNIF_RX_BUFFERLEN / 2) - 1))); for (i = 0; i < j; i++) { - ret = mmnif_tx_bypass(mmnif_dev, data + i * ((MMNIF_RX_BUFFERLEN / 2) - 1), ((MMNIF_RX_BUFFERLEN / 2) - 1), s); - - if (ret < 0) - return ret; + if (mmnif_tx_bypass(mmnif_dev, data + i * ((MMNIF_RX_BUFFERLEN / 2) - 1), ((MMNIF_RX_BUFFERLEN / 2) - 1), s) != ERR_OK) + return total_size; + total_size += (MMNIF_RX_BUFFERLEN / 2) - 1; } - ret = mmnif_tx_bypass(mmnif_dev, data + (j - 1) * ((MMNIF_RX_BUFFERLEN / 2) - 1), k, s); - return ret; + + if (mmnif_tx_bypass(mmnif_dev, data + (j - 1) * ((MMNIF_RX_BUFFERLEN / 2) - 1), k, s) != ERR_OK) + return total_size; + return total_size + k; } } @@ -914,8 +892,7 @@ int mmnif_send(int s, void *data, size_t size, int flags) * because we have no link layer and everything is reliable we don't need * to add anything so we just pass it to our tx function */ -static err_t -mmnif_link_layer(struct netif *netif, struct pbuf *q, ip_addr_t * ipaddr) +static err_t mmnif_link_layer(struct netif *netif, struct pbuf *q, ip_addr_t * ipaddr) { return netif->linkoutput(netif, q); } @@ -934,7 +911,6 @@ err_t mmnif_init(struct netif *netif) DEBUGPRINTF("mmnif init attempt\n"); mmnif_dev = netif; - own_ip_address += RCCE_ue() + 1; /* Alloc and clear memory for the device struct */ @@ -959,7 +935,7 @@ err_t mmnif_init(struct netif *netif) // map physical address in the virtual address space header_start_address = (void*) map_region(0, (size_t) header_start_address, (MMNIF_CORES * header_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_WT | MAP_NO_CACHE); DEBUGPRINTF("map_region : %p\n", header_start_address); - mmnif->rx_buff = (mm_rx_buffer_t *) (header_start_address + (header_size) * (own_ip_address - router_ip_address)); + mmnif->rx_buff = (mm_rx_buffer_t *) (header_start_address + header_size * RCCE_IAM); /* Alloc and clear shared memory for rx_buff */ @@ -980,25 +956,25 @@ err_t mmnif_init(struct netif *netif) // align size to the granularity of a page size heap_size = (heap_size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); heap_start_address = (void*) RCCE_shmalloc(heap_size * MMNIF_CORES); - DEBUGPRINTF("RCCE_shmalloc : %p (size %u)\n", header_start_address, MMNIF_CORES * header_size); + DEBUGPRINTF("RCCE_shmalloc : %p (size %u)\n", heap_start_address, MMNIF_CORES * header_size); // map physical address in the virtual address space #if USE_CACHE uint32_t n = (uint32_t) heap_start_address; heap_start_address = map_region(0, heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); - map_region(heap_start_address + (heap_size) * (own_ip_address - router_ip_address), n + (heap_size) * (own_ip_address - router_ip_address), header_size >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_MPE | MAP_WT | MAP_REMAP); + map_region(heap_start_address + (heap_size) * RCCE_IAM, n + (heap_size) * RCCE_IAM, header_size >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_MPE | MAP_WT | MAP_REMAP); #else heap_start_address = (void*) map_region(0, (size_t) heap_start_address, (MMNIF_CORES * heap_size) >> PAGE_SHIFT, MAP_KERNEL_SPACE | MAP_NO_CACHE | MAP_MPE | MAP_WT); #endif // USE_CACHE #endif // MMNIF_USE_MPB - DEBUGPRINTF("map_region : %p\n", header_start_address); + DEBUGPRINTF("map_region : %p\n", heap_start_address); #if MMNIF_USE_MPB mmnif->rx_heap = heap_start_address; heap_start_address = heap_start_address - (RC_MY_COREID/2 * 16*1024*1024 ) - (RC_MY_COREID%2 * 0x2000); DEBUGPRINTF("heap_start_address : %p\n", heap_start_address); #else - mmnif->rx_heap = heap_start_address + (heap_size) * (own_ip_address - router_ip_address); + mmnif->rx_heap = heap_start_address + heap_size * RCCE_IAM; #endif if (!(heap_start_address)) @@ -1007,13 +983,9 @@ err_t mmnif_init(struct netif *netif) return ERR_MEM; } -#if !MMNIF_USE_MPB - memset(mmnif->rx_buff, 0x00, header_size); - memset(mmnif->rx_heap, 0x00, heap_size); - - *((int *)RCCE_fool_write_combine_buffer) = 1; -#else +#if MMNIF_USE_MPB asm volatile (".byte 0x0f; .byte 0x0a;\n"); +#endif for(i=0; irx_buff)[i] = 0x00; @@ -1021,6 +993,7 @@ err_t mmnif_init(struct netif *netif) ((uint8_t*)mmnif->rx_heap)[i] = 0x00; *((int *)RCCE_fool_write_combine_buffer) = 1; +#if MMNIF_USE_MPB asm volatile (".byte 0x0f; .byte 0x0a;\n"); #endif @@ -1030,9 +1003,7 @@ err_t mmnif_init(struct netif *netif) /* init the lock's for the hdr */ - spinlock_init(&mmnif->rx_buff->rlock); spinlock_init(&pseudolock); - spinlock_init(&mmnif->lock); /* init the sems for communication art */ @@ -1056,9 +1027,6 @@ err_t mmnif_init(struct netif *netif) mmnif->rx_buff->acceptors[i].rsock = -1; mmnif->rx_buff->acceptors[i].src_ip = 0; mmnif->rx_buff->acceptors[i].port = 0; - spinlock_init(&mmnif->rx_buff->acceptors[i].alock); - spinlock_lock(&mmnif->rx_buff->acceptors[i].alock); - spinlock_unlock(&mmnif->rx_buff->acceptors[i].alock); } /* pass the device state to lwip */ @@ -1100,7 +1068,7 @@ err_t mmnif_init(struct netif *netif) static void mmnif_rx(struct netif *netif) { mmnif_t *mmnif = netif->state; - mm_rx_buffer_t *b = mmnif->rx_buff; + volatile mm_rx_buffer_t *b = mmnif->rx_buff; uint16_t length = 0; struct pbuf *p; struct pbuf *q; @@ -1112,13 +1080,11 @@ static void mmnif_rx(struct netif *netif) anotherpacket: rdesc = 0xFF; - spinlock_lock(&b->rlock); /* check if this call to mmnif_rx makes any sense */ if (b->desc_table[b->dread].stat == MMNIF_STATUS_FREE) { - spinlock_unlock(&b->rlock); goto out; } @@ -1142,6 +1108,7 @@ anotherpacket: DEBUGPRINTF("mmnif_rx(): no fast socket associated with %d", b->desc_table[rdesc].fast_sock); mmnif->rx_buff->desc_table[rdesc].stat = MMNIF_STATUS_PROC; mmnif_rxbuff_free(); + goto out; } else { b->desc_table[rdesc].stat = MMNIF_STATUS_INPROC; #if MMNIF_FAST_SOCKET_BLOCK @@ -1149,19 +1116,16 @@ anotherpacket: #else atomic_int32_inc(&bp->cnt); #endif + goto anotherpacket; } - spinlock_unlock(&b->rlock); - goto out; } } if (b->desc_table[(j + i) % MMNIF_MAX_DESCRIPTORS].stat == MMNIF_STATUS_FREE) { - spinlock_unlock(&b->rlock); goto out; } } - spinlock_unlock(&b->rlock); /* if there is no packet finished we encountered a random error */ @@ -1265,19 +1229,15 @@ out: static int mmnif_rx_bypass(struct netif *netif, int s, void *data, uint32_t len) { mmnif_t *mmnif = netif->state; - mm_rx_buffer_t *b = mmnif->rx_buff; - uint16_t length; - char *packet; + volatile mm_rx_buffer_t *b = mmnif->rx_buff; + uint16_t length = 0; + char *packet = NULL; uint32_t i, j; uint8_t rdesc = 0xFF; - // spinlock_lock(&b->rlock); - /* check if this call to mmnif_rx makes any sense */ - if (b->desc_table[b->dread].stat == MMNIF_STATUS_FREE) - { - // spinlock_unlock(&b->rlock); + if (b->desc_table[b->dread].stat == MMNIF_STATUS_FREE) { return -1; } @@ -1296,14 +1256,10 @@ static int mmnif_rx_bypass(struct netif *netif, int s, void *data, uint32_t len) } } - // spinlock_unlock(&b->rlock); - /* if there is no packet finished we encountered a random error */ if (rdesc == 0xFF) - { return -1; - } /* If length is zero return silently */ @@ -1320,13 +1276,28 @@ static int mmnif_rx_bypass(struct netif *netif, int s, void *data, uint32_t len) #ifdef DEBUG_MMNIF_PACKET DEBUGPRINTF("\n RECIEVED - %p with legth: %d\n", packet, length); hex_dump(length, packet); - #endif - if (len >= length) - memcpy(data, (void*) mmnif->rx_buff->desc_table[rdesc].addr, mmnif->rx_buff->desc_table[rdesc].len); - else + + if (BUILTIN_EXPECT(len < length, 0)) goto drop_packet; +#if USE_CACHE || MMNIF_USE_MPB + asm volatile (".byte 0x0f; .byte 0x0a;\n"); +#endif + +#if !USE_CACHE && !MMNIF_USE_MBP + memcpy_from_nc(data, (void*) mmnif->rx_buff->desc_table[rdesc].addr, mmnif->rx_buff->desc_table[rdesc].len); +#elif MMNIF_USE_MPB + memcpy_get(data, (void*) mmnif->rx_buff->desc_table[rdesc].addr, mmnif->rx_buff->desc_table[rdesc].len); +#else + memcpy(data, (void*) mmnif->rx_buff->desc_table[rdesc].addr, mmnif->rx_buff->desc_table[rdesc].len); +#endif + + *((int *)RCCE_fool_write_combine_buffer) = 1; +#if MMNIF_USE_MPB + asm volatile (".byte 0x0f; .byte 0x0a;\n"); +#endif + /* indicate that the copy process is done and the packet can be freed * note that we did not lock here because we are the only one editing this value */ @@ -1345,10 +1316,6 @@ static int mmnif_rx_bypass(struct netif *netif, int s, void *data, uint32_t len) return length; drop_packet: - //spinlock_lock(&mmnif->rx_buff->rlock); - - /*error handling */ - //spinlock_unlock(&mmnif->rx_buff->rlock); LINK_STATS_INC(link.drop); mmnif->stats.rx_err++; @@ -1375,7 +1342,6 @@ int mmnif_recv(int s, void *data, uint32_t len, int flags) //reschedule(); NOP8; } - #endif ret = mmnif_rx_bypass(mmnif_dev, s, data, len); @@ -1407,27 +1373,30 @@ int mmnif_socket(int domain, int type, int protocol) */ int mmnif_accept(int s, struct sockaddr *addr, socklen_t * addrlen) { - struct sockaddr_in *bp = (struct sockaddr_in*)addr; - uint16_t port = bp->sin_port; - mm_rx_buffer_t *b = ((mmnif_t *) mmnif_dev->state)->rx_buff; - int i; + struct sockaddr_in *client = (struct sockaddr_in*)addr; + volatile mm_rx_buffer_t *b = ((mmnif_t *) mmnif_dev->state)->rx_buff; bypass_rxdesc_t *p; int tmp1 = get_clock_tick(); - int tmp2 = 0; + int i, tmp2 = 0; + uint16_t port; + + // TODO: Bug, not compatible with BSD sockets + port = client->sin_port; + if ((unsigned int)s >= MMNIF_PSEUDO_SOCKET_START) { for (i = 0; i < MMNIF_MAX_ACCEPTORS; i++) { if (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat == MMNIF_ACC_STAT_CLOSED) { - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_MY_COREID); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].port = port; b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_ACCEPTING; spinlock_lock(&pseudolock); mmnif_hashadd(npseudosocket, -1, 0); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock = npseudosocket++; spinlock_unlock(&pseudolock); - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_release_lock(RC_MY_COREID); while (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat != MMNIF_ACC_STAT_ACCEPT_ME) NOP8; @@ -1435,48 +1404,46 @@ int mmnif_accept(int s, struct sockaddr *addr, socklen_t * addrlen) p = mmnif_hashlookup(b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock); p->dest_ip = b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].src_ip; p->remote_socket = b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].rsock; - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_MY_COREID); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_ACCEPTED; i = b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock; - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_release_lock(RC_MY_COREID); return i; } } - return -1; - } - else - { + return -1; + } else { for (i = 0; i < MMNIF_MAX_ACCEPTORS; i++) { if (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat == MMNIF_ACC_STAT_CLOSED) { - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_MY_COREID); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].port = port; b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_ACCEPTING; spinlock_lock(&pseudolock); mmnif_hashadd(npseudosocket, -1, 0); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock = npseudosocket++; spinlock_unlock(&pseudolock); - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_release_lock(RC_MY_COREID); while (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat != MMNIF_ACC_STAT_ACCEPT_ME) { tmp2 = get_clock_tick(); if (tmp2 - tmp1 > MMNIF_AUTO_SOCKET_TIMEOUT) { - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_MY_COREID); if (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat == MMNIF_ACC_STAT_ACCEPT_ME) { - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_MY_COREID); break; } DEBUGPRINTF("mmnif_accept(): Timout occoured, switching to normal accept()"); mmnif_hashdelete(b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_CLOSED; - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_release_lock(RC_MY_COREID); goto normalaccept; } NOP8; @@ -1485,14 +1452,15 @@ int mmnif_accept(int s, struct sockaddr *addr, socklen_t * addrlen) p = mmnif_hashlookup(b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock); p->dest_ip = b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].src_ip; p->remote_socket = b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].rsock; - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_MY_COREID); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_ACCEPTED; i = b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock; - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_release_lock(RC_MY_COREID); return i; } } + return -1; } @@ -1507,48 +1475,29 @@ int mmnif_connect(int s, const struct sockaddr *name, socklen_t namelen) { struct sockaddr_in *p = (struct sockaddr_in*) name; uint16_t port = p->sin_port; - mm_rx_buffer_t *b; + volatile mm_rx_buffer_t *b; int i; //int tmp1 = get_clock_tick(); //int tmp2 = 0; uint8_t core; - uint8_t *ip4addr; - uint8_t addr[4]; - //uint32_t netmask = 0xFFFFFF00; - /* grab the destination ip address out of the ip header - * for internal routing the last ocet is interpreted as core ID. - */ - ip4addr = (uint8_t*) &p->sin_addr.s_addr; - - /* revert the address to host format */ - addr[3] = ip4addr[0]; - addr[2] = ip4addr[1]; - addr[1] = ip4addr[2]; - addr[0] = ip4addr[3]; - - /* check if the ip address is in the Local Area Network of the 48 cores */ - // if (!((netmask & *(uint32_t*)addr) == (netmask & own_ip_address) )) - // return -1; - - core = addr[0]; + core = ip4_addr4(&p->sin_addr.s_addr); if ((core) < 1 || (core > MMNIF_CORES)) return lwip_connect(s, name, namelen); - b = (mm_rx_buffer_t *) ((char *)header_start_address + - (core - 1) * header_size); + b = (volatile mm_rx_buffer_t *) ((char *)header_start_address + (core - 1) * header_size); for (i = 0; i < MMNIF_MAX_ACCEPTORS; i++) { if (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat == MMNIF_ACC_STAT_ACCEPTING && b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].port == port) { - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_acquire_lock(RC_COREID[core-1]); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_ACCEPT_ME; b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].rsock = s; - b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].src_ip = own_ip_address & 0xFF; - mmnif_hashadd(s, - b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock, core); - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].src_ip = ip4_addr4(&mmnif_dev->ip_addr); + mmnif_hashadd(s, b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].nsock, core); + RCCE_release_lock(RC_COREID[core-1]); + while (b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat != MMNIF_ACC_STAT_ACCEPTED) { @@ -1563,9 +1512,11 @@ int mmnif_connect(int s, const struct sockaddr *name, socklen_t namelen) // } NOP8; } - spinlock_lock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + + RCCE_acquire_lock(RC_COREID[core-1]); b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].stat = MMNIF_ACC_STAT_CLOSED; - spinlock_unlock(&b->acceptors[(i + port) % MMNIF_MAX_ACCEPTORS].alock); + RCCE_release_lock(RC_COREID[core-1]); + return 0; } } @@ -1589,6 +1540,13 @@ int mmnif_bind(int s, const struct sockaddr *name, socklen_t namelen) return 0; } +int mmnif_setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen) +{ + if ((unsigned int)s < MMNIF_PSEUDO_SOCKET_START) + return lwip_setsockopt(s, level, optname, optval, optlen); + return 0; +} + /* mmnif_closesocket(): replacement if lwip_close for * fast_sockets */ diff --git a/drivers/net/mmnif.h b/drivers/net/mmnif.h index 69046984..c3030aae 100644 --- a/drivers/net/mmnif.h +++ b/drivers/net/mmnif.h @@ -24,26 +24,53 @@ #ifdef CONFIG_LWIP #include #include /* lwip netif */ +#include -#define AF_MMNIF_NET 0x1337 +#define AF_MMNIF_NET 0x42 -#define MMNIF_AUTOACTIVATE_FAST_SOCKETS 0 +#define MMNIF_AUTOACTIVATE_FAST_SOCKETS 1 #if MMNIF_AUTOACTIVATE_FAST_SOCKETS +//#ifndef socklen_t +//# define socklen_t u32_t +//#endif + +int mmnif_socket(int domain, int type, int protocol); +int mmnif_send(int s, void *data, size_t size, int flags); +int mmnif_recv(int s, void *data, uint32_t len, int flags); +int mmnif_accept(int s, struct sockaddr *addr, socklen_t * addrlen); +int mmnif_connect(int s, const struct sockaddr *name, socklen_t namelen); +int mmnif_listen(int s, int backlog); +int mmnif_bind(int s, const struct sockaddr *name, socklen_t namelen); +int mmnif_closesocket(int s); +int mmnif_getsockopt (int s, int level, int optname, void *optval, socklen_t *optlen); +int mmnif_setsockopt (int s, int level, int optname, const void *optval, socklen_t optlen); + +#undef accept #define accept(a,b,c) mmnif_accept(a,b,c) +#undef closesocket #define closesocket(s) mmnif_closesocket(s) +#undef connect #define connect(a,b,c) mmnif_connect(a,b,c) +#undef recv #define recv(a,b,c,d) mmnif_recv(a,b,c,d) +#undef send #define send(a,b,c,d) mmnif_send(a,b,c,d) +#undef socket #define socket(a,b,c) mmnif_socket(a,b,c) +#undef bind #define bind(a,b,c) mmnif_bind(a,b,c) +#undef listen #define listen(a,b) mmnif_listen(a,b) +#undef setsockopt +#define setsockopt(a,b,c,d,e) mmnif_setsockopt(a,b,c,d,e) +#undef select #endif err_t mmnif_init(struct netif*); err_t mmnif_shutdown(void); int mmnif_worker(void *e); -void mmnif_print_driver_status(); +void mmnif_print_driver_status(void); #endif From fcbc567c716d3005882a3d16d8d66f206944719d Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 20 Oct 2011 03:45:51 -0700 Subject: [PATCH 13/43] minor optimizations --- drivers/net/mmnif.c | 160 +++++++++++++++++++++----------------------- drivers/net/mmnif.h | 3 - 2 files changed, 75 insertions(+), 88 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index a8a728ac..6ca4a96b 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -85,10 +85,8 @@ #define MMNIF_AUTO_SOCKET_TIMEOUT 500 -#define MMNIF_FAST_SOCKET_BLOCK 0 - #ifdef DEBUG_MMNIF -#include "util.h" /* hex dump */ +#include /* hex dump */ #endif /* define constants @@ -145,7 +143,6 @@ typedef struct acceptor { /* stat: status of the acceptor * src_ip: where did the connect request came from * port: port on which the acceptor is listening - * alock : acceptor lock * nsock : next pseudo socket which is used in further connection * rsock : remote socket which has to be assosicated with the nsock */ @@ -161,13 +158,13 @@ typedef struct acceptor { typedef struct bypass_rxdesc { /* socket : hashtarget * remote_socket: socket on the remote end - * cnt : atomic counter for the recv function + * counter : packet counter + * last_id : last packet id * dest_ip : associated destination ip/core */ int socket; int remote_socket; sem_t sem; - atomic_int32_t cnt; uint8_t dest_ip; } bypass_rxdesc_t; @@ -205,6 +202,7 @@ typedef struct rx_desc { * addr : memory address of the packet * fast_sock: (-1) if no socket is associated * else the socket n of the fast socket + * id : packet id */ uint8_t stat; uint16_t len; @@ -251,12 +249,12 @@ typedef struct mmnif { uint32_t ipaddr; // checks the TCPIP thread already the rx buffers? - uint8_t check_in_progress; + volatile uint8_t check_in_progress; /* memory interaction variables: * - pointer to recive buffer */ - mm_rx_buffer_t *rx_buff; + volatile mm_rx_buffer_t *rx_buff; uint8_t *rx_heap; /* semaphore to regulate polling vs. interrupts @@ -326,7 +324,7 @@ inline static void* memcpy_to_nc(void* dest, const void *src, size_t count) /* trigger an interrupt on the remote processor * so he knows there is a packet to read */ -inline static int mmnif_trigger_irq(dest_ip) +inline static int mmnif_trigger_irq(int dest_ip, int safe) { int tmp, x, y, z, addr; int ue = dest_ip - 1; @@ -336,32 +334,19 @@ inline static int mmnif_trigger_irq(dest_ip) y = Y_PID(RC_COREID[ue]); addr = CRB_ADDR(x, y) + (z == 0 ? GLCFG0 : GLCFG1); - // send interrupt to ue - //do { - // NOP1; - tmp = ReadConfigReg(addr); - //} while (tmp & 1); + if (safe) { + // send interrupt to ue + do { + NOP8; + tmp = ReadConfigReg(addr); + } while (tmp & 1); + } else tmp = ReadConfigReg(addr); tmp |= 1; SetConfigReg(addr, tmp); return 0; } -/* mmnif_get_device_stats(): Returns a copy of the - * current device - */ -static mmnif_device_stats_t mmnif_get_device_stats(void) -{ - mmnif_device_stats_t stats = { 0 }; - - if (!mmnif_dev) - DEBUGPRINTF("mmnif_get_device_stats(): the device is not initialized yet.\n"); - else - stats = ((mmnif_t *) mmnif_dev->state)->stats; - - return stats; -} - /* mmnif_print_stats(): Print the devices stats of the * current device */ @@ -452,7 +437,6 @@ static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) /* check if the address is legitimata else return router core again */ if ((core) < 1 || (core > MMNIF_CORES)) core = 1; - kprintf("core %d\n", (int) core); return core; } @@ -461,7 +445,7 @@ static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) * right inside of the buffer which is used for communication * with the remote end */ -static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) +static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len/*, uint32_t id*/) { uint32_t ret = 0; volatile mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); @@ -631,7 +615,6 @@ static err_t mmnif_tx(struct netif *netif, struct pbuf *p) uint32_t i; struct pbuf *q; /* interator */ uint32_t dest_ip = mmnif_get_destination(netif, p); - //int32_t chances = 4000; /* check for over/underflow */ if (BUILTIN_EXPECT((p->tot_len < 20 /* IP header size */) || (p->tot_len > 1536), 0)) { @@ -646,14 +629,7 @@ realloc: { //DEBUGPRINTF("mmnif_tx(): concurrency"); - //chances--; - //if (chances <= 0) - // goto drop_packet; - //if (chances % 17 == 0) - // mmnif_trigger_irq(dest_ip); - NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8; - //udelay(10); goto realloc; } @@ -691,7 +667,7 @@ realloc: mmnif->stats.tx++; mmnif->stats.tx_bytes += p->tot_len; - mmnif_trigger_irq(dest_ip); + mmnif_trigger_irq(dest_ip, 1); return ERR_OK; @@ -787,20 +763,16 @@ static err_t mmnif_tx_bypass(struct netif * netif, void *pbuff, uint16_t size, i { mmnif_t *mmnif = netif->state; uint32_t write_address; + //uint32_t id; bypass_rxdesc_t *dest = mmnif_hashlookup(s); - //uint32_t exp_delay = 2; //mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest->dest_ip - 1) * header_size); /* allocate memory for the packet in the remote buffer */ + //id = ++dest->counter; realloc: write_address = mmnif_rxbuff_alloc(dest->dest_ip, size); if (!write_address) { - - // DEBUGPRINTF("mmnif_tx_bypass(): concurrency"); - // udelay(exp_delay); - // exp_delay << 1; - // reschedule(); NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8;NOP8; goto realloc; } @@ -817,7 +789,7 @@ realloc: #if !MMNIF_USE_MPB memcpy_to_nc((void*) write_address, pbuff, size); #else - memcpy_put(write_address, pbuff, size); + memcpy_put((void*) write_address, pbuff, size); #endif *((int *)RCCE_fool_write_combine_buffer) = 1; @@ -839,16 +811,10 @@ realloc: mmnif->stats.tx++; mmnif->stats.tx_bytes += size; - mmnif_trigger_irq(dest->dest_ip); + if (size >= ((MMNIF_RX_BUFFERLEN / 2) - 1)) + mmnif_trigger_irq(dest->dest_ip, 0); return ERR_OK; - -drop_packet: - /* drop packet for one or another reason - */ - LINK_STATS_INC(link.drop); - mmnif->stats.tx_err++; - return ERR_IF; } /* mmnif_send(): is going to be used as replacement of @@ -864,24 +830,24 @@ int mmnif_send(int s, void *data, size_t size, int flags) { if (size < ((MMNIF_RX_BUFFERLEN / 2) - 1)) { if (mmnif_tx_bypass(mmnif_dev, data, size, s) == ERR_OK) - return size; - else - return -1; + total_size = size; } else { j = size / (((MMNIF_RX_BUFFERLEN / 2) - 1)); k = size - (j * (((MMNIF_RX_BUFFERLEN / 2) - 1))); for (i = 0; i < j; i++) { - if (mmnif_tx_bypass(mmnif_dev, data + i * ((MMNIF_RX_BUFFERLEN / 2) - 1), ((MMNIF_RX_BUFFERLEN / 2) - 1), s) != ERR_OK) - return total_size; + if (mmnif_tx_bypass(mmnif_dev, (char*) data + i * ((MMNIF_RX_BUFFERLEN / 2) - 1), ((MMNIF_RX_BUFFERLEN / 2) - 1), s) != ERR_OK) + goto out; total_size += (MMNIF_RX_BUFFERLEN / 2) - 1; } - if (mmnif_tx_bypass(mmnif_dev, data + (j - 1) * ((MMNIF_RX_BUFFERLEN / 2) - 1), k, s) != ERR_OK) - return total_size; - return total_size + k; + if (mmnif_tx_bypass(mmnif_dev, data + (j - 1) * ((MMNIF_RX_BUFFERLEN / 2) - 1), k, s) == ERR_OK) + total_size += k; } +out: + mmnif_trigger_irq(p->dest_ip, 1); + return total_size; } return lwip_send(s, data, size, flags); @@ -1014,10 +980,9 @@ err_t mmnif_init(struct netif *netif) mmnif_hashtable[i].socket = -1; mmnif_hashtable[i].remote_socket = -1; mmnif_hashtable[i].dest_ip = 0; + //mmnif_hashtable[i].counter = 0; -#if MMNIF_FAST_SOCKET_BLOCK sem_init(&mmnif_hashtable[i].sem, 0); -#endif } for (i=0; idesc_table[rdesc].stat = MMNIF_STATUS_INPROC; -#if MMNIF_FAST_SOCKET_BLOCK sem_post(&bp->sem); -#else - atomic_int32_inc(&bp->cnt); -#endif - goto anotherpacket; + irq_nested_enable(flags); + return; } } } @@ -1140,6 +1103,8 @@ anotherpacket: goto out; } + irq_nested_enable(flags); + /* check for over/underflow */ if (BUILTIN_EXPECT((length < 20 /* IP header size */) || (length > 1536), 0)) { @@ -1217,9 +1182,12 @@ drop_packet: /* TODO: error handling */ LINK_STATS_INC(link.drop); mmnif->stats.rx_err++; + mmnif->check_in_progress = 0; + return; out: mmnif->check_in_progress = 0; + irq_nested_enable(flags); return; } @@ -1327,27 +1295,49 @@ drop_packet: */ int mmnif_recv(int s, void *data, uint32_t len, int flags) { + mmnif_t* mmnif = (mmnif_t *) mmnif_dev->state; bypass_rxdesc_t *p = mmnif_hashlookup(s); int ret; if (p == 0) return lwip_recv(s, data, len, flags); -#if MMNIF_FAST_SOCKET_BLOCK + if (sem_trywait(&p->sem) == 0) + return mmnif_rx_bypass(mmnif_dev, s, data, len); + + uint32_t state = irq_nested_disable(); + if (mmnif->check_in_progress) { + uint32_t i,j; + volatile mm_rx_buffer_t *b = mmnif->rx_buff; + bypass_rxdesc_t *bp; + uint8_t rdesc; + + /* search the packet whose transmission is finished + */ + for (i = 0, j = b->dread; i < MMNIF_MAX_DESCRIPTORS; i++) + { + if (b->desc_table[(j + i) % MMNIF_MAX_DESCRIPTORS].stat == MMNIF_STATUS_RDY) + { + rdesc = (j + i) % MMNIF_MAX_DESCRIPTORS; + if (b->desc_table[(j + i) % MMNIF_MAX_DESCRIPTORS].fast_sock != -1) { + bp = mmnif_hashlookup(b->desc_table[rdesc].fast_sock); + if (bp) { + b->desc_table[rdesc].stat = MMNIF_STATUS_INPROC; + ret = mmnif_rx_bypass(mmnif_dev, s, data, len); + irq_nested_enable(state); + return ret; + } + } + } + } + + mmnif->check_in_progress = 0; + } + irq_nested_enable(state); + sem_wait(&p->sem, 0); -#else - while (!atomic_int32_read(&p->cnt)) - { - //reschedule(); - NOP8; - } -#endif - - ret = mmnif_rx_bypass(mmnif_dev, s, data, len); - atomic_int32_dec(&p->cnt); - - return ret; + return mmnif_rx_bypass(mmnif_dev, s, data, len); } /* mmnif_socket(): replacement of lwip_socket for @@ -1586,7 +1576,7 @@ static void mmnif_irqhandler(struct state* s) mmnif = (mmnif_t *) mmnif_dev->state; if (!mmnif->check_in_progress) { if (tcpip_callback_with_block(mmnif_rx, (void*) mmnif_dev, 0) == ERR_OK) { - mmnif->check_in_progress = 1; + mmnif->check_in_progress = 1; } else { DEBUGPRINTF("rckemacif_handler: unable to send a poll request to the tcpip thread\n"); } diff --git a/drivers/net/mmnif.h b/drivers/net/mmnif.h index c3030aae..67fd46a7 100644 --- a/drivers/net/mmnif.h +++ b/drivers/net/mmnif.h @@ -31,9 +31,6 @@ #define MMNIF_AUTOACTIVATE_FAST_SOCKETS 1 #if MMNIF_AUTOACTIVATE_FAST_SOCKETS -//#ifndef socklen_t -//# define socklen_t u32_t -//#endif int mmnif_socket(int domain, int type, int protocol); int mmnif_send(int s, void *data, size_t size, int flags); From 844acb30b97092342c2a580dd8e3124e271ad400 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 20 Oct 2011 04:51:34 -0700 Subject: [PATCH 14/43] fix bug in get_destination --- drivers/net/mmnif.c | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 6ca4a96b..33fef2d8 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -417,7 +417,6 @@ static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) { struct ip_hdr *iphdr; ip_addr_p_t ip; - uint8_t core; /* grab the destination ip address out of the ip header * for internal routing the last ocet is interpreted as core ID. @@ -425,19 +424,7 @@ static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) iphdr = (struct ip_hdr *)(p->payload); ip = iphdr->dest; - /* check if the ip address is in the Local Area Network of the 48 cores */ - - /* if it's not the same network the router core is addressed - * Note: the router core is core 1 - */ - if (ip_addr_netcmp(&ip, &netif->ip_addr, &netif->netmask)) - return 1; - core = ip4_addr4(&ip); - - /* check if the address is legitimata else return router core again */ - if ((core) < 1 || (core > MMNIF_CORES)) - core = 1; - return core; + return ip4_addr4(&ip); } /* mmnif_rxbuff_alloc(): @@ -622,6 +609,12 @@ static err_t mmnif_tx(struct netif *netif, struct pbuf *p) goto drop_packet; } + /* check destination ip */ + if (BUILTIN_EXPECT((dest_ip < 1) || (dest_ip > MMNIF_CORES), 0)) { + DEBUGPRINTF("mmnif_tx: invalid destination IP %d => drop\n", dest_ip); + goto drop_packet; + } + /* allocate memory for the packet in the remote buffer */ realloc: write_address = mmnif_rxbuff_alloc(dest_ip, p->tot_len); From 60cfb9b5866b8156a1f6b873bdade02972184231 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 20 Oct 2011 06:28:14 -0700 Subject: [PATCH 15/43] using of clear function names --- include/metalsvm/init.h | 4 ++-- kernel/init.c | 11 +---------- 2 files changed, 3 insertions(+), 12 deletions(-) diff --git a/include/metalsvm/init.h b/include/metalsvm/init.h index 8ca4a89a..ab77b793 100644 --- a/include/metalsvm/init.h +++ b/include/metalsvm/init.h @@ -36,8 +36,8 @@ extern "C" { * initialize the VGA output. If configured.*/ int lowlevel_init(void); -/** @brief Shutdown the system */ -int shutdown(void); +/** @brief Shutdown the network */ +int network_shutdown(void); /** @brief Entry point of the init task */ int initd(void* arg); diff --git a/kernel/init.c b/kernel/init.c index eea20644..294d240f 100644 --- a/kernel/init.c +++ b/kernel/init.c @@ -171,7 +171,7 @@ static void tcpip_init_done(void* arg) } #endif -static int network_shutdown(void) +int network_shutdown(void) { #if defined(CONFIG_LWIP) && defined(CONFIG_ROCKCREEK) mmnif_shutdown(); @@ -183,15 +183,6 @@ static int network_shutdown(void) return 0; } -int shutdown(void) -{ - int ret; - - ret = network_shutdown(); - - return ret; -} - static void list_fs(vfs_node_t* node, uint32_t depth) { int j, i = 0; From e3a8c1ae779f8ff08e2f144e7d672fa6342d6517 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 20 Oct 2011 06:44:53 -0700 Subject: [PATCH 16/43] cosmetic changes --- apps/netio.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/netio.c b/apps/netio.c index c6969fd1..088fe6b0 100644 --- a/apps/netio.c +++ b/apps/netio.c @@ -77,7 +77,7 @@ typedef struct #define DEFAULTPORT 0x494F #define TMAXSIZE 65536 -static int tSizes[] = {/*1, 2, 4, 8, 16, */32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767}; +static int tSizes[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32767}; static size_t ntSizes = sizeof(tSizes) / sizeof(int); static int nPort = DEFAULTPORT; static const int sobufsize = 131072; @@ -192,7 +192,7 @@ static int TCPServer(void* arg) { kprintf("TCP server listening.\n"); -#ifdef select +#if !USE_SOCKET_BYPASSING FD_ZERO(&fds); FD_SET(server, &fds); tv.tv_sec = 3600; From c74ee965cad9c0f92287e1d10a634eeabb74bec8 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 20 Oct 2011 08:46:27 -0700 Subject: [PATCH 17/43] minor optimizations --- drivers/net/mmnif.c | 45 +++++++++++++++++++-------------------------- 1 file changed, 19 insertions(+), 26 deletions(-) diff --git a/drivers/net/mmnif.c b/drivers/net/mmnif.c index 33fef2d8..d63149d0 100644 --- a/drivers/net/mmnif.c +++ b/drivers/net/mmnif.c @@ -324,7 +324,7 @@ inline static void* memcpy_to_nc(void* dest, const void *src, size_t count) /* trigger an interrupt on the remote processor * so he knows there is a packet to read */ -inline static int mmnif_trigger_irq(int dest_ip, int safe) +inline static int mmnif_trigger_irq(int dest_ip) { int tmp, x, y, z, addr; int ue = dest_ip - 1; @@ -334,13 +334,11 @@ inline static int mmnif_trigger_irq(int dest_ip, int safe) y = Y_PID(RC_COREID[ue]); addr = CRB_ADDR(x, y) + (z == 0 ? GLCFG0 : GLCFG1); - if (safe) { - // send interrupt to ue - do { - NOP8; - tmp = ReadConfigReg(addr); - } while (tmp & 1); - } else tmp = ReadConfigReg(addr); + // send interrupt to ue + do { + NOP8; + tmp = ReadConfigReg(addr); + } while (tmp & 1); tmp |= 1; SetConfigReg(addr, tmp); @@ -432,7 +430,7 @@ static uint8_t mmnif_get_destination(struct netif *netif, struct pbuf *p) * right inside of the buffer which is used for communication * with the remote end */ -static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len/*, uint32_t id*/) +static uint32_t mmnif_rxbuff_alloc(uint8_t dest, uint16_t len) { uint32_t ret = 0; volatile mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest - 1) * header_size); @@ -660,7 +658,7 @@ realloc: mmnif->stats.tx++; mmnif->stats.tx_bytes += p->tot_len; - mmnif_trigger_irq(dest_ip, 1); + mmnif_trigger_irq(dest_ip); return ERR_OK; @@ -761,7 +759,6 @@ static err_t mmnif_tx_bypass(struct netif * netif, void *pbuff, uint16_t size, i //mm_rx_buffer_t *rb = (mm_rx_buffer_t *) ((char *)header_start_address + (dest->dest_ip - 1) * header_size); /* allocate memory for the packet in the remote buffer */ - //id = ++dest->counter; realloc: write_address = mmnif_rxbuff_alloc(dest->dest_ip, size); if (!write_address) @@ -804,8 +801,7 @@ realloc: mmnif->stats.tx++; mmnif->stats.tx_bytes += size; - if (size >= ((MMNIF_RX_BUFFERLEN / 2) - 1)) - mmnif_trigger_irq(dest->dest_ip, 0); + mmnif_trigger_irq(dest->dest_ip); return ERR_OK; } @@ -821,25 +817,24 @@ int mmnif_send(int s, void *data, size_t size, int flags) if (p != 0) { - if (size < ((MMNIF_RX_BUFFERLEN / 2) - 1)) { + if (size < ((MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE)) { if (mmnif_tx_bypass(mmnif_dev, data, size, s) == ERR_OK) - total_size = size; + return size; } else { - j = size / (((MMNIF_RX_BUFFERLEN / 2) - 1)); - k = size - (j * (((MMNIF_RX_BUFFERLEN / 2) - 1))); + j = size / (((MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE)); + k = size - (j * (((MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE))); for (i = 0; i < j; i++) { - if (mmnif_tx_bypass(mmnif_dev, (char*) data + i * ((MMNIF_RX_BUFFERLEN / 2) - 1), ((MMNIF_RX_BUFFERLEN / 2) - 1), s) != ERR_OK) - goto out; - total_size += (MMNIF_RX_BUFFERLEN / 2) - 1; + if (mmnif_tx_bypass(mmnif_dev, (char*) data + i * ((MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE), ((MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE), s) != ERR_OK) + return total_size; + total_size += (MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE; } - if (mmnif_tx_bypass(mmnif_dev, data + (j - 1) * ((MMNIF_RX_BUFFERLEN / 2) - 1), k, s) == ERR_OK) + if (mmnif_tx_bypass(mmnif_dev, data + (j - 1) * ((MMNIF_RX_BUFFERLEN / 2) - CLINE_SIZE), k, s) == ERR_OK) total_size += k; } -out: - mmnif_trigger_irq(p->dest_ip, 1); + return total_size; } @@ -1290,7 +1285,6 @@ int mmnif_recv(int s, void *data, uint32_t len, int flags) { mmnif_t* mmnif = (mmnif_t *) mmnif_dev->state; bypass_rxdesc_t *p = mmnif_hashlookup(s); - int ret; if (p == 0) return lwip_recv(s, data, len, flags); @@ -1316,9 +1310,8 @@ int mmnif_recv(int s, void *data, uint32_t len, int flags) bp = mmnif_hashlookup(b->desc_table[rdesc].fast_sock); if (bp) { b->desc_table[rdesc].stat = MMNIF_STATUS_INPROC; - ret = mmnif_rx_bypass(mmnif_dev, s, data, len); irq_nested_enable(state); - return ret; + return mmnif_rx_bypass(mmnif_dev, s, data, len); } } } From ca1abe00f6d34c224958e6a8599c93e91e927d55 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Thu, 20 Oct 2011 23:23:16 -0700 Subject: [PATCH 18/43] add Laplace example and GFX code --- apps/Makefile | 2 +- apps/gfx_client.c | 146 +++++++++++++++++++++++ apps/gfx_client.h | 50 ++++++++ apps/gfx_generic.c | 138 ++++++++++++++++++++++ apps/gfx_generic.h | 84 +++++++++++++ apps/laplace.c | 288 +++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 707 insertions(+), 1 deletion(-) create mode 100644 apps/gfx_client.c create mode 100644 apps/gfx_client.h create mode 100644 apps/gfx_generic.c create mode 100644 apps/gfx_generic.h create mode 100644 apps/laplace.c diff --git a/apps/Makefile b/apps/Makefile index 94912228..e45d1a38 100644 --- a/apps/Makefile +++ b/apps/Makefile @@ -1,4 +1,4 @@ -C_source := tests.c echo.c netio.c +C_source := tests.c echo.c netio.c laplace.c gfx_client.c gfx_generic.c MODULE := apps include $(TOPDIR)/Makefile.inc diff --git a/apps/gfx_client.c b/apps/gfx_client.c new file mode 100644 index 00000000..5614849d --- /dev/null +++ b/apps/gfx_client.c @@ -0,0 +1,146 @@ +/* + * Copyright 2011 Sarah Fischer, Nicolas Berr, Pablo Reble + * Chair for Operating Systems, RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#include + +#ifdef CONFIG_LWIP + +#include "gfx_client.h" +#include + +static int myrank; +static int sockfd; + +#ifndef SINGLE_CONNECT +#define SINGLE_CONNECT 1 +#endif +#define SINGLE_CONNECT_RANK 0 +#define USE_GETHOSTBYNAME 0 + +//int gfx_init(int* pargc, char*** pargv, int rank){ +int gfx_init(char* ip_str, char* port_str, int rank) { + char* hostname; + int port; + struct sockaddr_in serveraddr; + struct hostent *server; + + //*pargc -=2; + myrank = rank; + +#if SINGLE_CONNECT + // currently only rank 0 will connect to the gfx-server + if (rank != SINGLE_CONNECT_RANK) { + return 0; + } +#endif + + /* hostname und port aus den parametern ermitteln) */ + //kprintf("pargc: %d\n", *pargc); + + hostname = ip_str; //(*pargv)[(*pargc)]; + port = atoi(port_str); //atoi((*pargv)[(*pargc)+1]); + + kprintf("gfx-client connecting to host: %s, port: %d\n", hostname, port); + + /* socket erzeugen */ + sockfd = socket(AF_INET, SOCK_STREAM, 0); + if (sockfd < 0) + return -1; + +#if 1 + /* Disable the Nagle (TCP No Delay) algorithm */ + int flag = 1; + if (setsockopt(sockfd, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(flag)) < 0) { + kprintf("Couldn't setsockopt(TCP_NODELAY)\n"); + return -1; + } +#endif + +#if USE_GETHOSTBYNAME + /* dns eintrag vom server ermitteln */ + serveraddr = gethostbyname(hostname); + if (server == NULL){ + fprintf(stderr, "%s: no such host\n", hostname); + return -2; + } +#endif + + /* adresse vom server ermitteln */ + memset((char *) &serveraddr, 0x00, sizeof(serveraddr)); + serveraddr.sin_family = AF_INET; +#if USE_GETHOSTBYNAME + bcopy((char *)server->h_addr, (char *)&serveraddr.sin_addr.s_addr, server->h_length); +#else + serveraddr.sin_addr.s_addr = inet_addr(hostname); +#endif + serveraddr.sin_port = htons(port); + + /* verbindung herstellen */ + if (connect(sockfd, (const struct sockaddr *) &serveraddr, sizeof(serveraddr)) < 0) + return -3; + + return 0; +} + +int gfx_send(char* buf, int size, int tag){ + int ret, pos = 0; + uint32_t u32size, u32tag; + +#if SINGLE_CONNECT + if (myrank != SINGLE_CONNECT_RANK) + return 0; +#endif + + u32size = size; + u32tag = tag; + +// printf("sending stuff...."); +// printf("tag: %d, size: %d\n", tag, size); +// fflush(stdout); + + ret = write(sockfd, &u32tag, sizeof(u32tag)); + if (ret != sizeof(tag)) + return -1; + ret = write(sockfd, &u32size, sizeof(u32size)); + if (ret != sizeof(size)) + return -2; + + + do{ + ret = write(sockfd, &buf[pos], size-pos); + pos += ret; + } while (pos < size); + + + return 0; +} + +int gfx_finalize(){ + // uint32_t u32tag = (uint32_t)(-1); + uint32_t u32tag = 1111; +#if SINGLE_CONNECT + if (myrank == SINGLE_CONNECT_RANK) { + write(sockfd, &u32tag, sizeof(u32tag)); + close(sockfd); + } +#endif + return 0; +} + +#endif diff --git a/apps/gfx_client.h b/apps/gfx_client.h new file mode 100644 index 00000000..c36743c7 --- /dev/null +++ b/apps/gfx_client.h @@ -0,0 +1,50 @@ +/* + * Copyright 2011 Sarah Fischer, Nicolas Berr, Pablo Reble + * Chair for Operating Systems, RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#ifndef __GFX_CLIENT_H__ +#define __GFX_CLIENT_H__ + +#include +#include +#include + +#ifdef CONFIG_LWIP + +#define BUFSIZE 1024 + +/* + * grafik initialisieren, letzte beide argumente, ip und port, werden entfernt + * verbindung zu server aufbauen, kollektiver aufruf, erstmal nur rank 0 connecten +*/ +//int gfx_init(int* pargc, char*** pargv, int rank); +int gfx_init(char* ip_str, char* port_str, int rank); + +/* + * paket mit der geg. laenge wird an den server gesehendet, das tag soll auch uebertragen werden +*/ +int gfx_send(char* buf, int size, int tag); + +/* + * kollektiver aufruf, vorhandene verbindungen kontrolliert beenden +*/ +int gfx_finalize(); + +#endif + +#endif diff --git a/apps/gfx_generic.c b/apps/gfx_generic.c new file mode 100644 index 00000000..63b6e570 --- /dev/null +++ b/apps/gfx_generic.c @@ -0,0 +1,138 @@ +/* + * Copyright 2011 Sarah Fischer, Nicolas Berr, Pablo Reble + * Chair for Operating Systems, RWTH Aachen University + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * This file is part of MetalSVM. + */ + +#include "gfx_client.h" +#include "gfx_generic.h" + +#ifdef CONFIG_LWIP + +int GFX_init(int* pargc, char*** pargv, int rank) +{ + return gfx_init(pargc, pargv, rank); +} + +int GFX_send(char* buf, int size, int tag) +{ + return gfx_send(buf, size, tag); +} + +int GFX_finalize() +{ + return gfx_finalize(); +} + +int GFX_update() +{ + return gfx_send(NULL, 0, GFX_UPDATE); +} + +int GFX_usleep(int sleep_time) +{ + int buf[1]; + buf[0] = sleep_time; + return gfx_send((char*)buf, sizeof(int), GFX_USLEEP); +} + +int GFX_set_rgb(int index, int r, int g, int b) +{ + int buf[4]; + buf[0] = index; + buf[1] = r; + buf[2] = g; + buf[3] = b; + return gfx_send((char*)buf, 4*sizeof(int), GFX_SET_RGB); +} + +int GFX_set_xy(int x, int y) +{ + int buf[2]; + buf[0] = x; + buf[1] = y; + return gfx_send((char*)buf, 2*sizeof(int), GFX_SET_XY); +} + +int GFX_set_hd(int height, int direction) +{ + int buf[2]; + buf[0] = height; + buf[1] = direction; + return gfx_send((char*)buf, 2*sizeof(int), GFX_SET_HD); +} + + +int GFX_draw_data(char *buf, int len) +{ + return gfx_send(buf, len, GFX_DRAW_DATA); +} + +int GFX_draw_pixel(int x, int y, int color) +{ + int buf[3]; + buf[0] = x; + buf[1] = y; + buf[2] = color; + return gfx_send((char*)buf, 3*sizeof(int), GFX_DRAW_PIXEL); +} + +int GFX_draw_line(int x1, int y1, int x2, int y2, int color) +{ + int buf[5]; + buf[0] = x1; + buf[1] = y1; + buf[2] = x2; + buf[3] = y2; + buf[4] = color; + return gfx_send((char*)buf, 5*sizeof(int), GFX_DRAW_LINE); +} + +int GFX_draw_box(int x, int y, int height, int width, int color) +{ + int buf[5]; + buf[0] = x; + buf[1] = y; + buf[2] = height; + buf[3] = width; + buf[4] = color; + return gfx_send((char*)buf, 5*sizeof(int), GFX_DRAW_BOX); +} + +int GFX_draw_text(int x, int y, int color, char *text) +{ + int buf[32]; + buf[0] = x; + buf[1] = y; + buf[2] = color; + strcpy((char*)&(buf[3]), text); + + return gfx_send((char*)buf, 32*sizeof(int), GFX_DRAW_TEXT); +} + +int GFX_draw_points(int* points, int num) +{ + return gfx_send((char*)points, num*3*sizeof(int), GFX_DRAW_POINTS); +} + +int GFX_draw_poly(int* points, int num, int color) +{ + int i; + for(i=0; i +#include +#include +#include + +#ifdef CONFIG_ROCKCREEK + +#include +#include + +#define _LAPLACE_SHMEM_ +//#define _USE_GFX + +#ifdef _LAPLACE_SHMEM_ +#define SINGLE_CONNECT 1 +#else +#define SINGLE_CONNECT 0 +#endif + +#ifdef _USE_GFX +#include "gfx_generic.h" +#include "gfx_client.h" +#endif + +#define ABS(a) (((a) < 0) ? -(a) : (a)) +#define MAX(a,b) (((a) < (b)) ? (b) : (a)) + +#define N 512 +#define M 512 + +#define TMAX 100*50 + +//#define DATA unsigned int +#define DATA double +//#define FIX 1024 +#define FIX 1 + +#define USE_SVM 0 +#define MEMTYPE SVM_STRONG +//#define MEMTYPE SVM_LAZYRELEASE + +static inline double pow(double a, int b) +{ + double base = a; + int i; + + for (i = 1; i < b; ++i) + a *= base; + + return a; +} + +int laplace(void *arg) +{ + //char* argv[] = {"/bin/laplace", "192.168.4.254", "12301", NULL}; + //int argc = 3; + uint32_t flags; +#ifdef _USE_GFX + uint32_t ret; +#endif + int t; + + int i, I, j, J; + int my_rank; + int num_ranks; + + int n; + int m; + + volatile DATA **NewValues; + volatile DATA **OldValues; + + volatile DATA **tmp; + + volatile char **BufValues; + + uint64_t start, end; + + flags = irq_nested_disable(); + my_rank = RCCE_ue(); + num_ranks = RCCE_num_ues(); + irq_nested_enable(flags); + +#ifdef _USE_GFX + kprintf("Laplace calls gfx_init\n"); + ret = gfx_init("192.168.4.254" /*&argc */ , "5000" /*&argv */ , my_rank); + kprintf("gfx_init: %d\n", ret); +#endif + + m = M; + J = 0; + + n = N / num_ranks; + + if (my_rank == num_ranks - 1) + n += N % num_ranks; + I = n * my_rank; + + kprintf("(%d) %d x %d / offsets: %d, %d / (%d x %d)\n", my_rank, N, M, I, J, n, m); + +#ifdef _USE_GFX + if (my_rank == 0) { + for (i = 0; i < 256; i++) { +//set color index, r, g, b + if (i < 64) + GFX_set_rgb(i, 0, i * 256 / 64, 255); + else if (i < 128) + GFX_set_rgb(i, 0, 255, 255 - ((i - 64) * 256 / 64)); + else if (i < 192) + GFX_set_rgb(i, (i - 128) * 256 / 64, 255, 0); + else if (i < 256) + GFX_set_rgb(i, 255, 255 - ((i - 192) * 256 / 64), 0); + } +// TODO: move draw area to center + //GFX_set_xy(150, 150); + GFX_set_hd(N, 0); + } +#endif + + NewValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); +#if USE_SVM + NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), MEMTYPE); +#else + NewValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); +#endif + + OldValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); +#if USE_SVM + OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), MEMTYPE); +#else + OldValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); +#endif + + for (i = 1; i < N + 2; i++) { + NewValues[i] = NewValues[i - 1] + (M + 2); + OldValues[i] = OldValues[i - 1] + (M + 2); + } + + BufValues = (volatile char **)kmalloc((N) * sizeof(char *)); + BufValues[0] = (char *)kmalloc((N) * (M) * sizeof(char)); + + for (i = 1; i < N; i++) { + BufValues[i] = BufValues[i - 1] + (M); + } + + RCCE_barrier(&RCCE_COMM_WORLD); + + kprintf("(%d) Memory allocated!\n", my_rank); + + //while (1) + { + int height = N + 2; + int width = M + 2; + + if (my_rank == 0) { + for (i = 0; i < N + 2; i++) { + for (j = 0; j < M + 2; j++) { + + double X = (((double)j / (double)width) * 5.0) - 2.5; + double Y = (((double)i / (double)height) * 5.0) - 2.5; + double Z = 0.0; + + Z = pow((4 - (X + 1) * (X + 1) - 4 * Y * Y), 2) + pow(1.2 * (1 - X), 3) - 10; + + if (Z < 0.0) + Z = 1.0; + else if (Z > 0.0) + Z = 0.0; + + NewValues[i][j] = (DATA) ((Z) * 255.0) * FIX; + + //if(NewValues[i][j] < 0) NewValues[i][j] = 0; + } + } + + for (i = 0; i < N + 2; i++) { + for (j = 0; j < M + 2; j++) { + OldValues[i][j] = NewValues[i][j]; + } + } + } + + svm_flush(); + svm_invalidate(); + RCCE_barrier(&RCCE_COMM_WORLD); + + kprintf("(%d) Arrays initialized!\n", my_rank); + + start = rdtsc(); + start = rdtsc(); + +// START ITERATIONS LOOP + for (t = 0; t < TMAX; t++) { + + //kprintf("(%d): o:%u n:%u \n",my_rank,(unsigned int)(OldValues[I+1][J+1]), (unsigned int)(NewValues[I+1][J+1]) ); + +// over all collumns + for (i = 1; i < n + 1; i++) { +// over all rows + for (j = 1; j < m + 1; j++) { +#if 1 + NewValues[I + i][J + j] = + (OldValues[I + i - 1][J + j] + + OldValues[I + i + 1][J + j] + + OldValues[I + i][J + j - 1] + + OldValues[I + i][J + j + 1]) / 4; + //if ( NewValues[I+i][J+j] < 0.0 ) NewValues[I+i][J+j] = 0.0 * FIX; + //else if ( NewValues[I+i][J+j] > 255.0 ) NewValues[I+i][J+j] = 255.0 * FIX; +#else + NewValues[I + i][J + j] = 25 * (DATA) (my_rank + 1); +#endif + } + } + + svm_flush(); + svm_invalidate(); + + tmp = NewValues; + NewValues = OldValues; + OldValues = tmp; + + RCCE_barrier(&RCCE_COMM_WORLD); + +#ifdef _USE_GFX + if ((my_rank == 0) && (t % 50 == 0)) { + int diff, res = 0; + + for (i = 1; i < N + 1; i++) { + for (j = 1; j < M + 1; j++) { + + diff = ABS(NewValues[i][j] - OldValues[i][j]); + if (diff > res) + res = diff; + + BufValues[i - 1][j - 1] = (unsigned char)(NewValues[i][j] / FIX); + //GFX_draw_pixel(150+j, 150+my_rank*n+i, (unsigned char)NewValues[i+1][j+1]); + //GFX_update(); + } + } + + kprintf("Graphic UPDATE! (t=%d) residual:%u \n", t, res); + GFX_draw_data((char *)(BufValues[0]), (N) * (M)); + GFX_update(); + } +#endif +// END ITERATIONS LOOP + } + + RCCE_barrier(&RCCE_COMM_WORLD); + + end = rdtsc(); + + kprintf("Calculation time: %llu ms (%llu ticks)\n", (end-start)/(1000ULL*get_cpu_frequency()), end-start); + + svm_statistics(); + } + + kprintf("(%d) Algorithm completed!\n", my_rank); + + // TODO: Freeing memory regions + +#ifdef _USE_GFX + gfx_finalize(); +#endif + + return 0; +} + +#endif From dcfbb44213d9a314f311fc13f3b1e32c11151a78 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 21 Oct 2011 00:10:57 -0700 Subject: [PATCH 19/43] use a benchmark friendly problem size --- apps/laplace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/laplace.c b/apps/laplace.c index f1d9988d..10fd3d76 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -44,8 +44,8 @@ #define ABS(a) (((a) < 0) ? -(a) : (a)) #define MAX(a,b) (((a) < (b)) ? (b) : (a)) -#define N 512 -#define M 512 +#define N 510 +#define M 510 #define TMAX 100*50 From 5687380ea0124f7cd2d37e8cf98c55728cbe19b0 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 21 Oct 2011 14:16:39 -0700 Subject: [PATCH 20/43] remove bug in the calculation of I --- apps/laplace.c | 16 +++++++++++----- apps/tests.c | 9 ++++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/apps/laplace.c b/apps/laplace.c index 10fd3d76..a892d61b 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -44,17 +44,17 @@ #define ABS(a) (((a) < 0) ? -(a) : (a)) #define MAX(a,b) (((a) < (b)) ? (b) : (a)) -#define N 510 +#define N 1022 #define M 510 -#define TMAX 100*50 +#define TMAX (100*50) //#define DATA unsigned int #define DATA double //#define FIX 1024 #define FIX 1 -#define USE_SVM 0 +#define USE_SVM 1 #define MEMTYPE SVM_STRONG //#define MEMTYPE SVM_LAZYRELEASE @@ -110,10 +110,10 @@ int laplace(void *arg) J = 0; n = N / num_ranks; + I = n * my_rank; if (my_rank == num_ranks - 1) n += N % num_ranks; - I = n * my_rank; kprintf("(%d) %d x %d / offsets: %d, %d / (%d x %d)\n", my_rank, N, M, I, J, n, m); @@ -199,8 +199,10 @@ int laplace(void *arg) } } +#if USE_SVM svm_flush(); svm_invalidate(); +#endif RCCE_barrier(&RCCE_COMM_WORLD); kprintf("(%d) Arrays initialized!\n", my_rank); @@ -230,14 +232,16 @@ int laplace(void *arg) #endif } } - +#if USE_SVM svm_flush(); svm_invalidate(); +#endif tmp = NewValues; NewValues = OldValues; OldValues = tmp; + //RCCE_TNS_barrier(&RCCE_COMM_WORLD); RCCE_barrier(&RCCE_COMM_WORLD); #ifdef _USE_GFX @@ -271,7 +275,9 @@ int laplace(void *arg) kprintf("Calculation time: %llu ms (%llu ticks)\n", (end-start)/(1000ULL*get_cpu_frequency()), end-start); +#if USE_SVM svm_statistics(); +#endif } kprintf("(%d) Algorithm completed!\n", my_rank); diff --git a/apps/tests.c b/apps/tests.c index e6bd093b..65f4f465 100644 --- a/apps/tests.c +++ b/apps/tests.c @@ -40,6 +40,8 @@ static sem_t consuming, producing; static mailbox_int32_t mbox; static int val = 0; +int laplace(void* arg); + static int consumer(void* arg) { int i, m = 0; @@ -310,16 +312,17 @@ int test_init(void) sem_init(&consuming, 0); mailbox_int32_init(&mbox); - 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, pi, NULL, NORMAL_PRIO); + create_kernel_task(NULL, laplace, 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/mshell", argv); //create_user_task(NULL, "/bin/jacobi", argv); From 2db441bc176107ba2348c19a6361508a96a212c6 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 21 Oct 2011 14:17:54 -0700 Subject: [PATCH 21/43] add temporary workaround to distribute shared pages over all memory controllers --- arch/x86/mm/svm.c | 79 ++++++++++++++++++++++++++++++++++++---------- arch/x86/scc/icc.c | 12 +++---- 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/arch/x86/mm/svm.c b/arch/x86/mm/svm.c index a757bc2c..6a0449b2 100644 --- a/arch/x86/mm/svm.c +++ b/arch/x86/mm/svm.c @@ -49,7 +49,6 @@ static volatile uint8_t* page_owner = NULL; // helper array to convert a physical to a virtual address static size_t phys2virt[SHARED_PAGES] = {[0 ... SHARED_PAGES-1] = 0}; static size_t shmbegin = 0; -static int my_ue = 0; static uint32_t emit[RCCE_MAXNP] = {[0 ... RCCE_MAXNP-1] = 0}; static uint32_t request[RCCE_MAXNP] = {[0 ... RCCE_MAXNP-1] = 0}; static uint32_t forward[RCCE_MAXNP] = {[0 ... RCCE_MAXNP-1] = 0}; @@ -61,7 +60,6 @@ int svm_init(void) // iRCCE is not thread save => disable interrupts flags = irq_nested_disable(); - my_ue = RCCE_ue(); shmbegin = (size_t)RC_SHM_BUFFER_START(); phyaddr = (size_t) RCCE_shmalloc(OWNER_SIZE); irq_nested_enable(flags); @@ -84,7 +82,7 @@ int svm_init(void) } // per default is core 0 owner - if (!my_ue) + if (!RCCE_IAM) memset((void*)page_owner, 0x00, OWNER_SIZE); // iRCCE is not thread save => disable interrupts @@ -112,32 +110,29 @@ int svm_access_request(size_t addr) return -EINVAL; pageid = (phyaddr-shmbegin) >> PAGE_SHIFT; - //svm_flush(); - if (page_owner[pageid] == my_ue) + if (page_owner[pageid] == RCCE_IAM) return 0; remote_rank = page_owner[pageid]; - ((size_t*) payload)[0] = my_ue; + ((size_t*) payload)[0] = RCCE_IAM; ((size_t*) payload)[1] = phyaddr; - //kprintf("send access request to %d of 0x%x\n", remote_rank, phyaddr); /* send ping request */ iRCCE_mail_send(2*sizeof(size_t), SVM_REQUEST, 0, payload, remote_rank); request[remote_rank]++; - NOP8; icc_send_gic_irq(remote_rank); - /* check for incoming messages */ - icc_mail_check(); - - while (page_owner[pageid] != my_ue) { - check_workqueues(); + while (page_owner[pageid] != RCCE_IAM) { + icc_mail_check(); + NOP8; } return change_page_permissions(addr, addr+PAGE_SIZE, VMA_READ|VMA_WRITE|VMA_CACHEABLE); } +static atomic_int32_t size_counter = ATOMIC_INIT(0); + void* svmmalloc(size_t size, uint32_t consistency) { size_t phyaddr, viraddr, i; @@ -153,11 +148,61 @@ void* svmmalloc(size_t size, uint32_t consistency) // currently, we allocate memory in page size granulation size = (size + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1); +#if 0 // Workaround for our MARC paper + // iRCCE is not thread save => disable interrupts + flags = irq_nested_disable(); + + kprintf("Entering shmmalloc: size 0x%x, owner_size 0x%x\n", size, OWNER_SIZE); + if (RCCE_IAM && (consistency & SVM_STRONG)) + map_flags |= MAP_NO_ACCESS; + + viraddr = vm_alloc(size >> PAGE_SHIFT, map_flags); + kprintf("vm_alloc returns 0x%x\n", viraddr); + + static uint32_t last = 0; + // get memory on MC0 + if (last) + phyaddr = last + size/4; + else + last = phyaddr = (size_t) RCCE_shmalloc(size/4); + map_region(viraddr, phyaddr, (size/4) >> PAGE_SHIFT, map_flags|MAP_REMAP); + for(i=0; i> PAGE_SHIFT] = viraddr + i; + kprintf("svmmalloc on MC0: phyaddr 0x%x, viraddr 0x%x, size 0x%x\n", phyaddr, viraddr, size); + + // get memory on MC1 + phyaddr = shmbegin + 0x1000000 + atomic_int32_read(&size_counter); + map_region(viraddr + size/4, phyaddr, (size/4) >> PAGE_SHIFT, map_flags|MAP_REMAP); + for(i=0; i> PAGE_SHIFT] = viraddr + size/4 + i; + kprintf("svmmalloc on MC1: phyaddr 0x%x, viraddr 0x%x, size 0x%x\n", phyaddr, viraddr+size/4, size); + + // get memory on MC2 + phyaddr = shmbegin + 0x2000000 + atomic_int32_read(&size_counter); + map_region(viraddr + 2 * size/4, phyaddr, (size/4) >> PAGE_SHIFT, map_flags|MAP_REMAP); + for(i=0; i> PAGE_SHIFT] = viraddr + 2 * size/4 + i; + kprintf("svmmalloc on MC2: phyaddr 0x%x, viraddr 0x%x, size 0x%x\n", phyaddr, viraddr+2*size/4, size); + + // get memory on MC3 + phyaddr = shmbegin + 0x3000000 + atomic_int32_read(&size_counter); + map_region(viraddr + 3 * size/4, phyaddr, (size/4) >> PAGE_SHIFT, map_flags|MAP_REMAP); + for(i=0; i> PAGE_SHIFT] = viraddr + 3 * size/4 + i; + kprintf("svmmalloc on MC3: phyaddr 0x%x, viraddr 0x%x, size 0x%x\n", phyaddr, viraddr+3*size/4, size); + + atomic_int32_add(&size_counter, size/4); + irq_nested_enable(flags); + + kprintf("shmmalloc returns 0x%x\n", viraddr); + + return (void*) viraddr; +#else // iRCCE is not thread save => disable interrupts flags = irq_nested_disable(); phyaddr = (size_t) RCCE_shmalloc(size); - if (RCCE_ue() && (consistency & SVM_STRONG)) + if (RCCE_IAM && (consistency & SVM_STRONG)) map_flags |= MAP_NO_ACCESS; irq_nested_enable(flags); @@ -175,6 +220,7 @@ void* svmmalloc(size_t size, uint32_t consistency) kprintf("svmmalloc: phyaddr 0x%x, viraddr 0x%x, size 0x%x\n", phyaddr, viraddr, size); return (void*) viraddr; +#endif } void svmfree(void* addr, size_t size) @@ -218,12 +264,12 @@ int svm_emit_page(size_t phyaddr, int ue) return -EINVAL; pageid = (phyaddr-shmbegin) >> PAGE_SHIFT; - if (page_owner[pageid] != my_ue) { + if (page_owner[pageid] != RCCE_IAM) { // Core is nor owner => forward request to new owner int remote_rank; uint8_t payload[iRCCE_MAIL_HEADER_PAYLOAD]; - kprintf("Ups, core %d is not owner of page 0x%x\n", my_ue, phyaddr); + kprintf("Ups, core %d is not owner of page 0x%x\n", RCCE_IAM, phyaddr); remote_rank = page_owner[pageid]; ((size_t*) payload)[0] = ue; @@ -258,6 +304,7 @@ void svm_flush(void) *(int *)RCCE_fool_write_combine_buffer = 1; flush_cache(); +#error Currently not supported #if 0 // try to flush L2 cache z = Z_PID(RC_COREID[my_ue]); diff --git a/arch/x86/scc/icc.c b/arch/x86/scc/icc.c index 81258250..97796658 100644 --- a/arch/x86/scc/icc.c +++ b/arch/x86/scc/icc.c @@ -161,7 +161,7 @@ static void icc_handler(struct state *s) /* empty mail queue */ while( iRCCE_mail_recv(&header) == iRCCE_SUCCESS ) { icc_mail_check_tag(header); - iRCCE_mail_release( &header ); + iRCCE_mail_release(&header); NOP8; NOP8; NOP8; @@ -331,7 +331,7 @@ int icc_mail_ping(void) /* leave function if not participating in pingpong */ if( (RCCE_IAM != CORE_A) && (RCCE_IAM != CORE_B) ) return -1; - kprintf( "my_ue = %d\n", RCCE_IAM); + kprintf( "my rank = %d\n", RCCE_IAM); kprintf( "Hello from mail_ping ... \n" ); kprintf( "rounds = %d\n", ROUNDS ); @@ -401,7 +401,7 @@ int icc_mail_ping_irq(void) int res; iRCCE_MAIL_HEADER* recv_header = NULL; - kprintf( "my_rank = %d\n", RCCE_IAM ); + kprintf( "my rank = %d\n", RCCE_IAM ); kprintf( "rem_rank = %d\n", CORE_B ); kprintf( "rounds = %d\n", ROUNDS ); @@ -503,9 +503,6 @@ void icc_mail_check(void) iRCCE_mail_check(iRCCE_MAILBOX_ALL); - /* enable interrupts */ - irq_nested_enable(flags); - /* empty mail queue */ while( iRCCE_mail_recv(&header) == iRCCE_SUCCESS ) { icc_mail_check_tag(header); @@ -514,6 +511,9 @@ void icc_mail_check(void) NOP8; NOP8; } + + /* enable interrupts */ + irq_nested_enable(flags); } #endif From 1f7f702ae37bf9ab415203af7f49de408e86d611 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 21 Oct 2011 14:19:05 -0700 Subject: [PATCH 22/43] cosmetic changes --- arch/x86/scc/iRCCE_mailbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/scc/iRCCE_mailbox.c b/arch/x86/scc/iRCCE_mailbox.c index b311970d..d63e6c4b 100644 --- a/arch/x86/scc/iRCCE_mailbox.c +++ b/arch/x86/scc/iRCCE_mailbox.c @@ -170,7 +170,7 @@ static int iRCCE_mail_fetch( iRCCE_MAIL_HEADER dummy_header = {0, 0, 0, NULL, 0, 0, 0, {[0 ... iRCCE_MAIL_HEADER_PAYLOAD-1] = 0} }; -static int iRCCE_mailbox_check() { +static int iRCCE_mailbox_check(void) { int i,j; uint32_t flags; From e54b0e132b0f1ec6529812f6852b8b61422cd88d Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 21 Oct 2011 14:21:39 -0700 Subject: [PATCH 23/43] add test and set barrier --- arch/x86/include/asm/RCCE.h | 1 + arch/x86/scc/RCCE_admin.c | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/arch/x86/include/asm/RCCE.h b/arch/x86/include/asm/RCCE.h index 128ba664..d88e5723 100644 --- a/arch/x86/include/asm/RCCE.h +++ b/arch/x86/include/asm/RCCE.h @@ -190,6 +190,7 @@ int RCCE_comm_size(RCCE_COMM, int *); int RCCE_comm_rank(RCCE_COMM, int *); void RCCE_fence(void); int RCCE_barrier(RCCE_COMM *); +int RCCE_TNS_barrier(RCCE_COMM* comm); int RCCE_error_string(int, char *, int *); int RCCE_debug_set(int); int RCCE_debug_unset(int); diff --git a/arch/x86/scc/RCCE_admin.c b/arch/x86/scc/RCCE_admin.c index 78b26b21..09e70166 100644 --- a/arch/x86/scc/RCCE_admin.c +++ b/arch/x86/scc/RCCE_admin.c @@ -48,6 +48,8 @@ // En-/ or disable debug prints... #define DEBUG 0 +#define Test_and_Set(a) ((*(virtual_lockaddress[a])) & 0x01) + //...................................................................................... // GLOBAL VARIABLES USED BY THE LIBRARY //...................................................................................... @@ -105,6 +107,38 @@ void RC_cache_invalidate() { return; } +int RCCE_TNS_barrier(RCCE_COMM* comm) { + +// two roundtrips to realize a barrier using a T&S Register for each core. + +// 1. search first free T&S Register to spin +// 2. last waiter wakes up first waiter and continues local wait +// 3. first waiter wakes up second waiter by releasing its lock ... +// At least every used T&S Register is 0 and no UE can overtake a barrier. + + int num = comm->size; + int step = 0; + //fprintf(stderr,"%d:\t enter barrier \n",id); + + while( !Test_and_Set(step) ) ++step; + // only one UE runs until T&S # num-1 + + //fprintf(stderr,"%d:\t step %d\n",id,step); + + if(step == num-1) { + //fprintf(stderr,"%d:\t I am the last one\n",id); + *(virtual_lockaddress[0]) = 0x0; + while(!Test_and_Set(step)) ; + *(virtual_lockaddress[step]) = 0x0; + } else { + while(!Test_and_Set(step)) ; + *(virtual_lockaddress[step]) = 0x0; + *(virtual_lockaddress[step+1]) = 0x0; + } + //fprintf(stderr,"released barrier! step: %d\n", step); + return RCCE_SUCCESS; +} + //-------------------------------------------------------------------------------------- // FUNCTION: RC_COMM_BUFFER_SIZE //-------------------------------------------------------------------------------------- From 97a648020a9dc39ab05016978042df01e889ff6d Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Sat, 22 Oct 2011 06:13:16 -0700 Subject: [PATCH 24/43] add prefetching for the sequentiel laplace --- apps/laplace.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/apps/laplace.c b/apps/laplace.c index a892d61b..bd672299 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -219,6 +219,12 @@ int laplace(void *arg) for (i = 1; i < n + 1; i++) { // over all rows for (j = 1; j < m + 1; j++) { +#if !USE_SVM + if (j % CACHE_LINE == 1) { + asm volatile ("movl %0, %%eax" :: "r"(&(NewValues[I + i][J + j])) : "%eax"); + } +#endif + #if 1 NewValues[I + i][J + j] = (OldValues[I + i - 1][J + j] + @@ -241,8 +247,8 @@ int laplace(void *arg) NewValues = OldValues; OldValues = tmp; - //RCCE_TNS_barrier(&RCCE_COMM_WORLD); - RCCE_barrier(&RCCE_COMM_WORLD); + RCCE_TNS_barrier(&RCCE_COMM_WORLD); + //RCCE_barrier(&RCCE_COMM_WORLD); #ifdef _USE_GFX if ((my_rank == 0) && (t % 50 == 0)) { From a36cc3f3a9b93f98bd57eb50c48f65f2ff94a302 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 24 Oct 2011 01:24:37 -0700 Subject: [PATCH 25/43] redesign of the init code => now, all cores initialize the arrays --- apps/laplace.c | 50 +++++++++++++++++++++---------------------- apps/scc_bootinfo.asm | 0 2 files changed, 24 insertions(+), 26 deletions(-) create mode 100644 apps/scc_bootinfo.asm diff --git a/apps/laplace.c b/apps/laplace.c index bd672299..f017f89b 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -54,9 +54,12 @@ //#define FIX 1024 #define FIX 1 -#define USE_SVM 1 -#define MEMTYPE SVM_STRONG -//#define MEMTYPE SVM_LAZYRELEASE +#define USE_STRONG 1 +#define USE_LAZYRELEASE 0 + +#if USE_STRONG && USE_LAZYRELEASE +#error Please, use only one memory model +#endif static inline double pow(double a, int b) { @@ -137,15 +140,19 @@ int laplace(void *arg) #endif NewValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); -#if USE_SVM - NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), MEMTYPE); +#if USE_STRONG + NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_STRONG); +#elif USE_LATYRELEASE + NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_LAZYRELEASE); #else NewValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); #endif OldValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); -#if USE_SVM - OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), MEMTYPE); +#if USE_STRONG + OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_STRONG); +#elif USE_LATYRELEASE + OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_LAZYRELEASE); #else OldValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); #endif @@ -171,8 +178,11 @@ int laplace(void *arg) int height = N + 2; int width = M + 2; - if (my_rank == 0) { + /*if (my_rank == 0) { for (i = 0; i < N + 2; i++) { + for (j = 0; j < M + 2; j++) {*/ + { + for (i = I; i < I + n + 2; i++) { for (j = 0; j < M + 2; j++) { double X = (((double)j / (double)width) * 5.0) - 2.5; @@ -186,20 +196,14 @@ int laplace(void *arg) else if (Z > 0.0) Z = 0.0; - NewValues[i][j] = (DATA) ((Z) * 255.0) * FIX; + OldValues[i][j] = NewValues[i][j] = (DATA) ((Z) * 255.0) * FIX; //if(NewValues[i][j] < 0) NewValues[i][j] = 0; } } - - for (i = 0; i < N + 2; i++) { - for (j = 0; j < M + 2; j++) { - OldValues[i][j] = NewValues[i][j]; - } - } } -#if USE_SVM +#if USE_LAZYRELEASE svm_flush(); svm_invalidate(); #endif @@ -219,12 +223,6 @@ int laplace(void *arg) for (i = 1; i < n + 1; i++) { // over all rows for (j = 1; j < m + 1; j++) { -#if !USE_SVM - if (j % CACHE_LINE == 1) { - asm volatile ("movl %0, %%eax" :: "r"(&(NewValues[I + i][J + j])) : "%eax"); - } -#endif - #if 1 NewValues[I + i][J + j] = (OldValues[I + i - 1][J + j] + @@ -238,7 +236,7 @@ int laplace(void *arg) #endif } } -#if USE_SVM +#if USE_LAZYRELEASE svm_flush(); svm_invalidate(); #endif @@ -247,8 +245,8 @@ int laplace(void *arg) NewValues = OldValues; OldValues = tmp; - RCCE_TNS_barrier(&RCCE_COMM_WORLD); - //RCCE_barrier(&RCCE_COMM_WORLD); + //RCCE_TNS_barrier(&RCCE_COMM_WORLD); + RCCE_barrier(&RCCE_COMM_WORLD); #ifdef _USE_GFX if ((my_rank == 0) && (t % 50 == 0)) { @@ -281,7 +279,7 @@ int laplace(void *arg) kprintf("Calculation time: %llu ms (%llu ticks)\n", (end-start)/(1000ULL*get_cpu_frequency()), end-start); -#if USE_SVM +#if USE_STRONG || USE_LAZYRELEASE svm_statistics(); #endif } diff --git a/apps/scc_bootinfo.asm b/apps/scc_bootinfo.asm new file mode 100644 index 00000000..e69de29b From 63b9e2e177e9efedd89748f00f19dc6cd58a56fc Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 24 Oct 2011 16:20:29 +0200 Subject: [PATCH 26/43] switch back to default test cases --- apps/tests.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/tests.c b/apps/tests.c index 65f4f465..d6b8a5eb 100644 --- a/apps/tests.c +++ b/apps/tests.c @@ -312,17 +312,17 @@ int test_init(void) sem_init(&consuming, 0); mailbox_int32_init(&mbox); - //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, pi, NULL, NORMAL_PRIO); - create_kernel_task(NULL, laplace, NULL, NORMAL_PRIO); + //create_kernel_task(NULL, laplace, 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/mshell", argv); //create_user_task(NULL, "/bin/jacobi", argv); From 610f8177d805c807b924ae253d68b576a8d0d9b2 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 24 Oct 2011 16:23:25 +0200 Subject: [PATCH 27/43] remove compiling problems on non-SCC plattforms --- apps/netio.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/apps/netio.c b/apps/netio.c index 088fe6b0..9a6c374c 100644 --- a/apps/netio.c +++ b/apps/netio.c @@ -47,20 +47,24 @@ /* See http://www.nwlab.net/art/netio/netio.html to get the netio tool */ #ifdef CONFIG_LWIP +#ifdef CONFIG_ROCKCREEK #if USE_SOCKET_BYPASSING // for socket bypassing #include #undef LWIP_COMPAT_SOCKETS #endif +#endif #include #include #include +#ifdef CONFIG_ROCKCREEK #if USE_SOCKET_BYPASSING // for socket bypassing #include #undef AF_INET #define AF_INET AF_MMNIF_NET #endif +#endif typedef struct { From 71e4cf3d29c459dc48c2f8240602a7011402d6c3 Mon Sep 17 00:00:00 2001 From: Jacek Galowicz Date: Mon, 24 Oct 2011 16:43:41 +0200 Subject: [PATCH 28/43] Fixed the documentation's HTML templates. Things were not displayed properly. --- Doxyfile | 8 ++-- documentation/tmpl/footer.html | 9 ++++ documentation/tmpl/header.html | 73 ++++++++++++++++++++----------- documentation/tmpl/stylesheet.css | 69 ++++++++++++++++++++++------- 4 files changed, 113 insertions(+), 46 deletions(-) diff --git a/Doxyfile b/Doxyfile index 352ee44e..8a8ba639 100644 --- a/Doxyfile +++ b/Doxyfile @@ -42,7 +42,7 @@ PROJECT_BRIEF = "A Bare-Metal Hypervisor for Non-Coherent Memory-Couple # exceed 55 pixels and the maximum width should not exceed 200 pixels. # Doxygen will copy the logo to the output directory. -PROJECT_LOGO = +PROJECT_LOGO = documentation/img/lfbs_logo.gif # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) # base path where the generated documentation will be put. @@ -913,17 +913,17 @@ DOCSET_FEEDNAME = "Doxygen generated docs" # reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen # will append .docset to the name. -DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_BUNDLE_ID = de.rwth-aachen.lfbs # When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify # the documentation publisher. This should be a reverse domain-name style # string, e.g. com.mycompany.MyDocSet.documentation. -DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_ID = de.rwth-aachen.lfbs # The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. -DOCSET_PUBLISHER_NAME = Publisher +DOCSET_PUBLISHER_NAME = LfBS # If the GENERATE_HTMLHELP tag is set to YES, additional index files # will be generated that can be used as input for tools like the diff --git a/documentation/tmpl/footer.html b/documentation/tmpl/footer.html index 6725e7cd..3fda0093 100644 --- a/documentation/tmpl/footer.html +++ b/documentation/tmpl/footer.html @@ -1,4 +1,13 @@ + + + + + + + diff --git a/documentation/tmpl/header.html b/documentation/tmpl/header.html index b1a6a471..97a54784 100644 --- a/documentation/tmpl/header.html +++ b/documentation/tmpl/header.html @@ -1,27 +1,50 @@ - - - $title - - - - - - - -
-
- - - - - - -
-
MetalSVM
- - -
A Bare-Metal Hypervisor for Non-Coherent Memory-Coupled Cores
-
-
+ + +$title + + +$treeview +$search +$mathjax + + +
+ +
+ + + + + + + + + + + + + + + + + + + + + + +
+
$projectname +  $projectnumber +
+
$projectbrief
+
+
$projectbrief
+
$searchbox
+
+ diff --git a/documentation/tmpl/stylesheet.css b/documentation/tmpl/stylesheet.css index 125800f1..16144fd4 100644 --- a/documentation/tmpl/stylesheet.css +++ b/documentation/tmpl/stylesheet.css @@ -11,6 +11,12 @@ h1 { font-size: 150%; } +.title { + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + h2 { font-size: 120%; } @@ -185,7 +191,7 @@ body { div.contents { margin-top: 10px; margin-left: 10px; - margin-right: 10px; + margin-right: 5px; } td.indexkey { @@ -361,6 +367,10 @@ table.memberdecls { white-space: nowrap; } +.memItemRight { + width: 100%; +} + .memTemplParams { color: #4665A2; white-space: nowrap; @@ -388,9 +398,14 @@ table.memberdecls { padding: 2px; } +.mempage { + width: 100%; +} + .memitem { padding: 0; margin-bottom: 10px; + margin-right: 5px; } .memname { @@ -724,7 +739,7 @@ dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.note { - border-color: #D0D000; + border-color: #D0C000; } dl.warning, dl.attention @@ -768,20 +783,6 @@ dl.bug { border: 0px none; } - -#projectname -{ - font: 300% arial,sans-serif; - margin: 0px; - padding: 0px; -} - -#projectbrief -{ - font: 120% arial,sans-serif; - margin: 0px; - padding: 0px; -} #lfbslogo { @@ -796,10 +797,24 @@ dl.bug top: 5px; right: 5px; } + +#projectname +{ + font: 300% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font: 120% Tahoma, Arial,sans-serif; + margin: 0px; + padding: 0px; +} #projectnumber { - font: 50% arial,sans-serif; + font: 50% Tahoma, Arial,sans-serif; margin: 0px; padding: 0px; } @@ -812,3 +827,23 @@ dl.bug border-bottom: 1px solid #5373B4; } +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + From 5a4bd9a069a11b591345d73532842fdc2951739b Mon Sep 17 00:00:00 2001 From: Jacek Galowicz Date: Mon, 24 Oct 2011 19:26:27 +0200 Subject: [PATCH 29/43] Fixed some documentation errors across the project. Changed some stuff in the doxyfile and added a directory structure for future manual pages. --- Doxyfile | 24 ++++++++------- arch/x86/include/asm/tasks.h | 2 +- arch/x86/scc/iRCCE_mailbox.c | 12 ++------ documentation/text/compilation.dox | 12 ++++++++ documentation/text/mainpage.dox | 47 ++++++++++++++++++++++++++++++ documentation/tmpl/stylesheet.css | 5 ++++ include/metalsvm/fs.h | 6 ++-- include/metalsvm/semaphore.h | 1 + include/metalsvm/tasks.h | 1 + include/metalsvm/time.h | 2 +- kernel/tasks.c | 1 + 11 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 documentation/text/compilation.dox create mode 100644 documentation/text/mainpage.dox diff --git a/Doxyfile b/Doxyfile index 8a8ba639..b9126c9c 100644 --- a/Doxyfile +++ b/Doxyfile @@ -536,7 +536,7 @@ FILE_VERSION_FILTER = # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. -LAYOUT_FILE = +LAYOUT_FILE = #--------------------------------------------------------------------------- # configuration options related to warning and progress messages @@ -599,14 +599,14 @@ WARN_LOGFILE = # with spaces. INPUT = ./fs \ - ./include \ - ./kernel \ - ./drivers \ - ./arch \ - ./libkern \ - ./mm \ - ./tools \ - ./documentation/doxy_mainpage.h + ./include \ + ./kernel \ + ./drivers \ + ./arch \ + ./libkern \ + ./mm \ + ./tools \ + ./documentation/text/mainpage.dox # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is @@ -624,7 +624,11 @@ INPUT_ENCODING = UTF-8 # *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py # *.f90 *.f *.for *.vhd *.vhdl -FILE_PATTERNS = +FILE_PATTERNS += *.c +FILE_PATTERNS += *.h +FILE_PATTERNS += *.asm +FILE_PATTERNS += *.S +FILE_PATTERNS += *.dox # The RECURSIVE tag can be used to turn specify whether or not subdirectories # should be searched for input files as well. Possible values are YES and NO. diff --git a/arch/x86/include/asm/tasks.h b/arch/x86/include/asm/tasks.h index 206f5ad2..9f45b691 100644 --- a/arch/x86/include/asm/tasks.h +++ b/arch/x86/include/asm/tasks.h @@ -50,7 +50,7 @@ int dump_scheduling_statistics(void); */ int arch_fork(task_t* task); -/** @brieff Switch to new task +/** @brief Switch to new task * @param id Task Id */ void switch_task(uint32_t id); diff --git a/arch/x86/scc/iRCCE_mailbox.c b/arch/x86/scc/iRCCE_mailbox.c index b311970d..47660b75 100644 --- a/arch/x86/scc/iRCCE_mailbox.c +++ b/arch/x86/scc/iRCCE_mailbox.c @@ -27,7 +27,8 @@ /** * - * @file contains implementation of the mailbox system + * @file iRCCE_mailbox.c + * @brief contains implementation of the mailbox system * @author Simon Pickartz * * @@ -40,15 +41,6 @@ #include #include -/** - * - * @file contains implementation of the mailbox system - * @author Simon Pickartz - * - * - */ - - // forward declaration static int iRCCE_mailbox_close_one(int rank, int check); diff --git a/documentation/text/compilation.dox b/documentation/text/compilation.dox new file mode 100644 index 00000000..833cbf20 --- /dev/null +++ b/documentation/text/compilation.dox @@ -0,0 +1,12 @@ +/** + * @file manual.dox + * @page manual Manual Contents + * + * @section Readme + * + * This document contains some explanations about stuff. + * + * @subsection Compiling + * + * + */ diff --git a/documentation/text/mainpage.dox b/documentation/text/mainpage.dox new file mode 100644 index 00000000..03a039da --- /dev/null +++ b/documentation/text/mainpage.dox @@ -0,0 +1,47 @@ +/** + * @file mainpage.dox + * @mainpage + * + * @section Introduction + * + * On a traditional multicore system, a single operating system + * manages all cores and schedules threads and processes among + * them, inherently supported by hardware-implemented cache + * coherence protocols. However, a further growth of the number + * of cores per system implies an increasing chip complexity, + * especially with respect to the cache coherence protocols. + * Therefore, a very attractive alternative for future many-core + * systems is to waive the hardware-based cache coherency and to + * introduce a software-oriented message-passing based architecture + * instead: a so-called Cluster-on-Chip architecture. + * Intel's Single-chip Cloud Computer (SCC), a many-core research + * processor with 48 non-coherent memory-coupled cores, is a very + * recent example for such a Cluster-on-Chip architecture. The SCC + * can be configured to run one operating system per core by + * partitioning the shared main memory in a strict manner. However, + * it is also possible to access the shared main memory in an unsplit + * and concurrent manner, provided that the cache coherency is then + * ensured by software. + * + * @section Research Objective + * + * In this project, we develop a new approach for a SCC-related shared + * virtual memory management system, called MetalSVM, that will be + * implemented in terms of a bare-metal hypervisor, located within a + * virtualization layer between the SCC's hardware and the actual + * operating system. This new hypervisor will undertake the crucial + * task of coherency management by utilizing special SCC-related features + * as, for example, its on-die Message-Passing Buffers (MPB). That way, + * common Linux kernels will be able to run almost transparently across + * the entire SCC system. However, in order to offer a maximum of flexibility + * with respect to resource allocation as well as to an efficiency-adjusted + * degree of parallelism, also a dynamic partitioning of the SCC's computing + * resources into several coherency domains will be made possible. + * + * @image html metalsvm_stack.jpg + * + * @section Acknowledgment + * + * This research project is funded by Intel Corporation. + * + */ diff --git a/documentation/tmpl/stylesheet.css b/documentation/tmpl/stylesheet.css index 16144fd4..d27dd30b 100644 --- a/documentation/tmpl/stylesheet.css +++ b/documentation/tmpl/stylesheet.css @@ -847,3 +847,8 @@ dl.bug font-weight: bold; } +.textblock +{ + width: 950px; + textalign: justify; +} diff --git a/include/metalsvm/fs.h b/include/metalsvm/fs.h index 2dd14578..8d3736fd 100644 --- a/include/metalsvm/fs.h +++ b/include/metalsvm/fs.h @@ -202,10 +202,9 @@ extern vfs_node_t* fs_root; // The root of the filesystem. */ /** @brief Read from file system into the buffer - * @param node Pointer to the node to read from + * @param file Pointer to the file descriptor to read from * @param buffer Pointer to buffer to write into * @param size Number of bytes to read - * @param offset Offset position of the source range * @return * - number of bytes copied (size) * - 0 on error @@ -213,10 +212,9 @@ extern vfs_node_t* fs_root; // The root of the filesystem. ssize_t read_fs(fildes_t* file, uint8_t* buffer, size_t size); /** @brief Write into the file system from the buffer - * @param node Pointer to the node to write to + * @param file Pointer to the file descriptor to write to * @param buffer Pointer to buffer to read from * @param size Number of bytes to read - * @param offset Offset position of the destination range * @return * - number of bytes copied (size) * - 0 on error diff --git a/include/metalsvm/semaphore.h b/include/metalsvm/semaphore.h index c0dc0f81..1f98471c 100644 --- a/include/metalsvm/semaphore.h +++ b/include/metalsvm/semaphore.h @@ -103,6 +103,7 @@ inline static int sem_trywait(sem_t* s) { /** @brief Blocking wait for semaphore * + * @param s Address of the according sem_t structure * @param ms Timeout in milliseconds * @return * - 0 on success diff --git a/include/metalsvm/tasks.h b/include/metalsvm/tasks.h index 9e6ab05f..63c8b3f4 100644 --- a/include/metalsvm/tasks.h +++ b/include/metalsvm/tasks.h @@ -60,6 +60,7 @@ int multitasking_init(void); * @param id The value behind this pointer will be set to the new task's id * @param ep Pointer to the entry function for the new task * @param arg Arguments the task shall start with + * @param prio Desired priority of the new kernel task * * @return * - 0 on success diff --git a/include/metalsvm/time.h b/include/metalsvm/time.h index c20d059c..8c4b7258 100644 --- a/include/metalsvm/time.h +++ b/include/metalsvm/time.h @@ -73,7 +73,7 @@ uint64_t get_clock_tick(void); * * This function sleeps some seconds * - * @paran sec Amount of seconds to wait + * @param sec Amount of seconds to wait */ static inline void sleep(unsigned int sec) { timer_wait(sec*TIMER_FREQ); } diff --git a/kernel/tasks.c b/kernel/tasks.c index 39e215e1..7d00b2b5 100644 --- a/kernel/tasks.c +++ b/kernel/tasks.c @@ -244,6 +244,7 @@ void NORETURN abort(void) { * @param id Pointer to a tid_t struct were the id shall be set * @param ep Pointer to the function the task shall start with * @param arg Arguments list + * @param prio Desired priority of the new task * @return * - 0 on success * - -ENOMEM (-12) or -EINVAL (-22) on failure From ffc7064baaf75a48dae639b244046a819a613a52 Mon Sep 17 00:00:00 2001 From: Jacek Galowicz Date: Mon, 24 Oct 2011 23:55:53 +0200 Subject: [PATCH 30/43] Enabled the Doxygen configuration to greedily take any documentation page it finds to embedd it into the HTMl-documentation. Started to adopt the compiling tutorial from L2P. --- Doxyfile | 2 +- documentation/text/compilation.dox | 94 ++++++++++++++++++++++++++++-- 2 files changed, 90 insertions(+), 6 deletions(-) diff --git a/Doxyfile b/Doxyfile index b9126c9c..b7514d3d 100644 --- a/Doxyfile +++ b/Doxyfile @@ -606,7 +606,7 @@ INPUT = ./fs \ ./libkern \ ./mm \ ./tools \ - ./documentation/text/mainpage.dox + ./documentation/text # This tag can be used to specify the character encoding of the source files # that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is diff --git a/documentation/text/compilation.dox b/documentation/text/compilation.dox index 833cbf20..1c485a68 100644 --- a/documentation/text/compilation.dox +++ b/documentation/text/compilation.dox @@ -1,12 +1,96 @@ /** - * @file manual.dox - * @page manual Manual Contents + * @file compilation.dox + * @page compilation Compiling and Running MetalSVM * - * @section Readme + * @section checkout Checking out MetalSVM online + * + * The MetalSVM project is hosted in a Git repository. To check it out, just type: * - * This document contains some explanations about stuff. + *
$ git clone gitosis\@git.lfbs.rwth-aachen.de:metalsvm.git
* - * @subsection Compiling + * If you are asked for a password you are not authorized to clone the repository. In this case you will need to get your public SSH key authorized. * + * @section Compiling Compiling MetalSVM + * + * To compile MetalSVM, you will need a proper Makefile and configuration. To use the example files, just do the following: + * + *
+ * $ cd MetalSVM
+ * $ cp Makefile.example Makefile
+ * $ cp include/metalsvm/config.h.example include/metalsvm/config.h
+ * 
+ * + * The standard configuration works on usual PC hardware configurations as well as in emulators. + * + * Compiler-settings can be edited in the Makefile, while the kernel configuration can be found in the just copied configuration file. + * + * @section runqemu Running MetalSVM in Qemu + * + * There is a Make-target for running MetalSVM in Qemu: + *
make qemu
+ * + * The emulator is then started with the following parameters: + *
qemu -monitor stdio -smp 2 -net nic,model=rtl8139 -net user,hostfwd=tcp::12345-:7 -net dump -kernel metalsvm.elf -initrd tools/initrd.img
+ * + * Please note that qemu versions 0.13 and 0.14 have a bug which keeps MetalSVM from booting properly. Used qemu-0.12.5 instead. + * + * @section runscc Running MetalSVM on the Intel SCC + * + * -# Intel recommends to use their cross-compiler for generating code which is guaranteed to be SCC-compatible. Just set the environment variables with the following command: + *
. /opt/compilerSetupFiles/crosscompile.sh
+ * -# The Makefile needs to be adapted to actually use the cross compiler: + *
+ *  CC_FOR_TARGET=i386-unknown-linux-gnu-gcc
+ *  CXX_FOR_TARGET=i386-unknown-linux-gnu-g++
+ *  GCC_FOR_TARGET=i386-unknown-linux-gnu-gcc
+ *  AR_FOR_TARGET=i386-unknown-linux-gnu-ar
+ *  AS_FOR_TARGET=i386-unknown-linux-gnu-as
+ *  LD_FOR_TARGET=i386-unknown-linux-gnu-ld
+ *  NM_FOR_TARGET=i386-unknown-linux-gnu-nm
+ *  OBJDUMP_FOR_TARGET=i386-unknown-linux-gnu-objdump
+ *  OBJCOPY_FOR_TARGET=i386-unknown-linux-gnu-objcopy
+ *  RANLIB_FOR_TARGET=i386-unknown-linux-gnu-ranlib
+ *  STRIP_FOR_TARGET=i386-unknown-linux-gnu-strip
+ *  READELF_FOR_TARGET=i386-unknown-linux-gnu-readelf
+ *  
+ * -# Another important change in the Makefile is disabling the "-fno-stack-protector" option. It occurs several times. + * -# The SCC requires a special configuration for the MetalSVM kernel: + *
+ *  //\#define CONFIG_PCI
+ *  //\#define CONFIG_VGA
+ *  //\#define CONFIG_UART
+ *  //\#define CONFIG_KEYBOARD
+ *  //\#define CONFIG_MULTIBOOT
+ *  \#define CONFIG_ROCKCREEK
+ *  // RCCE specific flags
+ *  \#define SCC
+ *  \#define COPPERRIDGE
+ *  \#define MS_BAREMETAL
+ *  //\#define GORY
+ *  \#define SHMADD
+ *  \#define SHMDBG
+ *  //\#define SHMADD_CACHEABLE
+ *  
+ * -# There is only one core per tile, so it is adequate to reduce overhead by disabling SMP in MetalSVM: + *
+ *  \#define MAX_CORES               1
+ *  
+ * -# Cache-line size is 32 byte: + *
+ *  \#define CACHE_LINE              32
+ *  
+ * -# MetalSVM can now be built using make. + * -# Build the SCC tools: + *
+ *  $ cd tools
+ *  $ make SCC
+ *  
+ * -# The obj directory was just created, containing the MetalSVM kernel image. It can be loaded into the SCC's memory using
sccBoot -g obj
+ * -# The default configuration lets MetalSVM run only on core 0. Its reset pin needs to be released: + *
sccReset -r 0x00
+ * -# Although the display driver was deactivated, MetalSVM's kprintf-output is written into the memory, where you can read it with the following command: + *
sccDump -d 0x00 0x100000 0x10000 | less
+ * There is also a script called prettydump in the /shared/shared folder. + * * */ From a33d1ca9eb83f014efaac123e507ed83e1f3b9a1 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Wed, 26 Oct 2011 13:05:31 -0700 Subject: [PATCH 31/43] use a simpler name (log) for kernel messages --- fs/initrd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/initrd.c b/fs/initrd.c index cc76c994..1034cdee 100644 --- a/fs/initrd.c +++ b/fs/initrd.c @@ -443,7 +443,7 @@ int initrd_init(void) /* create the character device "kmessages" */ tmp = mkdir_fs(fs_root, "var"); - kmsg_init(tmp, "kmessages"); + kmsg_init(tmp, "log"); /* For every module.. */ #ifdef CONFIG_MULTIBOOT From ae49f557f056348dc46fbf67e1cb717784537150 Mon Sep 17 00:00:00 2001 From: Jacek Galowicz Date: Mon, 31 Oct 2011 10:07:57 +0100 Subject: [PATCH 32/43] Generated and modified a layout-file to customize the output. Added some manual article pages. --- Doxyfile | 2 +- documentation/text/documenting.dox | 43 +++++++ documentation/text/kernelspace.dox | 7 ++ documentation/text/userspace.dox | 7 ++ documentation/tmpl/layout.xml | 186 +++++++++++++++++++++++++++++ 5 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 documentation/text/documenting.dox create mode 100644 documentation/text/kernelspace.dox create mode 100644 documentation/text/userspace.dox create mode 100644 documentation/tmpl/layout.xml diff --git a/Doxyfile b/Doxyfile index b7514d3d..6ea4977f 100644 --- a/Doxyfile +++ b/Doxyfile @@ -536,7 +536,7 @@ FILE_VERSION_FILTER = # You can optionally specify a file name after the option, if omitted # DoxygenLayout.xml will be used as the name of the layout file. -LAYOUT_FILE = +LAYOUT_FILE = documentation/tmpl/layout.xml #--------------------------------------------------------------------------- # configuration options related to warning and progress messages diff --git a/documentation/text/documenting.dox b/documentation/text/documenting.dox new file mode 100644 index 00000000..c333f166 --- /dev/null +++ b/documentation/text/documenting.dox @@ -0,0 +1,43 @@ +/** + * @file documenting.dox + * @page documenting Documenting MetalSVM with Doxygen + * + * @section inline Documenting code inline + * + * To document your code correctly, you will have to follow some (easy) rules: + * + * Place a comment block like this at the beginning of your source code: + * + *
+ *  /**
+ *   *  \@author John Doe
+ *   *  \@file   path/to/your/file.h
+ *   *  \@brief  A brief explanation about what this code does or is supposed to do.
+ *   * /
+ * 
+ * + * Functions/procedures are commented in the header file just above the + * function/procedure definition: + * + *
+ * /** \@brief Blocking wait for semaphore [short explanation]
+ *  *
+ *  * [space for more detailed explanations]
+ *  *
+ *  * [describing parameters]
+ *  * \@param s Address of the according %sem_t structure
+ *  * \@param ms Timeout in milliseconds
+ *  *
+ *  * [describing possible return values in a list]
+ *  * \@return 
+ *  *	%- 0 on success
+ *  *	%- -EINVAL on invalid argument
+ *  *	%- -ETIME on timer expired
+ *  * /
+ * inline static int %sem_wait(sem_t* s, uint32_t ms); 
+ * 
+ * + * @section formatting Formatting text + * + * @section docs Writing documents like this one + */ diff --git a/documentation/text/kernelspace.dox b/documentation/text/kernelspace.dox new file mode 100644 index 00000000..95e014d4 --- /dev/null +++ b/documentation/text/kernelspace.dox @@ -0,0 +1,7 @@ +/** + * @file kernelspace.dox + * @page kernelspace Development in kernel space + * + * @section kernelthreads Starting kernel threads + * + */ diff --git a/documentation/text/userspace.dox b/documentation/text/userspace.dox new file mode 100644 index 00000000..9489f4d2 --- /dev/null +++ b/documentation/text/userspace.dox @@ -0,0 +1,7 @@ +/** + * @file userspace.dox + * @page userspace Development in user space + * + * @section ownapps Installing and launching your own applications + * + */ diff --git a/documentation/tmpl/layout.xml b/documentation/tmpl/layout.xml new file mode 100644 index 00000000..6794c866 --- /dev/null +++ b/documentation/tmpl/layout.xml @@ -0,0 +1,186 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 242738a3b80d5a29da3e195a366e4a2958014113 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 31 Oct 2011 19:17:25 +0100 Subject: [PATCH 33/43] increasing the readability --- kernel/tasks.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/kernel/tasks.c b/kernel/tasks.c index 7d00b2b5..206823e7 100644 --- a/kernel/tasks.c +++ b/kernel/tasks.c @@ -1108,13 +1108,13 @@ void update_load(void) spinlock_irqsave_lock(&runqueues[core_id].lock); runqueues[core_id].load[0] *= EXP_1; - runqueues[core_id].load[0] += (runqueues[core_id].nr_tasks *FIXED_1) * (FIXED_1 - EXP_1); + runqueues[core_id].load[0] += (runqueues[core_id].nr_tasks * FIXED_1) * (FIXED_1 - EXP_1); runqueues[core_id].load[0] >>= FSHIFT; runqueues[core_id].load[1] *= EXP_5; - runqueues[core_id].load[1] += (runqueues[core_id].nr_tasks *FIXED_1) * (FIXED_1 - EXP_5); + runqueues[core_id].load[1] += (runqueues[core_id].nr_tasks * FIXED_1) * (FIXED_1 - EXP_5); runqueues[core_id].load[1] >>= FSHIFT; runqueues[core_id].load[2] *= EXP_15; - runqueues[core_id].load[2] += (runqueues[core_id].nr_tasks *FIXED_1) * (FIXED_1 - EXP_15); + runqueues[core_id].load[2] += (runqueues[core_id].nr_tasks * FIXED_1) * (FIXED_1 - EXP_15); runqueues[core_id].load[2] >>= FSHIFT; spinlock_irqsave_unlock(&runqueues[core_id].lock); From d90d962201ad7be2f2818788eed64cc1b0ffa6e1 Mon Sep 17 00:00:00 2001 From: Marian Ohligs Date: Tue, 1 Nov 2011 20:11:52 +0100 Subject: [PATCH 34/43] add type FS_SOCKET, change locking rules, it's now possible to use more then one mshell at the same time. --- drivers/char/socket.c | 2 +- fs/fs.c | 22 ++++++++++++++++------ include/metalsvm/fs.h | 7 ++++--- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/drivers/char/socket.c b/drivers/char/socket.c index d8af0ba3..8210c249 100755 --- a/drivers/char/socket.c +++ b/drivers/char/socket.c @@ -116,7 +116,7 @@ int socket_init(vfs_node_t* node, const char* name) return -ENOMEM; memset(new_node, 0x00, sizeof(vfs_node_t)); - new_node->type = FS_CHARDEVICE; + new_node->type = FS_SOCKET; new_node->open = &socket_open; new_node->close = &socket_close; new_node->read = &socket_read; diff --git a/fs/fs.c b/fs/fs.c index ae55c137..3ee533dc 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -34,11 +34,16 @@ ssize_t read_fs(fildes_t* file, uint8_t* buffer, size_t size) if (BUILTIN_EXPECT(!node || !buffer, 0)) return ret; - spinlock_lock(&node->lock); - // Has the node got a read callback? + if (node->type != FS_SOCKET) { + spinlock_lock(&node->lock); + // Has the node got a read callback? + if (node->read != 0) + ret = node->read(file, buffer, size); + spinlock_unlock(&node->lock); + } else { if (node->read != 0) ret = node->read(file, buffer, size); - spinlock_unlock(&node->lock); + } return ret; } @@ -51,11 +56,16 @@ ssize_t write_fs(fildes_t* file, uint8_t* buffer, size_t size) if (BUILTIN_EXPECT(!node || !buffer, 0)) return ret; - spinlock_lock(&node->lock); - // Has the node got a write callback? + if (node->type != FS_SOCKET) { + spinlock_lock(&node->lock); + // Has the node got a write callback? + if (node->write != 0) + ret = node->write(file, buffer, size); + spinlock_unlock(&node->lock); + } else { if (node->write != 0) ret = node->write(file, buffer, size); - spinlock_unlock(&node->lock); + } return ret; } diff --git a/include/metalsvm/fs.h b/include/metalsvm/fs.h index 8d3736fd..1665b4ad 100644 --- a/include/metalsvm/fs.h +++ b/include/metalsvm/fs.h @@ -29,12 +29,13 @@ #include #include -#define FS_FILE 0x01 -#define FS_DIRECTORY 0x02 -#define FS_CHARDEVICE 0x03 +#define FS_FILE 0x01 +#define FS_DIRECTORY 0x02 +#define FS_CHARDEVICE 0x03 //#define FS_BLOCKDEVICE 0x04 //#define FS_PIPE 0x05 //#define FS_SYMLINK 0x06 +#define FS_SOCKET 0x06 //#define FS_MOUNTPOINT 0x08 // Is the file an active mountpoint? From 869e6da81bfdf665c7bd8c2a424a4d8d870a85b3 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 4 Nov 2011 08:01:04 +0100 Subject: [PATCH 35/43] add missing barrier => wait for the gfx_update --- apps/laplace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/laplace.c b/apps/laplace.c index f017f89b..b1af1fa9 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -245,7 +245,6 @@ int laplace(void *arg) NewValues = OldValues; OldValues = tmp; - //RCCE_TNS_barrier(&RCCE_COMM_WORLD); RCCE_barrier(&RCCE_COMM_WORLD); #ifdef _USE_GFX @@ -269,6 +268,8 @@ int laplace(void *arg) GFX_draw_data((char *)(BufValues[0]), (N) * (M)); GFX_update(); } + + RCCE_barrier(&RCCE_COMM_WORLD); #endif // END ITERATIONS LOOP } From 993ceb4612deeffa72fbc43ee8a1f818c88f3557 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 4 Nov 2011 09:02:34 +0100 Subject: [PATCH 36/43] simplify code --- apps/laplace.c | 6 ------ 1 file changed, 6 deletions(-) diff --git a/apps/laplace.c b/apps/laplace.c index b1af1fa9..388bf711 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -223,17 +223,11 @@ int laplace(void *arg) for (i = 1; i < n + 1; i++) { // over all rows for (j = 1; j < m + 1; j++) { -#if 1 NewValues[I + i][J + j] = (OldValues[I + i - 1][J + j] + OldValues[I + i + 1][J + j] + OldValues[I + i][J + j - 1] + OldValues[I + i][J + j + 1]) / 4; - //if ( NewValues[I+i][J+j] < 0.0 ) NewValues[I+i][J+j] = 0.0 * FIX; - //else if ( NewValues[I+i][J+j] > 255.0 ) NewValues[I+i][J+j] = 255.0 * FIX; -#else - NewValues[I + i][J + j] = 25 * (DATA) (my_rank + 1); -#endif } } #if USE_LAZYRELEASE From 5950a5c3a71a3b50cfcd9d376e8c5fbc3d00a360 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 4 Nov 2011 13:07:00 -0700 Subject: [PATCH 37/43] fix typo --- apps/laplace.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/laplace.c b/apps/laplace.c index 388bf711..91f9e407 100644 --- a/apps/laplace.c +++ b/apps/laplace.c @@ -142,7 +142,7 @@ int laplace(void *arg) NewValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); #if USE_STRONG NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_STRONG); -#elif USE_LATYRELEASE +#elif USE_LAZYRELEASE NewValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_LAZYRELEASE); #else NewValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); @@ -151,7 +151,7 @@ int laplace(void *arg) OldValues = (volatile DATA **)kmalloc((N + 2) * sizeof(DATA *)); #if USE_STRONG OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_STRONG); -#elif USE_LATYRELEASE +#elif USE_LAZYRELEASE OldValues[0] = (DATA *) svmmalloc((N + 2) * (M + 2) * sizeof(DATA), SVM_LAZYRELEASE); #else OldValues[0] = (DATA *) kmalloc((N + 2) * (M + 2) * sizeof(DATA)); From ec0c1e5381bafbc07d5a6ef7084bf65093a2dea0 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Fri, 4 Nov 2011 13:09:42 -0700 Subject: [PATCH 38/43] define dummy_header as static variable --- arch/x86/scc/iRCCE_mailbox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/arch/x86/scc/iRCCE_mailbox.c b/arch/x86/scc/iRCCE_mailbox.c index 958194a8..1ca67c1f 100644 --- a/arch/x86/scc/iRCCE_mailbox.c +++ b/arch/x86/scc/iRCCE_mailbox.c @@ -159,7 +159,7 @@ static int iRCCE_mail_fetch( * write out the data. */ //------------------------------------------------------------------------------ -iRCCE_MAIL_HEADER dummy_header = {0, 0, 0, NULL, 0, 0, 0, {[0 ... iRCCE_MAIL_HEADER_PAYLOAD-1] = 0} }; +static iRCCE_MAIL_HEADER dummy_header = {0, 0, 0, NULL, 0, 0, 0, {[0 ... iRCCE_MAIL_HEADER_PAYLOAD-1] = 0} }; static int iRCCE_mailbox_check(void) { From b230f1a451464751205767f62246d2ab50616c65 Mon Sep 17 00:00:00 2001 From: Stefan Lankes Date: Mon, 7 Nov 2011 08:13:22 +0100 Subject: [PATCH 39/43] cosmetic changes --- fs/fs.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/fs/fs.c b/fs/fs.c index 3ee533dc..c6c16440 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -40,10 +40,8 @@ ssize_t read_fs(fildes_t* file, uint8_t* buffer, size_t size) if (node->read != 0) ret = node->read(file, buffer, size); spinlock_unlock(&node->lock); - } else { - if (node->read != 0) + } else if (node->read != 0) ret = node->read(file, buffer, size); - } return ret; } @@ -62,10 +60,8 @@ ssize_t write_fs(fildes_t* file, uint8_t* buffer, size_t size) if (node->write != 0) ret = node->write(file, buffer, size); spinlock_unlock(&node->lock); - } else { - if (node->write != 0) + } else if (node->write != 0) ret = node->write(file, buffer, size); - } return ret; } From 120500b5cb32acfbd8f577c944d64b4391bbcb97 Mon Sep 17 00:00:00 2001 From: Jacek Galowicz Date: Tue, 8 Nov 2011 13:58:29 +0100 Subject: [PATCH 40/43] Translated the documentation from the L2P into english and put them into the Doxygen documentation. Documenters can just put *.dox files into the documentation/text/ directory which describe how to do things with MetalSVM. making_coffee.dox is still missing - anyone? --- documentation/img/reset.png | Bin 0 -> 22035 bytes documentation/img/sccGui.png | Bin 0 -> 232287 bytes documentation/img/uart.png | Bin 0 -> 116272 bytes documentation/text/.gitignore | 1 + documentation/text/compilation.dox | 159 ++++++++++++++++++----------- documentation/text/config.dox | 18 ++++ documentation/text/documenting.dox | 121 +++++++++++++++++----- documentation/tmpl/stylesheet.css | 2 +- 8 files changed, 217 insertions(+), 84 deletions(-) create mode 100644 documentation/img/reset.png create mode 100644 documentation/img/sccGui.png create mode 100644 documentation/img/uart.png create mode 100644 documentation/text/.gitignore create mode 100644 documentation/text/config.dox diff --git a/documentation/img/reset.png b/documentation/img/reset.png new file mode 100644 index 0000000000000000000000000000000000000000..caab6a7f5fa22b980b276f56739e2ee53362237f GIT binary patch literal 22035 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 Mq-Um!*1j9_KWTd#761SM literal 0 HcmV?d00001 diff --git a/documentation/img/sccGui.png b/documentation/img/sccGui.png new file mode 100644 index 0000000000000000000000000000000000000000..8335e70b1863729b99ace7b140027fa937faa22c GIT binary patch literal 232287 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 Rn{RGd>%6kmqho;EG7Hqj>U>g5 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 z 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

_Z)SSlHpI87abp5x9ePA?X?m_MY4`0)Ji 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

5&(x)M= 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 literal 0 HcmV?d00001 diff --git a/documentation/text/.gitignore b/documentation/text/.gitignore new file mode 100644 index 00000000..424c745c --- /dev/null +++ b/documentation/text/.gitignore @@ -0,0 +1 @@ +*.h diff --git a/documentation/text/compilation.dox b/documentation/text/compilation.dox index 1c485a68..1222228f 100644 --- a/documentation/text/compilation.dox +++ b/documentation/text/compilation.dox @@ -2,95 +2,140 @@ * @file compilation.dox * @page compilation Compiling and Running MetalSVM * + * @section toc Table of Contents + * - @ref checkout + * - @ref compiling + * - @ref runqemu + * - @ref runscc + * - @ref runsccmc + * - @ref msvmuart + * * @section checkout Checking out MetalSVM online * * The MetalSVM project is hosted in a Git repository. To check it out, just type: * - *

$ git clone gitosis\@git.lfbs.rwth-aachen.de:metalsvm.git
+ * \verbatim$ git clone gitosis@git.lfbs.rwth-aachen.de:metalsvm.git \endverbatim * * If you are asked for a password you are not authorized to clone the repository. In this case you will need to get your public SSH key authorized. * - * @section Compiling Compiling MetalSVM + * @section compiling Compiling MetalSVM * * To compile MetalSVM, you will need a proper Makefile and configuration. To use the example files, just do the following: * - *
- * $ cd MetalSVM
- * $ cp Makefile.example Makefile
- * $ cp include/metalsvm/config.h.example include/metalsvm/config.h
- * 
+ * \verbatim +$ cd MetalSVM +$ cp Makefile.example Makefile +$ cp include/metalsvm/config.h.example include/metalsvm/config.h \endverbatim * * The standard configuration works on usual PC hardware configurations as well as in emulators. * - * Compiler-settings can be edited in the Makefile, while the kernel configuration can be found in the just copied configuration file. + * Compiler settings can be edited in the Makefile, while the kernel configuration can be found in the just copied configuration file. * * @section runqemu Running MetalSVM in Qemu * * There is a Make-target for running MetalSVM in Qemu: - *
make qemu
+ * \verbatim$ make qemu \endverbatim * * The emulator is then started with the following parameters: - *
qemu -monitor stdio -smp 2 -net nic,model=rtl8139 -net user,hostfwd=tcp::12345-:7 -net dump -kernel metalsvm.elf -initrd tools/initrd.img
+ * \verbatim$ qemu -monitor stdio -smp 2 -net nic,model=rtl8139 -net user,hostfwd=tcp::12345-:7 -net dump -kernel metalsvm.elf -initrd tools/initrd.img \endverbatim * * Please note that qemu versions 0.13 and 0.14 have a bug which keeps MetalSVM from booting properly. Used qemu-0.12.5 instead. * * @section runscc Running MetalSVM on the Intel SCC * * -# Intel recommends to use their cross-compiler for generating code which is guaranteed to be SCC-compatible. Just set the environment variables with the following command: - *
. /opt/compilerSetupFiles/crosscompile.sh
+ * \verbatim$ . /opt/compilerSetupFiles/crosscompile.sh \endverbatim * -# The Makefile needs to be adapted to actually use the cross compiler: - *
- *  CC_FOR_TARGET=i386-unknown-linux-gnu-gcc
- *  CXX_FOR_TARGET=i386-unknown-linux-gnu-g++
- *  GCC_FOR_TARGET=i386-unknown-linux-gnu-gcc
- *  AR_FOR_TARGET=i386-unknown-linux-gnu-ar
- *  AS_FOR_TARGET=i386-unknown-linux-gnu-as
- *  LD_FOR_TARGET=i386-unknown-linux-gnu-ld
- *  NM_FOR_TARGET=i386-unknown-linux-gnu-nm
- *  OBJDUMP_FOR_TARGET=i386-unknown-linux-gnu-objdump
- *  OBJCOPY_FOR_TARGET=i386-unknown-linux-gnu-objcopy
- *  RANLIB_FOR_TARGET=i386-unknown-linux-gnu-ranlib
- *  STRIP_FOR_TARGET=i386-unknown-linux-gnu-strip
- *  READELF_FOR_TARGET=i386-unknown-linux-gnu-readelf
- *  
+ * \verbatim +CC_FOR_TARGET=i386-unknown-linux-gnu-gcc +CXX_FOR_TARGET=i386-unknown-linux-gnu-g++ +GCC_FOR_TARGET=i386-unknown-linux-gnu-gcc +AR_FOR_TARGET=i386-unknown-linux-gnu-ar +AS_FOR_TARGET=i386-unknown-linux-gnu-as +LD_FOR_TARGET=i386-unknown-linux-gnu-ld +NM_FOR_TARGET=i386-unknown-linux-gnu-nm +OBJDUMP_FOR_TARGET=i386-unknown-linux-gnu-objdump +OBJCOPY_FOR_TARGET=i386-unknown-linux-gnu-objcopy +RANLIB_FOR_TARGET=i386-unknown-linux-gnu-ranlib +STRIP_FOR_TARGET=i386-unknown-linux-gnu-strip +READELF_FOR_TARGET=i386-unknown-linux-gnu-readelf \endverbatim * -# Another important change in the Makefile is disabling the "-fno-stack-protector" option. It occurs several times. * -# The SCC requires a special configuration for the MetalSVM kernel: - *
- *  //\#define CONFIG_PCI
- *  //\#define CONFIG_VGA
- *  //\#define CONFIG_UART
- *  //\#define CONFIG_KEYBOARD
- *  //\#define CONFIG_MULTIBOOT
- *  \#define CONFIG_ROCKCREEK
- *  // RCCE specific flags
- *  \#define SCC
- *  \#define COPPERRIDGE
- *  \#define MS_BAREMETAL
- *  //\#define GORY
- *  \#define SHMADD
- *  \#define SHMDBG
- *  //\#define SHMADD_CACHEABLE
- *  
+ * \verbatim +//#define CONFIG_PCI +//#define CONFIG_VGA +//#define CONFIG_UART +//#define CONFIG_KEYBOARD +//#define CONFIG_MULTIBOOT +#define CONFIG_ROCKCREEK +// RCCE specific flags +#define SCC +#define COPPERRIDGE +#define MS_BAREMETAL +//#define GORY +#define SHMADD +#define SHMDBG +//#define SHMADD_CACHEABLE \endverbatim * -# There is only one core per tile, so it is adequate to reduce overhead by disabling SMP in MetalSVM: - *
- *  \#define MAX_CORES               1
- *  
+ * \verbatim#define MAX_CORES 1 \endverbatim * -# Cache-line size is 32 byte: - *
- *  \#define CACHE_LINE              32
- *  
- * -# MetalSVM can now be built using make. + * \verbatim#define CACHE_LINE 32 \endverbatim + * -# MetalSVM can now be built using \c make. * -# Build the SCC tools: - *
- *  $ cd tools
- *  $ make SCC
- *  
- * -# The obj directory was just created, containing the MetalSVM kernel image. It can be loaded into the SCC's memory using
sccBoot -g obj
+ * \verbatim +$ cd tools +$ make SCC \endverbatim + * -# The \c obj directory was just created, containing the MetalSVM kernel image. It can be loaded into the SCC's memory using \verbatim$ sccBoot -g obj \endverbatim * -# The default configuration lets MetalSVM run only on core 0. Its reset pin needs to be released: - *
sccReset -r 0x00
+ * \verbatim$ sccReset -r 0x00 \endverbatim * -# Although the display driver was deactivated, MetalSVM's kprintf-output is written into the memory, where you can read it with the following command: - *
sccDump -d 0x00 0x100000 0x10000 | less
- * There is also a script called prettydump in the /shared/shared folder. - * + * \verbatim$ sccDump -d 0x00 0x100000 0x10000 | less \endverbatim + * + * + * @section runsccmc Running MetalSVM on multiple SCC cores + * + * -# Build the kernel like described above (items 1-7) and change to the \c tools directory. + * -# The \c scc_bootinfo.asm file contains boot-information relevant to the SCC-cores. + * It is generated automatically by the \c bootinfo.sh script.\n + * \n + * The following example generates the \c scc_bootinfo.asm file needed for use of the cores 0 and 1: + * \verbatim$ ./bootinfo.sh 0x01000000 initrd.img 2 533 0 1 > scc_bootinfo.asm \endverbatim + * Parameters describe the following: + * -# First parameter describes the address at which the initrd shall be located at later + * -# Second is path to the initrd image file + * -# The other parameters are analogous to RCCE-App-parameters. This example starts MetalSVM on cores 0 and 1, clocked with 533MHz. + * -# Now the file \c metalsvm.mt has to be edited. It defines the layout of the memory image (Where the kernels will be located in the memory later). For the example from above it looks like the following: + * \verbatim# pid mch-route mch-dest-id mch-offset-base testcase + 0x00 0x00 6 0x00 metalsvm.obj + 0x01 0x00 6 0x01 metalsvm.obj \endverbatim + * This locates two instances of MetalSVM on core 0 and 1, supplied with memory from memory controller 0. See \c sccMerge \c -h for more information. + * -# The final image must be generated then with \code$ make SCC\endcode + * -# A directory \c obj was created, containing the final MetalSVM Image. This image can now be loaded with the following command: \code$ sccBoot -g obj\endcode + * -# Everything has been placed in the cores' memory. To release the reset pins of the corresponding cores, type \code$ sccReset -r 0x00 0x01\endcode + * + * @section msvmuart Enabling UART support + * + * MetalSVM is able to reroute terminal output to port \c 0x2F8. This way it can be displayed in \c sccGui. Too much output stresses the network load, therefore it should be used for debugging purposes only. + * + * How to enable: + * -# Enable UART-support in the kernel's config file \c include/metalsvm/config.h: + * \code#define CONFIG_UART\endcode + * -# Rebuild the kernel. Do not launch it with \c sccBoot - In the following \c sccGui will be used. + * -# Launch \c sccGui. + * -# Enable UART in the gui by klicking Enable software RAM and UART in the Menu Settings/Debug Settings. + * -# Issue a software interrupt by clicking on the wiper symbol. + * -# Choose the memory image called \c mch_0_0.32.obj from the \c obj folder with Preload object file. + * -# Initialize the LUT with Preload LUT file. It is called \c lut_init.dat and is located in the same directory. + * -# Both L2 cache and MPB can be reset now, if needed. + * -# Activate the corresponding cores with Change selected reset(s). This opens the following window: + * @image html reset.png + * -# A box being checked means that the reset pin is pulled and the core is \e inactive. The example from the picture will boot MetalSVM only on cores 0 and 1. + * + * After following these steps successfully, a similar image to the following should appear on the gui: + * @image html sccGui.png + * + * Another window will be opened automatically as soon as UART output arrives in the gui. This will be similar to the following: + * @image html uart.png + * * */ diff --git a/documentation/text/config.dox b/documentation/text/config.dox new file mode 100644 index 00000000..e4e80343 --- /dev/null +++ b/documentation/text/config.dox @@ -0,0 +1,18 @@ +/** + * @file config.dox + * @page config The MetalSVM feature configuration file + * + * @section conf MetalSVM's configuration file + * + * MetalSVM's configuration parameters and some features can be configured/activated in the central configuration file located at \c include/metalsvm/config.h. + * + * The \c config.h is a usual C-header file and the configuration items are usual C preprocessor-definitions like the following: + * \code +#define CONFIGURATION_PARAMETER 123value /* A parameter with a value */ +#define FEATURE_A /* An activated feature */ +//#define FEATURE_B /* A deactivated feature */\endcode + * + * Just like the example suggests, features are deactivated by commenting them out. + * + * + */ diff --git a/documentation/text/documenting.dox b/documentation/text/documenting.dox index c333f166..5a77f053 100644 --- a/documentation/text/documenting.dox +++ b/documentation/text/documenting.dox @@ -2,42 +2,111 @@ * @file documenting.dox * @page documenting Documenting MetalSVM with Doxygen * + * The doxygen project has a nice manual at http://www.stack.nl/~dimitri/doxygen/manual.html \n + * All content on this page is extracted from there. + * + * Please check if the \c doxygen command throws errors on your documented code. + * * @section inline Documenting code inline * - * To document your code correctly, you will have to follow some (easy) rules: + * To document your code correctly, you will have to follow some (simple) rules: * - * Place a comment block like this at the beginning of your source code: + * Place a comment block like this at the beginning of your source code files you intend to document: * - *
- *  /**
- *   *  \@author John Doe
- *   *  \@file   path/to/your/file.h
- *   *  \@brief  A brief explanation about what this code does or is supposed to do.
- *   * /
- * 
+ * @verbatim + /** + * @author John Doe + * @file path/to/your/file.h + * @brief A brief explanation about what this code does or is supposed to do. + */@endverbatim * * Functions/procedures are commented in the header file just above the * function/procedure definition: * - *
- * /** \@brief Blocking wait for semaphore [short explanation]
- *  *
- *  * [space for more detailed explanations]
- *  *
- *  * [describing parameters]
- *  * \@param s Address of the according %sem_t structure
- *  * \@param ms Timeout in milliseconds
- *  *
- *  * [describing possible return values in a list]
- *  * \@return 
- *  *	%- 0 on success
- *  *	%- -EINVAL on invalid argument
- *  *	%- -ETIME on timer expired
- *  * /
- * inline static int %sem_wait(sem_t* s, uint32_t ms); 
- * 
+ * @verbatim + /** @brief Blocking wait for semaphore [short explanation] + * + * [space for more detailed explanations] + * + * [describing parameters] + * @param s Address of the according sem_t structure + * @param ms Timeout in milliseconds + * + * [describing possible return values in a list] + * @return + * - 0 on success + * - -EINVAL on invalid argument + * - -ETIME on timer expired + */ + inline static int sem_wait(sem_t* s, uint32_t ms); @endverbatim + * + * Documenting structures and their members looks like the following: + * @verbatim + /** @brief The task_t structure */ + typedef struct task { + /// Task id = position in the task table + tid_t id; + /// Task status (INVALID, READY, RUNNING, ...) + uint32_t status; + ... @endverbatim * * @section formatting Formatting text * + * Although you could use HTML brackets to format your text, + * Doxygen provides special commands. Please use those, since it is possible + * that someone may want to generate CHM, Latex or other formatted output + * from this documentation. + * + * To \e emphasize, \b highlight or \c typewrite text, use the following commands: + * \verbatim To \e emphasize, \b highlight or \c typewrite text... \endverbatim + * + * \verbatim + Preserving the format + of text like + this can be done with \verbatim end \ endverbatim \endverbatim + * + * Code will be color-highlighted with \\code and \\endcode: + * \code + int i; + for (i=0; i < 123; i++) + printf("%d\n", i); + \endcode + * + * It is also easily possible to make listings: + * - item a + * - item b + * - item c + * + * And also enumerated listings: + * -# item a + * -# item b + * -# item c + * + * \verbatim +It is also easily possible to make listings: + - item a + - item b + - item c + +And also enumerated listings: + -# item a + -# item b + -# item c \endverbatim + * * @section docs Writing documents like this one + * + * To write a stand-alone manual like this one, just create + * a file \c your_manual.dox in \c $MSVM/documentation/text/. + * + * This file's content should look like this: + * + * \verbatim + /** + * @file your_manual.dox + * @page your_manual This is your manual's title. It will be displayed in the "Manuals" section. + * + * @section your_section This starts a section with a title + * + * content, content, content! + */ \endverbatim */ diff --git a/documentation/tmpl/stylesheet.css b/documentation/tmpl/stylesheet.css index d27dd30b..9564fb02 100644 --- a/documentation/tmpl/stylesheet.css +++ b/documentation/tmpl/stylesheet.css @@ -849,6 +849,6 @@ dl.bug .textblock { - width: 950px; + width: 800px; textalign: justify; } From 7db55b481dd10f781d5ce955d3b885868d33873e Mon Sep 17 00:00:00 2001 From: Jacek Galowicz Date: Tue, 8 Nov 2011 14:00:11 +0100 Subject: [PATCH 41/43] Fixed a doxygen comment line. --- include/metalsvm/tasks_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/metalsvm/tasks_types.h b/include/metalsvm/tasks_types.h index 857e9d52..759bbeea 100644 --- a/include/metalsvm/tasks_types.h +++ b/include/metalsvm/tasks_types.h @@ -64,7 +64,7 @@ typedef int (*entry_point_t)(void*); typedef int (STDCALL *internal_entry_point_t)(void*); struct page_dir; -/* @brief The task_t structure */ +/** @brief The task_t structure */ typedef struct task { /// Task id = position in the task table tid_t id; From b6b6d42a89be8ac7b485dd9c84881345a9477aee Mon Sep 17 00:00:00 2001 From: Marian Ohligs Date: Tue, 8 Nov 2011 15:55:15 +0100 Subject: [PATCH 42/43] fix bug in open --- fs/fs.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fs/fs.c b/fs/fs.c index c6c16440..5485cb37 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -79,7 +79,7 @@ int open_fs(fildes_t* file, const char* name) if (name[0] == '/') file_node = fs_root; - while((name[j] != '\0') && (file_node != NULL)) { + while((name[j] != '\0') || ((file_node != NULL) && (file_node->type == FS_DIRECTORY))) { i = 0; while((name[j] != '/') && (name[j] != '\0')) { fname[i] = name[j]; @@ -108,6 +108,7 @@ int open_fs(fildes_t* file, const char* name) ret = dir_node->open(file, fname); spinlock_unlock(&dir_node->lock); } else { + kprintf("KERNELERROR"); ret = -ENOENT; } From 2688601379be546a90b4b0270abd9b8b3cb30edb Mon Sep 17 00:00:00 2001 From: Marian Ohligs Date: Tue, 8 Nov 2011 16:01:07 +0100 Subject: [PATCH 43/43] remove debug msg --- fs/fs.c | 1 - 1 file changed, 1 deletion(-) diff --git a/fs/fs.c b/fs/fs.c index 5485cb37..f539e576 100644 --- a/fs/fs.c +++ b/fs/fs.c @@ -108,7 +108,6 @@ int open_fs(fildes_t* file, const char* name) ret = dir_node->open(file, fname); spinlock_unlock(&dir_node->lock); } else { - kprintf("KERNELERROR"); ret = -ENOENT; }