Changes in / [422af2b:68f57e1] in mainline
- Files:
-
- 5 added
- 23 edited
Legend:
- Unmodified
- Added
- Removed
-
HelenOS.config
r422af2b r68f57e1 581 581 # USB settings 582 582 583 % USB release build (less logging)584 ! CONFIG_USB_ RELEASE_BUILD (y/n)583 % USB verbose messages 584 ! CONFIG_USB_VERBOSE (n/y) 585 585 586 586 % Start virtual USB host controller -
boot/Makefile.common
r422af2b r68f57e1 177 177 $(USPACE_PATH)/app/nettest3/nettest3 \ 178 178 $(USPACE_PATH)/app/netecho/netecho \ 179 $(USPACE_PATH)/app/nterm/nterm \ 179 180 $(USPACE_PATH)/app/ping/ping \ 180 181 $(USPACE_PATH)/app/stats/stats \ -
kernel/arch/amd64/include/mm/page.h
r422af2b r68f57e1 33 33 */ 34 34 35 /** Paging on AMD6436 *37 * The space is divided in positive numbers (uspace) and38 * negative numbers (kernel). The 'negative' space starting39 * with 0xffff800000000000 and ending with 0xffffffffffffffff40 * is identically mapped physical memory.41 *42 */43 44 35 #ifndef KERN_amd64_PAGE_H_ 45 36 #define KERN_amd64_PAGE_H_ -
kernel/genarch/src/mm/page_pt.c
r422af2b r68f57e1 48 48 #include <align.h> 49 49 #include <macros.h> 50 #include <bitops.h> 50 51 51 52 static void pt_mapping_insert(as_t *, uintptr_t, uintptr_t, unsigned int); … … 292 293 } 293 294 295 /** Return the size of the region mapped by a single PTL0 entry. 296 * 297 * @return Size of the region mapped by a single PTL0 entry. 298 */ 299 static uintptr_t ptl0_step_get(void) 300 { 301 size_t va_bits; 302 303 va_bits = fnzb(PTL0_ENTRIES) + fnzb(PTL1_ENTRIES) + fnzb(PTL2_ENTRIES) + 304 fnzb(PTL3_ENTRIES) + PAGE_WIDTH; 305 306 return 1UL << (va_bits - fnzb(PTL0_ENTRIES)); 307 } 308 294 309 /** Make the mappings in the given range global accross all address spaces. 295 310 * … … 309 324 { 310 325 uintptr_t ptl0 = PA2KA((uintptr_t) AS_KERNEL->genarch.page_table); 311 uintptr_t ptl0 step = (((uintptr_t) -1) / PTL0_ENTRIES) + 1;326 uintptr_t ptl0_step = ptl0_step_get(); 312 327 size_t order; 313 328 uintptr_t addr; … … 321 336 #endif 322 337 323 ASSERT(ispwr2(ptl0step));324 338 ASSERT(size > 0); 325 339 326 for (addr = ALIGN_DOWN(base, ptl0 step); addr - 1 < base + size - 1;327 addr += ptl0 step) {340 for (addr = ALIGN_DOWN(base, ptl0_step); addr - 1 < base + size - 1; 341 addr += ptl0_step) { 328 342 uintptr_t l1; 329 343 -
kernel/generic/include/lib/ra.h
r422af2b r68f57e1 42 42 43 43 typedef struct { 44 SPINLOCK_DECLARE(lock);44 IRQ_SPINLOCK_DECLARE(lock); 45 45 list_t spans; /**< List of arena's spans. */ 46 46 } ra_arena_t; -
kernel/generic/include/mm/slab.h
r422af2b r68f57e1 81 81 slab_magazine_t *current; 82 82 slab_magazine_t *last; 83 SPINLOCK_DECLARE(lock);83 IRQ_SPINLOCK_DECLARE(lock); 84 84 } slab_mag_cache_t; 85 85 … … 113 113 list_t full_slabs; /**< List of full slabs */ 114 114 list_t partial_slabs; /**< List of partial slabs */ 115 SPINLOCK_DECLARE(slablock);115 IRQ_SPINLOCK_DECLARE(slablock); 116 116 /* Magazines */ 117 117 list_t magazines; /**< List o full magazines */ 118 SPINLOCK_DECLARE(maglock);118 IRQ_SPINLOCK_DECLARE(maglock); 119 119 120 120 /** CPU cache */ -
kernel/generic/src/lib/ra.c
r422af2b r68f57e1 185 185 return NULL; 186 186 187 spinlock_initialize(&arena->lock, "arena_lock");187 irq_spinlock_initialize(&arena->lock, "arena_lock"); 188 188 list_initialize(&arena->spans); 189 189 … … 209 209 210 210 /* TODO: check for overlaps */ 211 spinlock_lock(&arena->lock);211 irq_spinlock_lock(&arena->lock, true); 212 212 list_append(&span->span_link, &arena->spans); 213 spinlock_unlock(&arena->lock);213 irq_spinlock_unlock(&arena->lock, true); 214 214 return true; 215 215 } … … 390 390 ASSERT(ispwr2(alignment)); 391 391 392 spinlock_lock(&arena->lock);392 irq_spinlock_lock(&arena->lock, true); 393 393 list_foreach(arena->spans, cur) { 394 394 ra_span_t *span = list_get_instance(cur, ra_span_t, span_link); … … 398 398 break; 399 399 } 400 spinlock_unlock(&arena->lock);400 irq_spinlock_unlock(&arena->lock, true); 401 401 402 402 return base; … … 406 406 void ra_free(ra_arena_t *arena, uintptr_t base, size_t size) 407 407 { 408 spinlock_lock(&arena->lock);408 irq_spinlock_lock(&arena->lock, true); 409 409 list_foreach(arena->spans, cur) { 410 410 ra_span_t *span = list_get_instance(cur, ra_span_t, span_link); … … 412 412 if (iswithin(span->base, span->size, base, size)) { 413 413 ra_span_free(span, base, size); 414 spinlock_unlock(&arena->lock);414 irq_spinlock_unlock(&arena->lock, true); 415 415 return; 416 416 } 417 417 } 418 spinlock_unlock(&arena->lock);418 irq_spinlock_unlock(&arena->lock, true); 419 419 420 420 panic("Freeing to wrong arena (base=%" PRIxn ", size=%" PRIdn ").", -
kernel/generic/src/mm/frame.c
r422af2b r68f57e1 1086 1086 #endif 1087 1087 1088 /* 1089 * Since the mem_avail_mtx is an active mutex, we need to disable interrupts 1090 * to prevent deadlock with TLB shootdown. 1091 */ 1092 ipl_t ipl = interrupts_disable(); 1088 1093 mutex_lock(&mem_avail_mtx); 1089 1094 … … 1098 1103 1099 1104 mutex_unlock(&mem_avail_mtx); 1105 interrupts_restore(ipl); 1100 1106 1101 1107 #ifdef CONFIG_DEBUG … … 1161 1167 * Signal that some memory has been freed. 1162 1168 */ 1169 1170 1171 /* 1172 * Since the mem_avail_mtx is an active mutex, we need to disable interrupts 1173 * to prevent deadlock with TLB shootdown. 1174 */ 1175 ipl_t ipl = interrupts_disable(); 1163 1176 mutex_lock(&mem_avail_mtx); 1164 1177 if (mem_avail_req > 0) … … 1170 1183 } 1171 1184 mutex_unlock(&mem_avail_mtx); 1185 interrupts_restore(ipl); 1172 1186 1173 1187 if (!(flags & FRAME_NO_RESERVE)) -
kernel/generic/src/mm/slab.c
r422af2b r68f57e1 264 264 freed = cache->destructor(obj); 265 265 266 spinlock_lock(&cache->slablock);266 irq_spinlock_lock(&cache->slablock, true); 267 267 ASSERT(slab->available < cache->objects); 268 268 … … 275 275 /* Free associated memory */ 276 276 list_remove(&slab->link); 277 spinlock_unlock(&cache->slablock);277 irq_spinlock_unlock(&cache->slablock, true); 278 278 279 279 return freed + slab_space_free(cache, slab); … … 284 284 } 285 285 286 spinlock_unlock(&cache->slablock);286 irq_spinlock_unlock(&cache->slablock, true); 287 287 return freed; 288 288 } … … 295 295 NO_TRACE static void *slab_obj_create(slab_cache_t *cache, unsigned int flags) 296 296 { 297 spinlock_lock(&cache->slablock);297 irq_spinlock_lock(&cache->slablock, true); 298 298 299 299 slab_t *slab; … … 308 308 * 309 309 */ 310 spinlock_unlock(&cache->slablock);310 irq_spinlock_unlock(&cache->slablock, true); 311 311 slab = slab_space_alloc(cache, flags); 312 312 if (!slab) 313 313 return NULL; 314 314 315 spinlock_lock(&cache->slablock);315 irq_spinlock_lock(&cache->slablock, true); 316 316 } else { 317 317 slab = list_get_instance(list_first(&cache->partial_slabs), … … 329 329 list_prepend(&slab->link, &cache->partial_slabs); 330 330 331 spinlock_unlock(&cache->slablock);331 irq_spinlock_unlock(&cache->slablock, true); 332 332 333 333 if ((cache->constructor) && (cache->constructor(obj, flags))) { … … 355 355 link_t *cur; 356 356 357 spinlock_lock(&cache->maglock);357 irq_spinlock_lock(&cache->maglock, true); 358 358 if (!list_empty(&cache->magazines)) { 359 359 if (first) … … 366 366 atomic_dec(&cache->magazine_counter); 367 367 } 368 369 spinlock_unlock(&cache->maglock); 368 irq_spinlock_unlock(&cache->maglock, true); 369 370 370 return mag; 371 371 } … … 377 377 slab_magazine_t *mag) 378 378 { 379 spinlock_lock(&cache->maglock);379 irq_spinlock_lock(&cache->maglock, true); 380 380 381 381 list_prepend(&mag->link, &cache->magazines); 382 382 atomic_inc(&cache->magazine_counter); 383 383 384 spinlock_unlock(&cache->maglock);384 irq_spinlock_unlock(&cache->maglock, true); 385 385 } 386 386 … … 414 414 slab_magazine_t *lastmag = cache->mag_cache[CPU->id].last; 415 415 416 ASSERT( spinlock_locked(&cache->mag_cache[CPU->id].lock));416 ASSERT(irq_spinlock_locked(&cache->mag_cache[CPU->id].lock)); 417 417 418 418 if (cmag) { /* First try local CPU magazines */ … … 451 451 return NULL; 452 452 453 spinlock_lock(&cache->mag_cache[CPU->id].lock);453 irq_spinlock_lock(&cache->mag_cache[CPU->id].lock, true); 454 454 455 455 slab_magazine_t *mag = get_full_current_mag(cache); 456 456 if (!mag) { 457 spinlock_unlock(&cache->mag_cache[CPU->id].lock);457 irq_spinlock_unlock(&cache->mag_cache[CPU->id].lock, true); 458 458 return NULL; 459 459 } 460 460 461 461 void *obj = mag->objs[--mag->busy]; 462 spinlock_unlock(&cache->mag_cache[CPU->id].lock);462 irq_spinlock_unlock(&cache->mag_cache[CPU->id].lock, true); 463 463 464 464 atomic_dec(&cache->cached_objs); … … 481 481 slab_magazine_t *lastmag = cache->mag_cache[CPU->id].last; 482 482 483 ASSERT( spinlock_locked(&cache->mag_cache[CPU->id].lock));483 ASSERT(irq_spinlock_locked(&cache->mag_cache[CPU->id].lock)); 484 484 485 485 if (cmag) { … … 531 531 return -1; 532 532 533 spinlock_lock(&cache->mag_cache[CPU->id].lock);533 irq_spinlock_lock(&cache->mag_cache[CPU->id].lock, true); 534 534 535 535 slab_magazine_t *mag = make_empty_current_mag(cache); 536 536 if (!mag) { 537 spinlock_unlock(&cache->mag_cache[CPU->id].lock);537 irq_spinlock_unlock(&cache->mag_cache[CPU->id].lock, true); 538 538 return -1; 539 539 } … … 541 541 mag->objs[mag->busy++] = obj; 542 542 543 spinlock_unlock(&cache->mag_cache[CPU->id].lock);543 irq_spinlock_unlock(&cache->mag_cache[CPU->id].lock, true); 544 544 545 545 atomic_inc(&cache->cached_objs); … … 593 593 for (i = 0; i < config.cpu_count; i++) { 594 594 memsetb(&cache->mag_cache[i], sizeof(cache->mag_cache[i]), 0); 595 spinlock_initialize(&cache->mag_cache[i].lock,595 irq_spinlock_initialize(&cache->mag_cache[i].lock, 596 596 "slab.cache.mag_cache[].lock"); 597 597 } … … 624 624 list_initialize(&cache->magazines); 625 625 626 spinlock_initialize(&cache->slablock, "slab.cache.slablock");627 spinlock_initialize(&cache->maglock, "slab.cache.maglock");626 irq_spinlock_initialize(&cache->slablock, "slab.cache.slablock"); 627 irq_spinlock_initialize(&cache->maglock, "slab.cache.maglock"); 628 628 629 629 if (!(cache->flags & SLAB_CACHE_NOMAGAZINE)) … … 704 704 size_t i; 705 705 for (i = 0; i < config.cpu_count; i++) { 706 spinlock_lock(&cache->mag_cache[i].lock);706 irq_spinlock_lock(&cache->mag_cache[i].lock, true); 707 707 708 708 mag = cache->mag_cache[i].current; … … 716 716 cache->mag_cache[i].last = NULL; 717 717 718 spinlock_unlock(&cache->mag_cache[i].lock);718 irq_spinlock_unlock(&cache->mag_cache[i].lock, true); 719 719 } 720 720 } -
kernel/generic/src/synch/mutex.c
r422af2b r68f57e1 40 40 #include <debug.h> 41 41 #include <arch.h> 42 #include <stacktrace.h> 42 43 43 44 /** Initialize mutex. … … 61 62 return semaphore_count_get(&mtx->sem) <= 0; 62 63 } 64 65 #define MUTEX_DEADLOCK_THRESHOLD 100000000 63 66 64 67 /** Acquire mutex. … … 87 90 ASSERT(!(flags & SYNCH_FLAGS_INTERRUPTIBLE)); 88 91 92 unsigned int cnt = 0; 93 bool deadlock_reported = false; 89 94 do { 95 if (cnt++ > MUTEX_DEADLOCK_THRESHOLD) { 96 printf("cpu%u: looping on active mutex %p\n", 97 CPU->id, mtx); 98 stack_trace(); 99 cnt = 0; 100 deadlock_reported = true; 101 } 90 102 rc = semaphore_trydown(&mtx->sem); 91 103 } while (SYNCH_FAILED(rc) && 92 104 !(flags & SYNCH_FLAGS_NON_BLOCKING)); 105 if (deadlock_reported) 106 printf("cpu%u: not deadlocked\n", CPU->id); 93 107 } 94 108 -
kernel/generic/src/synch/spinlock.c
r422af2b r68f57e1 44 44 #include <debug.h> 45 45 #include <symtab.h> 46 #include <stacktrace.h> 46 47 47 48 #ifdef CONFIG_SMP … … 104 105 "caller=%p (%s)\n", CPU->id, lock, lock->name, 105 106 (void *) CALLER, symtab_fmt_name_lookup(CALLER)); 107 stack_trace(); 106 108 107 109 i = 0; … … 260 262 int rc = spinlock_trylock(&(lock->lock)); 261 263 262 ASSERT_IRQ_SPINLOCK(! lock->guard, lock);264 ASSERT_IRQ_SPINLOCK(!rc || !lock->guard, lock); 263 265 return rc; 264 266 } -
uspace/Makefile
r422af2b r68f57e1 51 51 app/mkexfat \ 52 52 app/mkmfs \ 53 app/nterm \ 53 54 app/redir \ 54 55 app/sbi \ -
uspace/lib/usb/include/usb/debug.h
r422af2b r68f57e1 81 81 82 82 /** Default log level. */ 83 #ifdef CONFIG_USB_RELEASE_BUILD 83 #ifdef CONFIG_USB_VERBOSE 84 # define USB_LOG_LEVEL_DEFAULT USB_LOG_LEVEL_DEBUG 85 #else 84 86 # define USB_LOG_LEVEL_DEFAULT USB_LOG_LEVEL_INFO 85 #else86 # define USB_LOG_LEVEL_DEFAULT USB_LOG_LEVEL_DEBUG87 87 #endif 88 88 -
uspace/srv/net/tcp/conn.c
r422af2b r68f57e1 184 184 void tcp_conn_addref(tcp_conn_t *conn) 185 185 { 186 log_msg(LVL_DEBUG , "%s: tcp_conn_addref(%p)", conn->name, conn);186 log_msg(LVL_DEBUG2, "%s: tcp_conn_addref(%p)", conn->name, conn); 187 187 atomic_inc(&conn->refcnt); 188 188 } … … 196 196 void tcp_conn_delref(tcp_conn_t *conn) 197 197 { 198 log_msg(LVL_DEBUG , "%s: tcp_conn_delref(%p)", conn->name, conn);198 log_msg(LVL_DEBUG2, "%s: tcp_conn_delref(%p)", conn->name, conn); 199 199 200 200 if (atomic_predec(&conn->refcnt) == 0) … … 312 312 static bool tcp_socket_match(tcp_sock_t *sock, tcp_sock_t *patt) 313 313 { 314 log_msg(LVL_DEBUG , "tcp_socket_match(sock=(%x,%u), pat=(%x,%u))",314 log_msg(LVL_DEBUG2, "tcp_socket_match(sock=(%x,%u), pat=(%x,%u))", 315 315 sock->addr.ipv4, sock->port, patt->addr.ipv4, patt->port); 316 316 … … 323 323 return false; 324 324 325 log_msg(LVL_DEBUG , " -> match");325 log_msg(LVL_DEBUG2, " -> match"); 326 326 327 327 return true; … … 331 331 static bool tcp_sockpair_match(tcp_sockpair_t *sp, tcp_sockpair_t *pattern) 332 332 { 333 log_msg(LVL_DEBUG , "tcp_sockpair_match(%p, %p)", sp, pattern);333 log_msg(LVL_DEBUG2, "tcp_sockpair_match(%p, %p)", sp, pattern); 334 334 335 335 if (!tcp_socket_match(&sp->local, &pattern->local)) … … 360 360 tcp_conn_t *conn = list_get_instance(link, tcp_conn_t, link); 361 361 tcp_sockpair_t *csp = &conn->ident; 362 log_msg(LVL_DEBUG , "compare with conn (f:(%x,%u), l:(%x,%u))",362 log_msg(LVL_DEBUG2, "compare with conn (f:(%x,%u), l:(%x,%u))", 363 363 csp->foreign.addr.ipv4, csp->foreign.port, 364 364 csp->local.addr.ipv4, csp->local.port); -
uspace/srv/net/tcp/ncsim.c
r422af2b r68f57e1 44 44 #include <io/log.h> 45 45 #include <stdlib.h> 46 #include < thread.h>46 #include <fibril.h> 47 47 #include "conn.h" 48 48 #include "ncsim.h" … … 119 119 } 120 120 121 /** Network condition simulator handler thread. */122 static void tcp_ncsim_thread(void *arg)121 /** Network condition simulator handler fibril. */ 122 static int tcp_ncsim_fibril(void *arg) 123 123 { 124 124 link_t *link; … … 126 126 int rc; 127 127 128 log_msg(LVL_DEBUG, "tcp_ncsim_ thread()");128 log_msg(LVL_DEBUG, "tcp_ncsim_fibril()"); 129 129 130 130 … … 151 151 free(sqe); 152 152 } 153 154 /* Not reached */ 155 return 0; 153 156 } 154 157 155 /** Start simulator handler thread. */156 void tcp_ncsim_ thread_start(void)158 /** Start simulator handler fibril. */ 159 void tcp_ncsim_fibril_start(void) 157 160 { 158 thread_id_t tid; 159 int rc; 161 fid_t fid; 160 162 161 log_msg(LVL_DEBUG, "tcp_ncsim_ thread_start()");163 log_msg(LVL_DEBUG, "tcp_ncsim_fibril_start()"); 162 164 163 rc = thread_create(tcp_ncsim_thread, NULL, "ncsim", &tid);164 if ( rc != EOK) {165 log_msg(LVL_ERROR, "Failed creating ncsim thread.");165 fid = fibril_create(tcp_ncsim_fibril, NULL); 166 if (fid == 0) { 167 log_msg(LVL_ERROR, "Failed creating ncsim fibril."); 166 168 return; 167 169 } 170 171 fibril_add_ready(fid); 168 172 } 169 173 -
uspace/srv/net/tcp/ncsim.h
r422af2b r68f57e1 40 40 extern void tcp_ncsim_init(void); 41 41 extern void tcp_ncsim_bounce_seg(tcp_sockpair_t *, tcp_segment_t *); 42 extern void tcp_ncsim_thread_start(void); 43 42 extern void tcp_ncsim_fibril_start(void); 44 43 45 44 #endif -
uspace/srv/net/tcp/rqueue.c
r422af2b r68f57e1 39 39 #include <io/log.h> 40 40 #include <stdlib.h> 41 #include < thread.h>41 #include <fibril.h> 42 42 #include "conn.h" 43 43 #include "pdu.h" … … 128 128 } 129 129 130 /** Receive queue handler thread. */131 static void tcp_rqueue_thread(void *arg)130 /** Receive queue handler fibril. */ 131 static int tcp_rqueue_fibril(void *arg) 132 132 { 133 133 link_t *link; 134 134 tcp_rqueue_entry_t *rqe; 135 135 136 log_msg(LVL_DEBUG, "tcp_rqueue_ thread()");136 log_msg(LVL_DEBUG, "tcp_rqueue_fibril()"); 137 137 138 138 while (true) { … … 142 142 tcp_as_segment_arrived(&rqe->sp, rqe->seg); 143 143 } 144 145 /* Not reached */ 146 return 0; 144 147 } 145 148 146 /** Start receive queue handler thread. */147 void tcp_rqueue_ thread_start(void)149 /** Start receive queue handler fibril. */ 150 void tcp_rqueue_fibril_start(void) 148 151 { 149 thread_id_t tid; 150 int rc; 152 fid_t fid; 151 153 152 log_msg(LVL_DEBUG, "tcp_rqueue_ thread_start()");154 log_msg(LVL_DEBUG, "tcp_rqueue_fibril_start()"); 153 155 154 rc = thread_create(tcp_rqueue_thread, NULL, "rqueue", &tid);155 if ( rc != EOK) {156 log_msg(LVL_ERROR, "Failed creating rqueue thread.");156 fid = fibril_create(tcp_rqueue_fibril, NULL); 157 if (fid == 0) { 158 log_msg(LVL_ERROR, "Failed creating rqueue fibril."); 157 159 return; 158 160 } 161 162 fibril_add_ready(fid); 159 163 } 160 164 -
uspace/srv/net/tcp/rqueue.h
r422af2b r68f57e1 42 42 extern void tcp_rqueue_insert_seg(tcp_sockpair_t *, tcp_segment_t *); 43 43 extern void tcp_rqueue_handler(void *); 44 extern void tcp_rqueue_ thread_start(void);44 extern void tcp_rqueue_fibril_start(void); 45 45 46 46 -
uspace/srv/net/tcp/segment.c
r422af2b r68f57e1 248 248 void tcp_segment_dump(tcp_segment_t *seg) 249 249 { 250 log_msg(LVL_DEBUG , "Segment dump:");251 log_msg(LVL_DEBUG , " - ctrl = %u", (unsigned)seg->ctrl);252 log_msg(LVL_DEBUG , " - seq = % " PRIu32, seg->seq);253 log_msg(LVL_DEBUG , " - ack = % " PRIu32, seg->ack);254 log_msg(LVL_DEBUG , " - len = % " PRIu32, seg->len);255 log_msg(LVL_DEBUG , " - wnd = % " PRIu32, seg->wnd);256 log_msg(LVL_DEBUG , " - up = % " PRIu32, seg->up);250 log_msg(LVL_DEBUG2, "Segment dump:"); 251 log_msg(LVL_DEBUG2, " - ctrl = %u", (unsigned)seg->ctrl); 252 log_msg(LVL_DEBUG2, " - seq = % " PRIu32, seg->seq); 253 log_msg(LVL_DEBUG2, " - ack = % " PRIu32, seg->ack); 254 log_msg(LVL_DEBUG2, " - len = % " PRIu32, seg->len); 255 log_msg(LVL_DEBUG2, " - wnd = % " PRIu32, seg->wnd); 256 log_msg(LVL_DEBUG2, " - up = % " PRIu32, seg->up); 257 257 } 258 258 -
uspace/srv/net/tcp/sock.c
r422af2b r68f57e1 51 51 #include "ucall.h" 52 52 53 #define FRAGMENT_SIZE 102454 55 53 #define MAX_BACKLOG 128 56 54 … … 66 64 static void tcp_sock_connection(ipc_callid_t iid, ipc_call_t *icall, void *arg); 67 65 static void tcp_sock_cstate_cb(tcp_conn_t *conn, void *arg); 66 static int tcp_sock_recv_fibril(void *arg); 68 67 69 68 int tcp_sock_init(void) … … 97 96 async_exch_t *exch = async_exchange_begin(sock_core->sess); 98 97 async_msg_5(exch, NET_SOCKET_RECEIVED, (sysarg_t)sock_core->socket_id, 99 FRAGMENT_SIZE, 0, 0, 1);98 TCP_SOCK_FRAGMENT_SIZE, 0, 0, 1); 100 99 async_exchange_end(exch); 101 100 } … … 106 105 async_exch_t *exch = async_exchange_begin(lsock_core->sess); 107 106 async_msg_5(exch, NET_SOCKET_ACCEPTED, (sysarg_t)lsock_core->socket_id, 108 FRAGMENT_SIZE, 0, 0, 0);107 TCP_SOCK_FRAGMENT_SIZE, 0, 0, 0); 109 108 async_exchange_end(exch); 110 109 } 111 110 111 static int tcp_sock_create(tcp_client_t *client, tcp_sockdata_t **rsock) 112 { 113 tcp_sockdata_t *sock; 114 115 log_msg(LVL_DEBUG, "tcp_sock_create()"); 116 *rsock = NULL; 117 118 sock = calloc(sizeof(tcp_sockdata_t), 1); 119 if (sock == NULL) 120 return ENOMEM; 121 122 fibril_mutex_initialize(&sock->lock); 123 sock->client = client; 124 125 sock->recv_buffer_used = 0; 126 sock->recv_error = TCP_EOK; 127 fibril_mutex_initialize(&sock->recv_buffer_lock); 128 fibril_condvar_initialize(&sock->recv_buffer_cv); 129 list_initialize(&sock->ready); 130 131 *rsock = sock; 132 return EOK; 133 } 134 135 static void tcp_sock_uncreate(tcp_sockdata_t *sock) 136 { 137 log_msg(LVL_DEBUG, "tcp_sock_uncreate()"); 138 free(sock); 139 } 140 141 static int tcp_sock_finish_setup(tcp_sockdata_t *sock, int *sock_id) 142 { 143 socket_core_t *sock_core; 144 int rc; 145 146 log_msg(LVL_DEBUG, "tcp_sock_finish_setup()"); 147 148 sock->recv_fibril = fibril_create(tcp_sock_recv_fibril, sock); 149 if (sock->recv_fibril == 0) 150 return ENOMEM; 151 152 rc = socket_create(&sock->client->sockets, sock->client->sess, 153 sock, sock_id); 154 155 if (rc != EOK) 156 return rc; 157 158 sock_core = socket_cores_find(&sock->client->sockets, *sock_id); 159 assert(sock_core != NULL); 160 sock->sock_core = sock_core; 161 162 return EOK; 163 } 164 112 165 static void tcp_sock_socket(tcp_client_t *client, ipc_callid_t callid, ipc_call_t call) 113 166 { 114 167 tcp_sockdata_t *sock; 115 socket_core_t *sock_core;116 168 int sock_id; 117 169 int rc; … … 119 171 120 172 log_msg(LVL_DEBUG, "tcp_sock_socket()"); 121 sock = calloc(sizeof(tcp_sockdata_t), 1); 122 if (sock == NULL) { 123 async_answer_0(callid, ENOMEM); 124 return; 125 } 126 127 fibril_mutex_initialize(&sock->lock); 128 sock->client = client; 173 174 rc = tcp_sock_create(client, &sock); 175 if (rc != EOK) { 176 async_answer_0(callid, rc); 177 return; 178 } 179 129 180 sock->laddr.ipv4 = TCP_IPV4_ANY; 130 181 sock->lconn = NULL; 131 182 sock->backlog = 0; 132 list_initialize(&sock->ready);133 183 134 184 sock_id = SOCKET_GET_SOCKET_ID(call); 135 rc = socket_create(&client->sockets, client->sess,sock, &sock_id);185 rc = tcp_sock_finish_setup(sock, &sock_id); 136 186 if (rc != EOK) { 187 tcp_sock_uncreate(sock); 137 188 async_answer_0(callid, rc); 138 189 return; 139 190 } 140 191 141 sock_core = socket_cores_find(&client->sockets, sock_id);142 assert(sock_core != NULL);143 sock->sock_core = sock_core;144 145 192 SOCKET_SET_SOCKET_ID(answer, sock_id); 146 193 147 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);194 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE); 148 195 SOCKET_SET_HEADER_SIZE(answer, sizeof(tcp_header_t)); 149 196 … … 361 408 } 362 409 410 if (rc == EOK) 411 fibril_add_ready(socket->recv_fibril); 412 363 413 async_answer_0(callid, rc); 364 365 /* Push one fragment notification to client's queue */366 tcp_sock_notify_data(sock_core);367 log_msg(LVL_DEBUG, "tcp_sock_connect(): notify conn\n");368 414 } 369 415 … … 374 420 int asock_id; 375 421 socket_core_t *sock_core; 376 socket_core_t *asock_core;377 422 tcp_sockdata_t *socket; 378 423 tcp_sockdata_t *asocket; … … 444 489 /* Allocate socket for accepted connection */ 445 490 446 log_msg(LVL_DEBUG, "tcp_sock_accept(): allocate asocket\n"); 447 asocket = calloc(sizeof(tcp_sockdata_t), 1); 448 if (asocket == NULL) { 449 fibril_mutex_unlock(&socket->lock); 450 async_answer_0(callid, ENOMEM); 451 return; 452 } 453 454 fibril_mutex_initialize(&asocket->lock); 455 asocket->client = client; 491 rc = tcp_sock_create(client, &asocket); 492 if (rc != EOK) { 493 fibril_mutex_unlock(&socket->lock); 494 async_answer_0(callid, rc); 495 return; 496 } 497 456 498 asocket->conn = conn; 457 499 log_msg(LVL_DEBUG, "tcp_sock_accept():create asocket\n"); 458 500 459 rc = socket_create(&client->sockets, client->sess,asocket, &asock_id);501 rc = tcp_sock_finish_setup(asocket, &asock_id); 460 502 if (rc != EOK) { 503 tcp_sock_uncreate(asocket); 461 504 fibril_mutex_unlock(&socket->lock); 462 505 async_answer_0(callid, rc); 463 506 return; 464 507 } 508 509 fibril_add_ready(asocket->recv_fibril); 510 465 511 log_msg(LVL_DEBUG, "tcp_sock_accept(): find acore\n"); 466 512 467 asock_core = socket_cores_find(&client->sockets, asock_id); 468 assert(asock_core != NULL); 469 470 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE); 513 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE); 471 514 SOCKET_SET_SOCKET_ID(answer, asock_id); 472 515 SOCKET_SET_ADDRESS_LENGTH(answer, sizeof(struct sockaddr_in)); 473 516 474 async_answer_3(callid, asock _core->socket_id,517 async_answer_3(callid, asocket->sock_core->socket_id, 475 518 IPC_GET_ARG1(answer), IPC_GET_ARG2(answer), 476 519 IPC_GET_ARG3(answer)); … … 478 521 /* Push one fragment notification to client's queue */ 479 522 log_msg(LVL_DEBUG, "tcp_sock_accept(): notify data\n"); 480 tcp_sock_notify_data(asock_core);481 523 fibril_mutex_unlock(&socket->lock); 482 524 } … … 492 534 ipc_callid_t wcallid; 493 535 size_t length; 494 uint8_t buffer[ FRAGMENT_SIZE];536 uint8_t buffer[TCP_SOCK_FRAGMENT_SIZE]; 495 537 tcp_error_t trc; 496 538 int rc; … … 523 565 } 524 566 525 if (length > FRAGMENT_SIZE)526 length = FRAGMENT_SIZE;567 if (length > TCP_SOCK_FRAGMENT_SIZE) 568 length = TCP_SOCK_FRAGMENT_SIZE; 527 569 528 570 rc = async_data_write_finalize(wcallid, buffer, length); … … 560 602 561 603 IPC_SET_ARG1(answer, 0); 562 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, FRAGMENT_SIZE);604 SOCKET_SET_DATA_FRAGMENT_SIZE(answer, TCP_SOCK_FRAGMENT_SIZE); 563 605 async_answer_2(callid, EOK, IPC_GET_ARG1(answer), 564 606 IPC_GET_ARG2(answer)); … … 581 623 ipc_call_t answer; 582 624 ipc_callid_t rcallid; 583 uint8_t buffer[FRAGMENT_SIZE];584 625 size_t data_len; 585 xflags_t xflags;586 tcp_error_t trc;587 626 struct sockaddr_in addr; 588 627 tcp_sock_t *rsock; … … 611 650 (void)flags; 612 651 613 trc = tcp_uc_receive(socket->conn, buffer, FRAGMENT_SIZE, &data_len, 614 &xflags); 615 log_msg(LVL_DEBUG, "**** tcp_uc_receive done"); 616 617 switch (trc) { 652 log_msg(LVL_DEBUG, "tcp_sock_recvfrom(): lock recv_buffer_lock"); 653 fibril_mutex_lock(&socket->recv_buffer_lock); 654 while (socket->recv_buffer_used == 0 && socket->recv_error == TCP_EOK) { 655 log_msg(LVL_DEBUG, "wait for recv_buffer_cv + recv_buffer_used != 0"); 656 fibril_condvar_wait(&socket->recv_buffer_cv, 657 &socket->recv_buffer_lock); 658 } 659 660 log_msg(LVL_DEBUG, "Got data in sock recv_buffer"); 661 662 data_len = socket->recv_buffer_used; 663 rc = socket->recv_error; 664 665 switch (socket->recv_error) { 618 666 case TCP_EOK: 619 667 rc = EOK; … … 630 678 } 631 679 632 log_msg(LVL_DEBUG, "**** tcp_uc_receive-> %d", rc);680 log_msg(LVL_DEBUG, "**** recv result -> %d", rc); 633 681 if (rc != EOK) { 682 fibril_mutex_unlock(&socket->recv_buffer_lock); 634 683 fibril_mutex_unlock(&socket->lock); 635 684 async_answer_0(callid, rc); … … 646 695 log_msg(LVL_DEBUG, "addr read receive"); 647 696 if (!async_data_read_receive(&rcallid, &addr_length)) { 697 fibril_mutex_unlock(&socket->recv_buffer_lock); 648 698 fibril_mutex_unlock(&socket->lock); 649 699 async_answer_0(callid, EINVAL); … … 657 707 rc = async_data_read_finalize(rcallid, &addr, addr_length); 658 708 if (rc != EOK) { 709 fibril_mutex_unlock(&socket->recv_buffer_lock); 659 710 fibril_mutex_unlock(&socket->lock); 660 711 async_answer_0(callid, EINVAL); … … 665 716 log_msg(LVL_DEBUG, "data read receive"); 666 717 if (!async_data_read_receive(&rcallid, &length)) { 718 fibril_mutex_unlock(&socket->recv_buffer_lock); 667 719 fibril_mutex_unlock(&socket->lock); 668 720 async_answer_0(callid, EINVAL); … … 674 726 675 727 log_msg(LVL_DEBUG, "data read finalize"); 676 rc = async_data_read_finalize(rcallid, buffer, length); 728 rc = async_data_read_finalize(rcallid, socket->recv_buffer, length); 729 730 socket->recv_buffer_used -= length; 731 log_msg(LVL_DEBUG, "tcp_sock_recvfrom: %zu left in buffer", 732 socket->recv_buffer_used); 733 if (socket->recv_buffer_used > 0) { 734 memmove(socket->recv_buffer, socket->recv_buffer + length, 735 socket->recv_buffer_used); 736 tcp_sock_notify_data(socket->sock_core); 737 } 738 739 fibril_condvar_broadcast(&socket->recv_buffer_cv); 677 740 678 741 if (length < data_len && rc == EOK) … … 681 744 SOCKET_SET_READ_DATA_LENGTH(answer, length); 682 745 async_answer_1(callid, EOK, IPC_GET_ARG1(answer)); 683 684 /* Push one fragment notification to client's queue */ 685 tcp_sock_notify_data(sock_core); 746 747 fibril_mutex_unlock(&socket->recv_buffer_lock); 686 748 fibril_mutex_unlock(&socket->lock); 687 749 } … … 694 756 tcp_error_t trc; 695 757 int rc; 696 uint8_t buffer[FRAGMENT_SIZE];697 size_t data_len;698 xflags_t xflags;699 758 700 759 log_msg(LVL_DEBUG, "tcp_sock_close()"); … … 717 776 return; 718 777 } 719 720 /* Drain incoming data. This should really be done in the background. */721 do {722 trc = tcp_uc_receive(socket->conn, buffer,723 FRAGMENT_SIZE, &data_len, &xflags);724 } while (trc == TCP_EOK);725 726 tcp_uc_delete(socket->conn);727 778 } 728 779 … … 776 827 tcp_sock_notify_aconn(socket->sock_core); 777 828 fibril_mutex_unlock(&socket->lock); 829 } 830 831 static int tcp_sock_recv_fibril(void *arg) 832 { 833 tcp_sockdata_t *sock = (tcp_sockdata_t *)arg; 834 size_t data_len; 835 xflags_t xflags; 836 tcp_error_t trc; 837 838 log_msg(LVL_DEBUG, "tcp_sock_recv_fibril()"); 839 840 while (true) { 841 log_msg(LVL_DEBUG, "call tcp_uc_receive()"); 842 fibril_mutex_lock(&sock->recv_buffer_lock); 843 while (sock->recv_buffer_used != 0) 844 fibril_condvar_wait(&sock->recv_buffer_cv, 845 &sock->recv_buffer_lock); 846 847 trc = tcp_uc_receive(sock->conn, sock->recv_buffer, 848 TCP_SOCK_FRAGMENT_SIZE, &data_len, &xflags); 849 850 if (trc != TCP_EOK) { 851 sock->recv_error = trc; 852 fibril_condvar_broadcast(&sock->recv_buffer_cv); 853 fibril_mutex_unlock(&sock->recv_buffer_lock); 854 tcp_sock_notify_data(sock->sock_core); 855 break; 856 } 857 858 log_msg(LVL_DEBUG, "got data - broadcast recv_buffer_cv"); 859 860 sock->recv_buffer_used = data_len; 861 fibril_condvar_broadcast(&sock->recv_buffer_cv); 862 fibril_mutex_unlock(&sock->recv_buffer_lock); 863 tcp_sock_notify_data(sock->sock_core); 864 } 865 866 tcp_uc_delete(sock->conn); 867 868 return 0; 778 869 } 779 870 -
uspace/srv/net/tcp/tcp.c
r422af2b r68f57e1 180 180 181 181 tcp_rqueue_init(); 182 tcp_rqueue_ thread_start();182 tcp_rqueue_fibril_start(); 183 183 184 184 tcp_ncsim_init(); 185 tcp_ncsim_ thread_start();185 tcp_ncsim_fibril_start(); 186 186 187 187 if (0) tcp_test(); -
uspace/srv/net/tcp/tcp_type.h
r422af2b r68f57e1 39 39 #include <async.h> 40 40 #include <bool.h> 41 #include <fibril.h> 41 42 #include <fibril_synch.h> 42 43 #include <socket_core.h> … … 331 332 } tcp_client_t; 332 333 334 #define TCP_SOCK_FRAGMENT_SIZE 1024 335 333 336 typedef struct tcp_sockdata { 334 337 /** Lock */ … … 348 351 /** List of connections (from lconn) that are ready to be accepted */ 349 352 list_t ready; 353 /** Receiving fibril */ 354 fid_t recv_fibril; 355 uint8_t recv_buffer[TCP_SOCK_FRAGMENT_SIZE]; 356 size_t recv_buffer_used; 357 fibril_mutex_t recv_buffer_lock; 358 fibril_condvar_t recv_buffer_cv; 359 tcp_error_t recv_error; 350 360 } tcp_sockdata_t; 351 361 -
uspace/srv/net/tcp/test.c
r422af2b r68f57e1 38 38 #include <errno.h> 39 39 #include <stdio.h> 40 #include < thread.h>40 #include <fibril.h> 41 41 #include <str.h> 42 42 #include "tcp_type.h" … … 47 47 #define RCV_BUF_SIZE 64 48 48 49 static voidtest_srv(void *arg)49 static int test_srv(void *arg) 50 50 { 51 51 tcp_conn_t *conn; … … 84 84 85 85 printf("test_srv() terminating\n"); 86 return 0; 86 87 } 87 88 88 static voidtest_cli(void *arg)89 static int test_cli(void *arg) 89 90 { 90 91 tcp_conn_t *conn; … … 112 113 printf("C: User close...\n"); 113 114 tcp_uc_close(conn); 115 116 return 0; 114 117 } 115 118 116 119 void tcp_test(void) 117 120 { 118 thread_id_t srv_tid; 119 thread_id_t cli_tid; 120 int rc; 121 fid_t srv_fid; 122 fid_t cli_fid; 121 123 122 124 printf("tcp_test()\n"); … … 125 127 126 128 if (0) { 127 rc = thread_create(test_srv, NULL, "test_srv", &srv_tid);128 if ( rc != EOK) {129 printf("Failed to create server thread.\n");129 srv_fid = fibril_create(test_srv, NULL); 130 if (srv_fid == 0) { 131 printf("Failed to create server fibril.\n"); 130 132 return; 131 133 } 134 135 fibril_add_ready(srv_fid); 132 136 } 133 137 134 138 if (0) { 135 rc = thread_create(test_cli, NULL, "test_cli", &cli_tid);136 if ( rc != EOK) {137 printf("Failed to create client thread.\n");139 cli_fid = fibril_create(test_cli, NULL); 140 if (cli_fid == 0) { 141 printf("Failed to create client fibril.\n"); 138 142 return; 139 143 } 144 145 fibril_add_ready(cli_fid); 140 146 } 141 147 }
Note:
See TracChangeset
for help on using the changeset viewer.