Changeset 630
- Timestamp:
- May 21, 2019, 6:00:06 PM (6 years ago)
- Location:
- trunk
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/tsar_mips32/core/hal_gpt.c
r629 r630 318 318 319 319 ///////////////////////////////////////////////////////////////////////////////////////// 320 // This static function check that a PTE1 entry, in the PT1 of a possibly remote GPT, 321 // identified by the <pte1_xp> argument is mapped. If this entry is not mapped, 322 // it allocates a - local or remote - PT2, updates the PTE1 value in PT1, and 323 // returns the PTE1 value in the <pte1> buffer. 324 // It uses the TSR_MMU_LOCKED attribute in PTE1 to handle possible concurrent 325 // mappings of the missing PTE1: 326 // - If the PTE1 is unmapped and unlocked => it tries to atomically lock this PTE1, 327 // and map it if lock is successful. 328 // - If the PTE1 is unmapped but locked => it poll the PTE1 value, unti the mapping 329 // is done by the other thread. 330 // - If the PTE1 is already mapped => it does nothing 331 // It returns an error if it cannot allocate memory fot a new PT2. 320 // This static function returns in the <ptd1_value> buffer the current value of 321 // the PT1 entry identified by the <pte1_xp> argument, that must contain a PTD1 322 // (i.e. a pointer on a PT2). If this PT1 entry is not mapped yet, it allocates a 323 // new PT2 and updates the PT1 entry, using the TSAR_MMU_LOCKED attribute in PT1 324 // entry, to handle possible concurrent mappings of the missing PTD1: 325 // 1) If the PT1 entry is unmapped, it tries to atomically lock this PTD1. 326 // - if the atomic lock is successful it allocates a new PT1, and updates the PTD1. 327 // - else, it simply waits, in a polling loop, the mapping done by another thread. 328 // In both cases, returns the PTD1 value, when the mapping is completed. 329 // 2) If the PT1 entry is already mapped, it returns the PTD1 value, and does 330 // nothing else. 332 331 ///////////////////////////////////////////////////////////////////////////////////////// 333 static error_t hal_gpt_allocate_pt2( xptr_t pt e1_xp,334 uint32_t * pte1_value )335 { 336 cxy_t gpt_cxy; // target GPT cluster = GET_CXY( pt e1_xp );337 uint32_t pt e1; // PTE1 value332 static error_t hal_gpt_allocate_pt2( xptr_t ptd1_xp, 333 uint32_t * ptd1_value ) 334 { 335 cxy_t gpt_cxy; // target GPT cluster = GET_CXY( ptd1_xp ); 336 uint32_t ptd1; // PTD1 value 338 337 ppn_t pt2_ppn; // PPN of page containing the new PT2 339 338 bool_t atomic; … … 342 341 343 342 // get GPT cluster identifier 344 gpt_cxy = GET_CXY( pte1_xp ); 345 346 // get current pte1 value 347 pte1 = hal_remote_l32( pte1_xp ); 348 349 if( ((pte1 & TSAR_PTE_MAPPED) == 0) && // PTE1 unmapped and unlocked 350 ((pte1 & TSAR_PTE_LOCKED) == 0) ) // try to allocate a new PT2 343 gpt_cxy = GET_CXY( ptd1_xp ); 344 345 // get current ptd1 value 346 ptd1 = hal_remote_l32( ptd1_xp ); 347 348 if( (ptd1 & TSAR_PTE_MAPPED) == 0) // PTD1 unmapped and unlocked 351 349 { 352 // atomically lock the PT E1 to prevent concurrent PTE1 mappings353 atomic = hal_remote_atomic_cas( pt e1_xp,354 pt e1,355 pt e1 | TSAR_PTE_LOCKED );356 357 if( atomic ) // PT E1 successfully locked350 // atomically lock the PTD1 to prevent concurrent PTD1 mappings 351 atomic = hal_remote_atomic_cas( ptd1_xp, 352 ptd1, 353 ptd1 | TSAR_PTE_LOCKED ); 354 355 if( atomic ) // PTD1 successfully locked 358 356 { 359 357 // allocate one physical page for PT2 … … 377 375 pt2_ppn = ppm_page2ppn( page_xp ); 378 376 379 // build PT E1 value380 pt e1 = TSAR_PTE_MAPPED | TSAR_PTE_SMALL | pt2_ppn;377 // build PTD1 378 ptd1 = TSAR_PTE_MAPPED | TSAR_PTE_SMALL | pt2_ppn; 381 379 382 380 // set the PTD1 value in PT1 383 hal_remote_s32( pt e1_xp , pte1 );381 hal_remote_s32( ptd1_xp , ptd1 ); 384 382 hal_fence(); 385 383 … … 388 386 uint32_t cycle = (uint32_t)hal_get_cycles(); 389 387 if( DEBUG_HAL_GPT_ALLOCATE_PT2 < cycle ) 390 printk("\n[%s] : thread[%x,%x] map PT E1 / cxy %x / ix1 %d / pt1 %x / ptd1 %x\n",391 __FUNCTION__, this->process->pid, this->trdid, gpt_cxy, ix1, pt1_ptr, pt e1 );388 printk("\n[%s] : thread[%x,%x] map PTD1 / cxy %x / ix1 %d / pt1 %x / ptd1 %x\n", 389 __FUNCTION__, this->process->pid, this->trdid, gpt_cxy, ix1, pt1_ptr, ptd1 ); 392 390 #endif 393 391 } 394 else 392 else // PTD1 modified by another thread 395 393 { 396 // poll PT E1 until mapped by another thread397 while( (pt e1 & TSAR_PTE_MAPPED) == 0 ) pte1 = hal_remote_l32( pte1_xp );394 // poll PTD1 until mapped by another thread 395 while( (ptd1 & TSAR_PTE_MAPPED) == 0 ) ptd1 = hal_remote_l32( ptd1_xp ); 398 396 } 399 397 } 400 else if( ((pte1 & TSAR_PTE_MAPPED) == 0) && 401 ((pte1 & TSAR_PTE_LOCKED) != 0) ) 402 { 403 // poll PTE1 until mapped by another thread 404 while( (pte1 & TSAR_PTE_MAPPED) == 0 ) pte1 = hal_remote_l32( pte1_xp ); 405 } 406 else // PTE1 mapped => just use it 398 else // PTD1 mapped => just use it 407 399 { 408 400 … … 411 403 uint32_t cycle = (uint32_t)hal_get_cycles(); 412 404 if( DEBUG_HAL_GPT_ALLOCATE_PT2 < cycle ) 413 printk("\n[%s] : thread[%x,%x] PT E1 mapped / cxy %x / ix1 %d / pt1 %x / ptd1 %x\n",414 __FUNCTION__, this->process->pid, this->trdid, gpt_cxy, ix1, pt1_ptr, pt e1 );405 printk("\n[%s] : thread[%x,%x] PTD1 mapped / cxy %x / ix1 %d / pt1 %x / ptd1 %x\n", 406 __FUNCTION__, this->process->pid, this->trdid, gpt_cxy, ix1, pt1_ptr, ptd1 ); 415 407 #endif 416 408 417 409 } 418 410 419 *pt e1_value = pte1;411 *ptd1_value = ptd1; 420 412 return 0; 421 413 -
trunk/kernel/fs/fatfs.c
r628 r630 1404 1404 1405 1405 #if (DEBUG_FATFS_ADD_DENTRY & 1) 1406 cycle = (uint32_t)hal_get_cycles(); 1406 1407 if( DEBUG_FATFS_ADD_DENTRY < cycle ) 1407 printk("\n[%s] FSM step = %d / offset = %x / nb_lfn = %d \n",1408 __FUNCTION__, step, offset, nb_lfn );1408 printk("\n[%s] FSM step = %d / offset = %x / nb_lfn = %d / cycle %d\n", 1409 __FUNCTION__, step, offset, nb_lfn, cycle ); 1409 1410 #endif 1410 1411 … … 1533 1534 } // exit while 1534 1535 1536 #if (DEBUG_FATFS_ADD_DENTRY & 1) 1537 cycle = (uint32_t)hal_get_cycles(); 1538 if( DEBUG_FATFS_ADD_DENTRY < cycle ) 1539 printk("\n[%s] thread[%x,%x] before IOC access / cycle %d\n", 1540 __FUNCTION__, this->process->pid, this->trdid, cycle ); 1541 #endif 1542 1535 1543 // copy the modified page to the IOC device 1536 1544 fatfs_move_page( page_xp , IOC_SYNC_WRITE ); -
trunk/kernel/fs/vfs.c
r629 r630 2915 2915 fs_type = hal_remote_l32( XPTR( child_cxy , &ctx_ptr->type ) ); 2916 2916 2917 //////////////////////////// create <.> 2917 //////////////////////////// create <.> dentry ////////////////////// 2918 2918 if( child_cxy == local_cxy ) 2919 2919 { … … 2941 2941 2942 2942 #if(DEBUG_VFS_ADD_SPECIAL & 1) 2943 cycle = (uint32_t)hal_get_cycles(); 2943 2944 if( DEBUG_VFS_ADD_SPECIAL < cycle ) 2944 printk("\n[%s] thread[%x,%x] created dentry <.> (%x,%x) \n",2945 __FUNCTION__, this->process->pid, this->trdid, child_cxy, dentry_ptr );2945 printk("\n[%s] thread[%x,%x] created dentry <.> (%x,%x) / cycle %d\n", 2946 __FUNCTION__, this->process->pid, this->trdid, child_cxy, dentry_ptr, cycle ); 2946 2947 #endif 2947 2948 … … 2969 2970 2970 2971 #if(DEBUG_VFS_ADD_SPECIAL & 1) 2972 cycle = (uint32_t)hal_get_cycles(); 2971 2973 if( DEBUG_VFS_ADD_SPECIAL < cycle ) 2972 printk("\n[%s] thread[%x,%x] linked dentry <.> to parent and child inodes \n",2973 __FUNCTION__, this->process->pid, this->trdid );2974 printk("\n[%s] thread[%x,%x] linked dentry <.> to parent and child inodes / cycle %d\n", 2975 __FUNCTION__, this->process->pid, this->trdid, cycle ); 2974 2976 #endif 2975 2977 2976 2978 // introduce <.> dentry into child directory mapper 2977 if( child_cxy == local_cxy ) 2978 { 2979 error = vfs_fs_add_dentry( child_ptr, 2980 dentry_ptr ); 2981 } 2982 else 2983 { 2984 rpc_vfs_fs_add_dentry_client( child_cxy, 2985 child_ptr, 2986 dentry_ptr, 2987 &error ); 2988 } 2989 if( error ) 2990 { 2991 printk("\n[ERROR] in %s : cannot introduce dentry <..> in mapper %x\n", 2992 __FUNCTION__ ); 2993 return -1; 2994 } 2979 // only if the target directory is not the root VFS 2980 if( child_xp != parent_xp ) 2981 { 2982 if( child_cxy == local_cxy ) 2983 { 2984 error = vfs_fs_add_dentry( child_ptr, 2985 dentry_ptr ); 2986 } 2987 else 2988 { 2989 rpc_vfs_fs_add_dentry_client( child_cxy, 2990 child_ptr, 2991 dentry_ptr, 2992 &error ); 2993 } 2994 if( error ) 2995 { 2996 printk("\n[ERROR] in %s : cannot introduce dentry <..> in mapper %x\n", 2997 __FUNCTION__ ); 2998 return -1; 2999 } 2995 3000 2996 3001 #if(DEBUG_VFS_ADD_SPECIAL & 1) 3002 cycle = (uint32_t)hal_get_cycles(); 2997 3003 if( DEBUG_VFS_ADD_SPECIAL < cycle ) 2998 printk("\n[%s] thread[%x,%x] registered dentry <.> in child mapper\n", 2999 __FUNCTION__, this->process->pid, this->trdid ); 3000 #endif 3001 3002 ///////////////////////////// create <..> dentry 3004 printk("\n[%s] thread[%x,%x] registered dentry <.> in child mapper / cycle %d\n", 3005 __FUNCTION__, this->process->pid, this->trdid, cycle ); 3006 #endif 3007 3008 } 3009 3010 ///////////////////////////// create <..> dentry /////////////////////// 3003 3011 if( child_cxy == local_cxy ) 3004 3012 { … … 3026 3034 3027 3035 #if(DEBUG_VFS_ADD_SPECIAL & 1) 3036 cycle = (uint32_t)hal_get_cycles(); 3028 3037 if( DEBUG_VFS_ADD_SPECIAL < cycle ) 3029 printk("\n[%s] thread[%x,%x] created dentry <..> (%x,%x) \n",3030 __FUNCTION__, this->process->pid, this->trdid, child_cxy, dentry_ptr );3038 printk("\n[%s] thread[%x,%x] created dentry <..> (%x,%x) / cycle %d\n", 3039 __FUNCTION__, this->process->pid, this->trdid, child_cxy, dentry_ptr, cycle ); 3031 3040 #endif 3032 3041 … … 3053 3062 3054 3063 #if(DEBUG_VFS_ADD_SPECIAL & 1) 3064 cycle = (uint32_t)hal_get_cycles(); 3055 3065 if( DEBUG_VFS_ADD_SPECIAL < cycle ) 3056 printk("\n[%s] thread[%x,%x] linked dentry <..> to parent and child inodes \n",3057 __FUNCTION__, this->process->pid, this->trdid );3066 printk("\n[%s] thread[%x,%x] linked dentry <..> to parent and child inodes / cycle %d\n", 3067 __FUNCTION__, this->process->pid, this->trdid, cycle ); 3058 3068 #endif 3059 3069 3060 3070 // introduce <..> dentry into child directory mapper 3061 if( child_cxy == local_cxy ) 3062 { 3063 error = vfs_fs_add_dentry( child_ptr, 3064 dentry_ptr ); 3065 } 3066 else 3067 { 3068 rpc_vfs_fs_add_dentry_client( child_cxy, 3069 child_ptr, 3070 dentry_ptr, 3071 &error ); 3072 } 3073 if( error ) 3074 { 3075 printk("\n[ERROR] in %s : cannot introduce dentry <..> in mapper %x\n", 3076 __FUNCTION__ ); 3077 return -1; 3078 } 3071 // only if the target directory is not the root VFS 3072 if( child_xp != parent_xp ) 3073 { 3074 if( child_cxy == local_cxy ) 3075 { 3076 error = vfs_fs_add_dentry( child_ptr, 3077 dentry_ptr ); 3078 } 3079 else 3080 { 3081 rpc_vfs_fs_add_dentry_client( child_cxy, 3082 child_ptr, 3083 dentry_ptr, 3084 &error ); 3085 } 3086 if( error ) 3087 { 3088 printk("\n[ERROR] in %s : cannot introduce dentry <..> in mapper %x\n", 3089 __FUNCTION__ ); 3090 return -1; 3091 } 3079 3092 3080 3093 #if(DEBUG_VFS_ADD_SPECIAL & 1) 3094 cycle = (uint32_t)hal_get_cycles(); 3081 3095 if( DEBUG_VFS_ADD_SPECIAL < cycle ) 3082 printk("\n[%s] thread[%x,%x] registered dentry <..> in child mapper\n", 3083 __FUNCTION__, this->process->pid, this->trdid ); 3084 #endif 3096 printk("\n[%s] thread[%x,%x] registered dentry <..> in child mapper / cycle %d\n", 3097 __FUNCTION__, this->process->pid, this->trdid, cycle ); 3098 #endif 3099 3100 } 3085 3101 3086 3102 #if DEBUG_VFS_ADD_SPECIAL -
trunk/kernel/kern/kernel_init.c
r629 r630 1155 1155 thread_unblock( XPTR( local_cxy , thread ) , THREAD_BLOCKED_GLOBAL ); 1156 1156 core->scheduler.idle = thread; 1157 1158 #if( DEBUG_KERNEL_INIT & 1 )1159 sched_display( core_lid );1160 #endif1161 1157 1162 1158 // core[O] in cluster[0] creates the VFS root -
trunk/kernel/kern/scheduler.c
r629 r630 248 248 uint32_t cycle = (uint32_t)hal_get_cycles(); 249 249 if( DEBUG_SCHED_HANDLE_SIGNALS < cycle ) 250 printk("\n[%s] thread[%x,%x] on core[%x,%d] deleted (still %d threads)/ cycle %d\n",251 __FUNCTION__, process->pid, thread->trdid, local_cxy, thread->core->lid, c ount, cycle );250 printk("\n[%s] thread[%x,%x] on core[%x,%d] deleted / cycle %d\n", 251 __FUNCTION__, process->pid, thread->trdid, local_cxy, thread->core->lid, cycle ); 252 252 #endif 253 253 … … 259 259 uint32_t false_nr = thread->info.false_pgfault_nr; 260 260 uint32_t false_cost = (false_nr == 0) ? 0 : (thread->info.false_pgfault_cost / false_nr); 261 printk(" ***** page faults for thread[%x,%x]\n"261 printk("\n***** page faults for thread[%x,%x]\n" 262 262 " - %d local : %d cycles\n" 263 263 " - %d global : %d cycles\n" -
trunk/kernel/mm/vmm.c
r629 r630 1978 1978 ref_ptr = GET_PTR( process->ref_xp ); 1979 1979 1980 // private vseg or (local == reference) => access only the local GPT 1980 /////////////// private vseg or (local == reference) 1981 /////////////// => access only the local GPT 1981 1982 if( (vseg->type == VSEG_TYPE_STACK) || 1982 1983 (vseg->type == VSEG_TYPE_CODE) || … … 2028 2029 } // end local GPT access 2029 2030 2030 // public vseg and (local != reference) => access ref GPT to update local GPT 2031 /////////////////// public vseg and (local != reference) 2032 /////////////////// => access ref GPT to update local GPT 2031 2033 else 2032 2034 { … … 2035 2037 2036 2038 // get current PPN and attributes from reference GPT 2039 // without locking the PTE (in case of false page fault) 2037 2040 hal_gpt_get_pte( ref_gpt_xp, 2038 2041 vpn, -
trunk/params-hard.mk
r629 r630 2 2 3 3 ARCH = /users/alain/soc/tsar-trunk-svn-2013/platforms/tsar_generic_iob 4 X_SIZE = 45 Y_SIZE = 44 X_SIZE = 2 5 Y_SIZE = 2 6 6 NB_PROCS = 1 7 7 NB_TTYS = 2 -
trunk/user/fft/fft.c
r629 r630 91 91 #define MODE COSIN // DATA array initialisation mode 92 92 #define CHECK 0 93 #define DEBUG_MAIN 1// trace main() function (detailed if odd)93 #define DEBUG_MAIN 0 // trace main() function (detailed if odd) 94 94 #define DEBUG_SLAVE 0 // trace slave() function (detailed if odd) 95 95 #define DEBUG_FFT1D 0 // trace FFT1D() function (detailed if odd) … … 404 404 } 405 405 406 407 // register sequencial initalisation completion cycle 406 printf("\n[fft] main completes threads creation\n"); 407 408 408 get_cycle( &end_init_cycle ); 409 410 // register sequencial time 409 411 init_time = (unsigned int)(end_init_cycle - start_init_cycle); 410 411 printf("\n[fft] main completes threads creation\n");412 412 413 413 // main itself executes the slave() function … … 510 510 unsigned int max_sync = sync_time[0]; 511 511 512 for (tid = 1; tid < nthreads ; tid++)512 for (tid = 0 ; tid < nthreads ; tid++) 513 513 { 514 514 if (parallel_time[tid] > max_para) max_para = parallel_time[tid]; … … 566 566 MainNum = args->main_tid; 567 567 568 // initialise instrumentation569 568 get_cycle( ¶llel_start ); 570 569 … … 578 577 pthread_barrier_wait( &barrier ); 579 578 get_cycle( &barrier_stop ); 580 sync_time[MyNum] += (barrier_stop - barrier_start); 581 582 // printf("\n[@@@] %s : thread %d exit first barrier / cycle %d\n", 583 // __FUNCTION__, MyNum, (unsigned int)barrier_stop ); 579 sync_time[MyNum] += (unsigned int)(barrier_stop - barrier_start); 580 581 #if DEBUG_SLAVE 582 printf("\n[@@@] %s : thread %d exit first barrier / cycle %d\n", 583 __FUNCTION__, MyNum, (unsigned int)barrier_stop ); 584 #endif 584 585 585 586 // allocate and initialise local array upriv[] … … 605 606 pthread_barrier_wait( &barrier ); 606 607 get_cycle( &barrier_stop ); 607 sync_time[MyNum] += ( long)(barrier_stop - barrier_start);608 sync_time[MyNum] += (unsigned int)(barrier_stop - barrier_start); 608 609 FFT1D( -1 , data , trans , upriv , twid , MyNum , MyFirst , MyLast ); 609 610 #endif 610 611 611 // register computation time612 612 get_cycle( ¶llel_stop ); 613 parallel_time[MyNum] = (parallel_stop - parallel_start); 613 614 // register parallel time 615 parallel_time[MyNum] = (unsigned int)(parallel_stop - parallel_start); 614 616 615 617 #if DEBUG_SLAVE 616 printf("\n[fft] %s : thread %x exit / cycle %d\n", __FUNCTION__, MyNum, parallel_stop ); 618 printf("\n[fft] %s : thread %x completes fft / p_start %d / p_stop %d\n", 619 __FUNCTION__, MyNum, (unsigned int)parallel_start, (unsigned int)parallel_stop ); 620 int tid; 621 for (tid = 0 ; tid < nthreads ; tid++) 622 { 623 printf("- tid %d : Sequencial %d / Parallel %d / Barrier %d\n", 624 tid , init_time, parallel_time[tid], sync_time[tid] ); 625 } 617 626 #endif 618 627 … … 867 876 pthread_barrier_wait( &barrier ); 868 877 get_cycle( &barrier_stop ); 869 sync_time[MyNum] = ( long)(barrier_stop - barrier_start);878 sync_time[MyNum] = (unsigned int)(barrier_stop - barrier_start); 870 879 871 880 #if( DEBUG_FFT1D & 1 ) … … 897 906 #endif 898 907 899 sync_time[MyNum] += ( long)(barrier_stop - barrier_start);908 sync_time[MyNum] += (unsigned int)(barrier_stop - barrier_start); 900 909 901 910 // transpose tmp to x … … 916 925 #endif 917 926 918 sync_time[MyNum] += ( long)(barrier_stop - barrier_start);927 sync_time[MyNum] += (unsigned int)(barrier_stop - barrier_start); 919 928 920 929 // do FFTs on rows of x and apply the scaling factor … … 938 947 printf("\n[fft] %s : thread %d exit barrier after FFT on rows\n", __FUNCTION__, MyNum); 939 948 #endif 940 sync_time[MyNum] += ( long)(barrier_stop - barrier_start);949 sync_time[MyNum] += (unsigned int)(barrier_stop - barrier_start); 941 950 942 951 // transpose x to tmp … … 957 966 #endif 958 967 959 sync_time[MyNum] += ( long)(barrier_stop - barrier_start);968 sync_time[MyNum] += (unsigned int)(barrier_stop - barrier_start); 960 969 sync_time[MyNum] += (long)(barrier_stop - barrier_start); 961 970 -
trunk/user/ksh/ksh.c
r629 r630 1179 1179 1180 1180 1181 / *1. first direct command1181 // 1. first direct command 1182 1182 if( sem_wait( &semaphore ) ) 1183 1183 { … … 1192 1192 strcpy( cmd , "load bin/user/fft.elf" ); 1193 1193 execute( cmd ); 1194 */1194 // 1195 1195 1196 1196
Note: See TracChangeset
for help on using the changeset viewer.