Changeset 637 for trunk/kernel/kern
- Timestamp:
- Jul 18, 2019, 2:06:55 PM (5 years ago)
- Location:
- trunk/kernel/kern
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/kern/cluster.c
r635 r637 76 76 77 77 // initialize the cluster_info[][] array 78 for (x = 0; x < CONFIG_MAX_CLUSTERS_X; x++)79 { 80 for (y = 0; y < CONFIG_MAX_CLUSTERS_Y;y++)78 for( x = 0 ; x < CONFIG_MAX_CLUSTERS_X ; x++ ) 79 { 80 for( y = 0; y < CONFIG_MAX_CLUSTERS_Y ; y++ ) 81 81 { 82 82 cluster->cluster_info[x][y] = info->cluster_info[x][y]; … … 95 95 } 96 96 97 // initialize number of cores97 // initialize number of local cores 98 98 cluster->cores_nr = info->cores_nr; 99 99 100 100 } // end cluster_info_init() 101 102 ////////////////////////////////////// 103 void cluster_info_display( cxy_t cxy ) 104 { 105 uint32_t x; 106 uint32_t y; 107 uint32_t ncores; 108 109 cluster_t * cluster = LOCAL_CLUSTER; 110 111 // get x_size & y_size from target cluster 112 uint32_t x_size = hal_remote_l32( XPTR( cxy , &cluster->x_size ) ); 113 uint32_t y_size = hal_remote_l32( XPTR( cxy , &cluster->y_size ) ); 114 115 // get pointers on TXT0 chdev 116 xptr_t txt0_xp = chdev_dir.txt_tx[0]; 117 cxy_t txt0_cxy = GET_CXY( txt0_xp ); 118 chdev_t * txt0_ptr = GET_PTR( txt0_xp ); 119 120 // get extended pointer on remote TXT0 lock 121 xptr_t lock_xp = XPTR( txt0_cxy , &txt0_ptr->wait_lock ); 122 123 // get TXT0 lock 124 remote_busylock_acquire( lock_xp ); 125 126 nolock_printk("\n***** cluster_info in cluster %x / x_size %d / y_size %d\n", 127 cxy, x_size, y_size ); 128 129 for( x = 0 ; x < x_size ; x++ ) 130 { 131 for( y = 0 ; y < y_size ; y++ ) 132 { 133 ncores = (uint32_t)hal_remote_lb( XPTR( cxy , &cluster->cluster_info[x][y] ) ); 134 nolock_printk(" - ncores[%d][%d] = %d\n", x, y, ncores ); 135 } 136 } 137 138 // release TXT0 lock 139 remote_busylock_release( lock_xp ); 140 141 } // end cluster_info_display() 101 142 102 143 ///////////////////////////////////////////////////////// … … 115 156 printk("\n[%s] thread[%x,%x] enters for cluster %x / cycle %d\n", 116 157 __FUNCTION__, this->process->pid, this->trdid, local_cxy , cycle ); 158 #endif 159 160 #if (DEBUG_CLUSTER_INIT & 1) 161 cluster_info_display( local_cxy ); 117 162 #endif 118 163 … … 243 288 } 244 289 245 //////////////////////////////////////// 246 bool_t cluster_is_undefined( cxy_t cxy ) 247 { 248 uint32_t x_size = LOCAL_CLUSTER->x_size; 249 uint32_t y_size = LOCAL_CLUSTER->y_size; 250 251 uint32_t x = HAL_X_FROM_CXY( cxy ); 252 uint32_t y = HAL_Y_FROM_CXY( cxy ); 253 254 if( x >= x_size ) return true; 255 if( y >= y_size ) return true; 256 257 return false; 258 } 259 260 ////////////////////////////////////// 261 bool_t cluster_is_active ( cxy_t cxy ) 290 ///////////////////////////////////////////// 291 inline bool_t cluster_is_active ( cxy_t cxy ) 262 292 { 263 293 uint32_t x = HAL_X_FROM_CXY( cxy ); … … 271 301 //////////////////////////////////////////////////////////////////////////////////// 272 302 273 /////////////////////////////////////// 274 lid_t cluster_select_local_core( void)275 { 276 uint32_t min = 1000 ;303 ///////////////////////////////////////////// 304 lid_t cluster_select_local_core( cxy_t cxy ) 305 { 306 uint32_t min = 1000000; 277 307 lid_t sel = 0; 278 308 uint32_t nthreads; 279 309 lid_t lid; 280 310 scheduler_t * sched; 281 282 cluster_t * cluster = LOCAL_CLUSTER; 283 284 for( lid = 0 ; lid < cluster->cores_nr ; lid++ ) 285 { 286 sched = &cluster->core_tbl[lid].scheduler; 287 nthreads = sched->u_threads_nr + sched->k_threads_nr; 311 cluster_t * cluster = LOCAL_CLUSTER; 312 uint32_t ncores = hal_remote_l32( XPTR( cxy , &cluster->cores_nr ) ); 313 314 for( lid = 0 ; lid < ncores ; lid++ ) 315 { 316 sched = &cluster->core_tbl[lid].scheduler; 317 318 nthreads = hal_remote_l32( XPTR( cxy , &sched->u_threads_nr ) ) + 319 hal_remote_l32( XPTR( cxy , &sched->k_threads_nr ) ); 288 320 289 321 if( nthreads < min ) … … 700 732 uint32_t pref_nr; // number of owned processes in cluster cxy 701 733 702 assert( (cluster_is_ undefined( cxy ) == false), "illegal cluster index" );734 assert( (cluster_is_active( cxy ) ), "illegal cluster index" ); 703 735 704 736 // get extended pointer on root and lock for local process list in cluster -
trunk/kernel/kern/cluster.h
r635 r637 4 4 * authors Ghassan Almaless (2008,2009,2010,2011,2012) 5 5 * Mohamed Lamine Karaoui (2015) 6 * Alain Greiner (2016,2017,2018 )6 * Alain Greiner (2016,2017,2018,2019) 7 7 * 8 8 * Copyright (c) UPMC Sorbonne Universites … … 112 112 uint32_t nb_fbf_channels; /*! number of FBF channels */ 113 113 114 char cluster_info[CONFIG_MAX_CLUSTERS_X][CONFIG_MAX_CLUSTERS_Y]; 114 // number of cores for each cluster in the mesh 115 uint8_t cluster_info[CONFIG_MAX_CLUSTERS_X][CONFIG_MAX_CLUSTERS_Y]; 115 116 116 117 // local parameters … … 162 163 * in the local boot-info structure <info> build by the boot-loader. 163 164 * 1) the cluster_info_init() function is called first, to initialize the structural 164 * constants, and cannot use the TXT0 kernel terminal. 165 * 2) the cluster_manager_init() function initialize various complex structures: 165 * constants, including the cluster_info[x][y] array. 166 * It cannot use the TXT0 kernel terminal. 167 * 2) the cluster_manager_init() function initializes various complex structures: 166 168 * - the local DQDT nodes, 167 169 * - the PPM, KHM, and KCM allocators, … … 169 171 * - the local RPC FIFO, 170 172 * - the process manager. 171 * It does NOT initialise the local device descriptors.172 173 * It can use the TXT0 kernel terminal. 173 174 ****************************************************************************************** … … 178 179 179 180 /****************************************************************************************** 180 * This function checks the validity of a cluster identifier. 181 ****************************************************************************************** 182 * @ cxy : cluster identifier to be checked. 183 * @ returns true if the identified cluster does not exist. 184 *****************************************************************************************/ 185 bool_t cluster_is_undefined( cxy_t cxy ); 186 187 /****************************************************************************************** 188 * This function uses the local cluster_info[][] array in cluster descriptor, 189 * and returns true when the cluster identified by the <cxy> argument is active. 190 ****************************************************************************************** 191 * @ cxy : cluster identifier. 181 * This debug function displays the current values stored in the cluster_info[][] array 182 * of a remote cluster identified by the <cxy> argument. 183 * It can be called by a thread running in any cluster. 184 ****************************************************************************************** 185 * @ cxy : remote cluster identifier. 186 *****************************************************************************************/ 187 void cluster_info_display( cxy_t cxy ); 188 189 /****************************************************************************************** 190 * This function access the local cluster_info[][] array and returns true when the 191 * cluster identified by the <cxy> argument is active (contains a kernel instance). 192 ****************************************************************************************** 193 * @ cxy : checked cluster identifier. 192 194 * @ return true if cluster contains a kernel instance. 193 195 *****************************************************************************************/ … … 300 302 * This function displays on the kernel terminal TXT0 all user processes registered 301 303 * in the cluster defined by the <cxy> argument. 302 * It can be called by a thread running in any cluster, because is use remote accesses 303 * to scan the xlist of registered processes. 304 * It can be called by a thread running in any cluster. 304 305 ****************************************************************************************** 305 306 * @ cxy : cluster identifier. … … 310 311 311 312 /****************************************************************************************** 312 * This function uses the local boot_inforeturns the core local index that has the lowest usage in local cluster. 313 *****************************************************************************************/ 314 lid_t cluster_select_local_core( void ); 313 * This function selects the core that has the lowest usage in a - possibly remote - 314 * cluster identified by the <cxy> argument. 315 * It can be called by a thread running in any cluster. 316 ****************************************************************************************** 317 * @ cxy : target cluster identifier. 318 * @ return the selected core local index. 319 *****************************************************************************************/ 320 lid_t cluster_select_local_core( cxy_t cxy ); 315 321 316 322 -
trunk/kernel/kern/do_syscall.c
r626 r637 95 95 96 96 sys_get_config, // 40 97 sys_get_core ,// 4197 sys_get_core_id, // 41 98 98 sys_get_cycle, // 42 99 99 sys_display, // 43 … … 108 108 sys_sync, // 51 109 109 sys_fsync, // 52 110 sys_get_best_core, // 53 111 sys_get_nb_cores, // 54 110 112 }; 111 113 … … 160 162 161 163 case SYS_GET_CONFIG: return "GET_CONFIG"; // 40 162 case SYS_GET_CORE : return "GET_CORE";// 41164 case SYS_GET_CORE_ID: return "GET_CORE_ID"; // 41 163 165 case SYS_GET_CYCLE: return "GET_CYCLE"; // 42 164 166 case SYS_DISPLAY: return "DISPLAY"; // 43 … … 172 174 case SYS_EXIT: return "EXIT"; // 50 173 175 case SYS_SYNC: return "SYNC"; // 51 174 case SYS_FSYNC: return "FSYNc"; // 52 176 case SYS_FSYNC: return "FSYNC"; // 52 177 case SYS_GET_BEST_CORE: return "GET_BEST_CORE"; // 53 178 case SYS_GET_NB_CORES: return "GET_NB_CORES"; // 54 175 179 176 180 default: return "undefined"; -
trunk/kernel/kern/dqdt.c
r632 r637 2 2 * dqdt.c - Distributed Quaternary Decision Tree implementation. 3 3 * 4 * Author : Alain Greiner (2016,2017,2018 )4 * Author : Alain Greiner (2016,2017,2018,2019) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 55 55 56 56 // display node content 57 nolock_printk("- level %d / cluster %x : threads = %x / pages = %x / clusters %d / cores %d\n", 58 node.level, GET_CXY( node_xp ), node.threads, node.pages, node.clusters, node.cores ); 57 nolock_printk("- [%d,%x] : threads %x / pages %x / clusters %d / cores %d / parent_cxy %x\n", 58 node.level, GET_CXY( node_xp ), 59 node.threads, node.pages, 60 node.clusters, node.cores, 61 GET_CXY( node.parent ) ); 59 62 60 63 // recursive call on children if node is not terminal … … 116 119 xptr_t parent_xp ) 117 120 { 118 assert( (level < 5) , __FUNCTION__, "illegal DQDT level %d\n", level );121 assert( (level <= 5) , __FUNCTION__, "illegal DQDT level %d\n", level ); 119 122 120 123 uint32_t node_x; // node X coordinate … … 147 150 148 151 #if DEBUG_DQDT_INIT 149 printk("\n[ DBG] %s: cxy(%d,%d) / level %d / mask %x / half %d / ptr %x\n",152 printk("\n[%s] thread[%x,%x] : cxy(%d,%d) / level %d / mask %x / half %d / ptr %x\n", 150 153 __FUNCTION__, node_x, node_y, level, mask, half, node_ptr ); 151 154 #endif … … 336 339 void dqdt_init( void ) 337 340 { 338 // get x_size & y_size from cluster manager339 cluster_t * cluster = &cluster_manager;341 // get x_size & y_size 342 cluster_t * cluster = LOCAL_CLUSTER; 340 343 uint32_t x_size = cluster->x_size; 341 344 uint32_t y_size = cluster->y_size; … … 349 352 uint32_t level_max = bits_log2( size_ext ); 350 353 351 // each CP0register the DQDT root in local cluster manager354 // all CP0s register the DQDT root in local cluster manager 352 355 cluster->dqdt_root_xp = XPTR( 0 , &cluster->dqdt_tbl[level_max] ); 353 356 357 // only CP0 in cluster 0 build the DQDT 358 if( local_cxy == 0 ) 359 { 360 354 361 #if DEBUG_DQDT_INIT 355 if( local_cxy == 0 ) 356 printk("\n[ DBG] %s : x_size = %d / y_size = %d / level_max = %d\n",357 __FUNCTION__, x_size, y_size, level_max );362 thread_t * this = CURRENT_THREAD; 363 printk("\n[%s] thread[%x,%x] enters : x_size = %d / y_size = %d / level_max = %d\n", 364 __FUNCTION__, this->process->pid, this->trdid, x_size, y_size, level_max ); 358 365 #endif 359 366 … … 362 369 363 370 #if DEBUG_DQDT_INIT 364 if( local_cxy == 0 ) dqdt_display(); 365 #endif 366 371 dqdt_display(); 372 #endif 373 374 } 367 375 } // end dqdt_init() 368 376 … … 516 524 } 517 525 526 /////////////////////////////////// 527 xptr_t dqdt_get_root( cxy_t cxy, 528 uint32_t level ) 529 { 530 xptr_t node_xp; 531 cxy_t node_cxy; 532 dqdt_node_t * node_ptr; 533 uint32_t current_level; 534 535 assert( (level <= 5) , __FUNCTION__, "illegal DQDT level %d\n", level ); 536 537 #if DEBUG_DQDT_GET_ROOT 538 thread_t * this = CURRENT_THREAD; 539 printk("\n[%s] thread[%x,%x] enters / cxy %x / level %d\n", 540 __FUNCTION__, this->process->pid, this->trdid, cxy, level ); 541 #endif 542 543 // check macro-cluster 544 if( cluster_is_active( cxy ) ) 545 { 546 // initialise node_xp and current_level 547 node_xp = XPTR( cxy , &LOCAL_CLUSTER->dqdt_tbl[0] ); 548 current_level = 0; 549 550 // traverse the quad-tree from bottom to root 551 while( current_level < level ) 552 { 553 node_cxy = GET_CXY( node_xp ); 554 node_ptr = GET_PTR( node_xp ); 555 556 node_xp = hal_remote_l64( XPTR( node_cxy , &node_ptr->parent ) ); 557 current_level++; 558 } 559 } 560 else 561 { 562 node_xp = XPTR_NULL; 563 } 564 565 #if DEBUG_DQDT_GET_ROOT 566 printk("\n[%s] thread[%x,%x] exit / root_xp[%x,%x]\n", 567 __FUNCTION__, this->process->pid, this->trdid, GET_CXY( node_xp ), GET_PTR( node_xp ) ); 568 #endif 569 570 return node_xp; 571 572 } 518 573 519 574 ///////////////////////////////////////////////////////////////////////////////////// … … 584 639 585 640 586 ////////////////////////////////////////// 587 cxy_t dqdt_get_cluster_for_ process( void)641 /////////////////////////////////////////////////// 642 cxy_t dqdt_get_cluster_for_thread( xptr_t root_xp ) 588 643 { 589 644 // call recursive function 590 cxy_t cxy = dqdt_select_cluster( LOCAL_CLUSTER->dqdt_root_xp , false );591 592 #if DEBUG_DQDT_SELECT_FOR_ PROCESS645 cxy_t cxy = dqdt_select_cluster( root_xp , false ); 646 647 #if DEBUG_DQDT_SELECT_FOR_THREAD 593 648 uint32_t cycle = hal_get_cycles(); 594 649 if( cycle > DEBUG_DQDT_SELECT_FOR_PROCESS ) … … 600 655 } 601 656 602 ///////////////////////////////////////// 603 cxy_t dqdt_get_cluster_for_memory( void)657 /////////////////////////////////////////////////// 658 cxy_t dqdt_get_cluster_for_memory( xptr_t root_xp ) 604 659 { 605 660 // call recursive function 606 cxy_t cxy = dqdt_select_cluster( LOCAL_CLUSTER->dqdt_root_xp , true );661 cxy_t cxy = dqdt_select_cluster( root_xp , true ); 607 662 608 663 #if DEBUG_DQDT_SELECT_FOR_MEMORY -
trunk/kernel/kern/dqdt.h
r632 r637 2 2 * kern/dqdt.h - Distributed Quad Decision Tree 3 3 * 4 * Author : Alain Greiner (2016,2017,2018 )4 * Author : Alain Greiner (2016,2017,2018,2019) 5 5 * 6 6 * Copyright (c) UPMC Sorbonne Universites … … 31 31 /**************************************************************************************** 32 32 * This DQDT infrastructure maintains a topological description of ressources usage 33 * in each cluster: number of threads , and number of physical pages allocated.33 * in each cluster: number of threads per core, and number of physical pages allocated. 34 34 * 35 * - If X_SIZE or Y_SIZE are equal to 1, it makes the assumption that the cluster 36 * topology is a one dimensionnal vector, an build the smallest one-dimensionnal 37 * quad-tree covering this one-dimensionnal vector. If the number of clusters 38 * is not a power of 4, the tree is truncated as required. 39 * 40 * TODO : the mapping for the one dimensionnal topology is not implemented yet [AG]. 41 * 42 * - If both Y_SIZE and Y_SIZE are larger than 1, it makes the assumption that 43 * the clusters topology is a 2D mesh. The [X,Y] coordinates of a cluster are 44 * obtained from the CXY identifier using the Rrelevant macros. 45 * X = CXY >> Y_WIDTH / Y = CXY & ((1<<Y_WIDTH)-1) 46 * - If the mesh X_SIZE and Y_SIZE dimensions are not equal, or are not power of 2, 47 * or the mesh contains "holes" reported in the cluster_info[x][y] array, 48 * we build the smallest two dimensionnal quad-tree covering all clusters, 49 * and this tree is truncated as required. 50 * - The mesh size is supposed to contain at most 32 * 32 clusters. 51 * Therefore, it can exist at most 6 DQDT nodes in a given cluster: 52 * . Level 0 nodes exist on all clusters and have no children. 53 * . Level 1 nodes exist when both X and Y coordinates are multiple of 2 54 * . Level 2 nodes exist when both X and Y coordinates are multiple of 4 55 * . Level 3 nodes exist when both X and Y coordinates are multiple of 8 56 * . Level 4 nodes exist when both X and Y coordinates are multiple of 16 57 * . Level 5 nodes exist when both X and Y coordinates are multiple of 32 58 * - For nodes other than level 0, the placement is defined as follow: 59 * . The root node is placed in the cluster containing the core executing 60 * the dqdt_init() function. 61 * . An intermediate node (representing a given sub-tree) is placed in one 62 * cluster covered by the subtree, pseudo-randomly selected. 35 * It is organized as a quad-tree, where the leaf cells are the clusters, organised 36 * as a 2D mesh. Each node in the quad-tree (including the root and the leaf cells, 37 * covers a "macro-cluster", that is a square array of clusters where the number 38 * in the macro-cluster is a power of 4, and the macro-cluster side is a power of two. 39 * Each node contains informations on ressources usage (physical memory and cores) 40 * in the covered macro-cluster. 41 * This quad-tree can be truncated, if the physical mesh X_SIZE and Y_SIZE dimensions 42 * are not equal, or are not power of 2, or if the physical mesh contains "holes". 43 * The mesh size is supposed to contain at most 32*32 clusters in this implementation. 44 * . Level 0 nodes exist in all clusters and have no children. 45 * . Level 1 nodes can be placed in any cluster of the covered 2*2 macro-cluster. 46 * . Level 2 nodes can be placed in any cluster of the covered 4*4 macro-cluster. 47 * . Level 3 nodes can be placed in any cluster of the covered 8*8 macro-cluster. 48 * . Level 4 nodes can be placed in any cluster of the covered 16*16 macro-cluster. 49 * . Level 5 nodes can be placed in any cluster of the covered 32*32 macro-cluster. 50 * The root node is placed in the cluster containing the core executing the dqdt_init() 51 * function. Other (non level 0) nodes are placed pseudo-randomly. 63 52 ***************************************************************************************/ 64 53 … … 66 55 * This structure describes a node of the DQDT. 67 56 * The max number of children is 4, but it can be smaller for some nodes. 68 * Level 0 nodes are the clusters, and have no children. 69 * The root node has no parent. 57 * Level 0 nodes have no children. The root node has no parent. 70 58 ***************************************************************************************/ 71 59 … … 74 62 uint32_t level; /*! node level */ 75 63 uint32_t arity; /*! actual children number in this node */ 76 uint32_t threads; /*! current number of threads in macro-cluster*/77 uint32_t pages; /*! current number of pages in macro-cluster*/64 uint32_t threads; /*! number of threads in macro-cluster */ 65 uint32_t pages; /*! number of allocated pages in macro-cluster */ 78 66 uint32_t cores; /*! number of active cores in macro cluster */ 79 uint32_t clusters; /*! number of active cluster in macro cluster*/67 uint32_t clusters; /*! number of active clusters in macro cluster */ 80 68 xptr_t parent; /*! extended pointer on parent node */ 81 69 xptr_t children[2][2]; /*! extended pointers on children nodes */ … … 87 75 * This function recursively initializes the DQDT structure from informations 88 76 * stored in cluster manager (x_size, y_size and cluster_info[x][y]. 89 * It is executed in all clusters by the local CP0, to compute level_max and register77 * It is called in all clusters by the local CP0, to compute level_max and register 90 78 * the DQDT root node in each cluster manager, but only CPO in cluster 0 build actually 91 79 * the quad-tree covering all active clusters. … … 102 90 ***************************************************************************************/ 103 91 void dqdt_increment_threads( void ); 92 104 93 void dqdt_decrement_threads( void ); 105 94 … … 121 110 122 111 /**************************************************************************************** 123 * This function can be called in any cluster. It traverses the DQDT tree 124 * from the root to the bottom, to analyse the computing load and select the cluster 125 * with the lowest number ot threads to place a new process. 112 * This function returns an extended pointer on the dqdt node that is the root of 113 * the sub-tree covering the macro-cluster defined by the <level> argument and 114 * containing the cluster defined by the <cxy> argument. It returns XPTR_NULL if 115 * this macro-cluster is undefined (when the cxy cluster contains no core). 126 116 **************************************************************************************** 117 * @ cxy : cluster identifier. 118 * @ level : level of the sub-tree. 119 * @ returns root_xp if success / return XPTR_NULL if no active core in macro_cluster. 120 ***************************************************************************************/ 121 xptr_t dqdt_get_root( cxy_t cxy, 122 uint32_t level ); 123 124 /**************************************************************************************** 125 * This function can be called in any cluster. It traverses the DQDT tree from the 126 * local root of a macro-cluster, defined by the <root_xp> argument, to the bottom. 127 * It analyses the computing load & select the cluster containing the lowest number 128 * ot threads. 129 **************************************************************************************** 130 * @ root_xp : extended pointer on DQDT node root. 127 131 * @ returns the cluster identifier with the lowest computing load. 128 132 ***************************************************************************************/ 129 cxy_t dqdt_get_cluster_for_ process( void);133 cxy_t dqdt_get_cluster_for_thread( xptr_t root_xp ); 130 134 131 135 /**************************************************************************************** 132 * This function can be called in any cluster. It traverses the DQDT tree 133 * from the root to the bottom, to analyse the memory load and select the cluster 134 * with the lowest memory load for dynamic memory allocation with no locality constraint. 136 * This function can be called in any cluster. It traverses the DQDT tree from the 137 * local root of a macro-cluster, defined by the <root_xp> argument, to the bottom. 138 * It analyses the memory load & select the cluster with the lowest number of allocated 139 * physical pages. 135 140 **************************************************************************************** 141 * @ root_xp : extended pointer on DQDT node root. 136 142 * @ returns the cluster identifier with the lowest memory load. 137 143 ***************************************************************************************/ 138 cxy_t dqdt_get_cluster_for_memory( void);144 cxy_t dqdt_get_cluster_for_memory( xptr_t root_xp ); 139 145 140 146 /**************************************************************************************** 141 147 * This function displays on kernel TXT0 the DQDT state for all nodes in the quad-tree. 142 * It traverses the quadtree from root to bottom, and can be called by a thread143 * running in any cluster148 * It traverses the quadtree from the global root to bottom. 149 * It can be called by a thread running in any cluster 144 150 ***************************************************************************************/ 145 151 void dqdt_display( void ); -
trunk/kernel/kern/kernel_init.c
r635 r637 1008 1008 1009 1009 ///////////////////////////////////////////////////////////////////////////////// 1010 // STEP 2 : core[0] initializes the clu ter manager,1011 // including the physical memory allocator .1010 // STEP 2 : core[0] initializes the cluster manager, 1011 // including the physical memory allocators. 1012 1012 ///////////////////////////////////////////////////////////////////////////////// 1013 1013 … … 1102 1102 1103 1103 //////////////////////////////////////////////////////////////////////////////// 1104 // STEP 5 : core[0] initialize sthe distibuted LAPIC descriptor.1105 // core[0] initialize sthe internal chdev descriptors1104 // STEP 5 : core[0] initialize the distibuted LAPIC descriptor. 1105 // core[0] initialize the internal chdev descriptors 1106 1106 // core[0] initialize the local external chdev descriptors 1107 1107 //////////////////////////////////////////////////////////////////////////////// -
trunk/kernel/kern/process.c
r635 r637 1909 1909 1910 1910 // select a core in local cluster to execute the main thread 1911 lid = cluster_select_local_core( );1911 lid = cluster_select_local_core( local_cxy ); 1912 1912 1913 1913 // initialize pthread attributes for main thread -
trunk/kernel/kern/rpc.c
r635 r637 1053 1053 1054 1054 // select one core 1055 core_lid = cluster_select_local_core( );1055 core_lid = cluster_select_local_core( local_cxy ); 1056 1056 1057 1057 // call local kernel function -
trunk/kernel/kern/scheduler.h
r564 r637 41 41 { 42 42 busylock_t lock; /*! lock protecting scheduler state */ 43 uint 16_t u_threads_nr; /*! total number of attached user threads */44 uint 16_t k_threads_nr; /*! total number of attached kernel threads */43 uint32_t u_threads_nr; /*! total number of attached user threads */ 44 uint32_t k_threads_nr; /*! total number of attached kernel threads */ 45 45 list_entry_t u_root; /*! root of list of user threads */ 46 46 list_entry_t k_root; /*! root of list of kernel threads */ -
trunk/kernel/kern/thread.c
r635 r637 247 247 else 248 248 { 249 core_lid = cluster_select_local_core( );249 core_lid = cluster_select_local_core( local_cxy ); 250 250 } 251 251 … … 375 375 printk("\n[%s] CPU & FPU contexts created\n", 376 376 __FUNCTION__, thread->trdid ); 377 hal_vmm_display( process, true );377 hal_vmm_display( XPTR( local_cxy , process ) , true ); 378 378 #endif 379 379 … … 418 418 419 419 // select a target core in local cluster 420 core_lid = cluster_select_local_core( );420 core_lid = cluster_select_local_core( local_cxy ); 421 421 422 422 #if (DEBUG_THREAD_USER_FORK & 1) … … 724 724 printk("\n[%s] thread[%x,%x] set CPU context & jump to user code / cycle %d\n", 725 725 __FUNCTION__, process->pid, thread->trdid, cycle ); 726 hal_vmm_display( process, true );726 hal_vmm_display( XPTR( local_cxy , process ) , true ); 727 727 #endif 728 728 … … 1332 1332 // check trdid argument 1333 1333 if( (target_thread_ltid >= CONFIG_THREADS_MAX_PER_CLUSTER) || 1334 cluster_is_ undefined( target_cxy ) )return XPTR_NULL;1334 cluster_is_active( target_cxy ) == false ) return XPTR_NULL; 1335 1335 1336 1336 // get root of list of process descriptors in target cluster
Note: See TracChangeset
for help on using the changeset viewer.