source: trunk/kernel/kern/cluster.h @ 385

Last change on this file since 385 was 279, checked in by alain, 7 years ago

1) Introduce independant command fields for the various devices in the thread descriptor.
2) Introduce a new dev_pic_enable_ipi() function in the generic PIC device
3) Fix two bugs identified by Maxime in the scheduler initialisation, and in the sched_select().
4) fix several bugs in the TSAR hal_kentry.S.
5) Introduce a third kgiet segment (besides kdata and kcode) in the TSAR bootloader.

File size: 14.8 KB
RevLine 
[1]1/*
2 * cluster.h - Cluster-Manager definition
[19]3 *
[1]4 * authors  Ghassan Almaless (2008,2009,2010,2011,2012)
5 *          Mohamed Lamine Karaoui (2015)
[23]6 *          Alain Greiner (2016,2017)
[1]7 *
8 * Copyright (c) UPMC Sorbonne Universites
9 *
10 * This file is part of ALMOS-MKH.
11 *
12 * ALMOS-MKH is free software; you can redistribute it and/or modify it
13 * under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; version 2.0 of the License.
15 *
16 * ALMOS-MKH is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with ALMOS-MKH; if not, write to the Free Software Foundation,
23 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
24 */
25
26#ifndef _CLUSTER_H_
27#define _CLUSTER_H_
28
[14]29#include <kernel_config.h>
[1]30#include <hal_types.h>
31#include <bits.h>
32#include <spinlock.h>
33#include <readlock.h>
34#include <remote_barrier.h>
35#include <list.h>
36#include <xlist.h>
37#include <dqdt.h>
38#include <kmem.h>
39#include <hal_atomic.h>
40#include <ppm.h>
41#include <kcm.h>
42#include <khm.h>
43#include <rpc.h>
44#include <core.h>
45#include <process.h>
46
47/**** Forward declarations  ****/
48
49struct core_s;
50struct process_s;
51
52
53/*******************************************************************************************
54 * This structure defines the process manager, that is part of the cluster manager.
55 * For any process P, the process descriptor is replicated in all clusters containing
[19]56 * at least one thread of process P, but only the "reference" cluster descriptor contains
[23]57 * the reference (complete) GPT, VSL, and FDT structures.
58 * The "owner" cluster K is in charge to allocate a lpid (local process index),
59 * to the owned processes, and to register the "reference" cluster for these processes.
[1]60 *
[19]61 * Warning : the "owner" cluster, and the "reference" cluster can be different clusters.
[1]62 *
63 * The process manager of a cluster K maintains three structures:
[23]64 * 1) The pref_tbl[] is an array indexed by lpid. There is one entry per owned process.
[1]65 *    Each entry contains an extended pointer on the reference process descriptor.
[23]66 *
[1]67 * 2) The local_root is the root of the local list of process descriptors in cluster K.
68 *    A process descriptor P is present in K, as soon as P has a thread in cluster K.
[23]69 *
70 * 3) The copies_root[] array is indexed by lpid. There is one entry per owned process,
71 *    and each each entry contains the root of the xlist of copies for this process.
[1]72 ******************************************************************************************/
73
74typedef struct process_manager_s
75{
76        xptr_t            pref_tbl[CONFIG_MAX_PROCESS_PER_CLUSTER];  /*! reference  process   */
77        spinlock_t        pref_lock;              /*! lock protecting lpid allocation/release */
78    uint32_t          pref_nr;                /*! number of processes owned by cluster    */
79
[23]80    xlist_entry_t     local_root;             /*! root of list of process in cluster      */
81    remote_spinlock_t local_lock;             /*! lock protecting access to local list    */
[1]82    uint32_t          local_nr;               /*! number of process in cluster            */
83
[19]84    xlist_entry_t     copies_root[CONFIG_MAX_PROCESS_PER_CLUSTER];  /*! roots of lists    */
[1]85    remote_spinlock_t copies_lock[CONFIG_MAX_PROCESS_PER_CLUSTER];  /*! one lock per list */
86    uint32_t          copies_nr[CONFIG_MAX_PROCESS_PER_CLUSTER];    /*! number of copies  */
87}
88pmgr_t;
89
90/*******************************************************************************************
91 * This structure defines a cluster manager.
[19]92 * It contains both global platform information, and cluster specific resources
[279]93 * controled by the local kernel instance.
[1]94 ******************************************************************************************/
95
96typedef struct cluster_s
97{
[23]98        spinlock_t        kcm_lock;        /*! local, protect creation of KCM allocators      */
[1]99
100    // global parameters
[23]101        uint32_t          paddr_width;     /*! numer of bits in physical address              */
102    uint32_t          x_width;         /*! number of bits to code x_size  (can be 0)      */
103    uint32_t          y_width;         /*! number of bits to code y_size  (can be 0)      */
104        uint32_t          x_size;          /*! number of clusters in a row    (can be 1)      */
105        uint32_t          y_size;          /*! number of clusters in a column (can be 1)      */
106        cxy_t             io_cxy;          /*! io cluster identifier                          */
107    uint32_t          dqdt_root_level; /*! index of root node in dqdt_tbl[]               */
[1]108
109    // local parameters
[23]110        uint32_t          cores_nr;        /*! number of cores in cluster                     */
111    uint32_t          cores_in_kernel; /*! number of cores currently in kernel mode       */
[1]112
[279]113    uint32_t          ram_size;        /*! physical memory size                           */
114    uint32_t          ram_base;        /*! physical memory base (local address)           */
115
[5]116        core_t            core_tbl[CONFIG_MAX_LOCAL_CORES];         /*! embedded cores        */
[1]117
[279]118        list_entry_t      dev_root;        /*! root of list of devices in cluster             */
119
120    // memory allocators
[23]121        ppm_t             ppm;             /*! embedded kernel page manager                   */
122        khm_t             khm;             /*! embedded kernel heap manager                   */
123        kcm_t             kcm;             /*! embedded kernel cache manager (for KCMs)       */
[1]124    kcm_t           * kcm_tbl[KMEM_TYPES_NR];         /*! pointers on allocated KCMs      */
125
[279]126    // RPC
127        rpc_fifo_t        rpc_fifo;        /*! RPC fifo                                       */
128    uint32_t          rpc_threads;     /*! current number of RPC threads                  */
[1]129
[279]130    // DQDT
[23]131    int32_t           pages_var;       /*! pages number increment from last DQQT update   */
132    int32_t           threads_var;     /*! threads number increment from last DQDT update */
[1]133
134        dqdt_node_t       dqdt_tbl[CONFIG_MAX_DQDT_DEPTH];     /*! embedded DQDT nodes        */
135
[279]136    // Local process manager
[23]137    pmgr_t            pmgr;            /*! embedded process manager                       */
[188]138
139    void            * pic_extend;      /*! PIC implementation specific extension          */
[19]140}
[1]141cluster_t;
142
143/******************************************************************************************
144 * This global variable is allocated in the kernel_init.c file.
[19]145 * There is one cluster_manager per cluster, with the same local address,
146 * but different content, in all clusters containing a kernel instance.
[1]147 *****************************************************************************************/
148
149extern cluster_t cluster_manager;
150
151/******************************************************************************************
152 * This macro returns a local pointer on the local cluster manager.
153 *****************************************************************************************/
154
155#define LOCAL_CLUSTER    (&cluster_manager)
156
157/******************************************************************************************
[19]158 * This generic function initialises the local cluster manager from information found
[1]159 * in the local boot-info structure. It initializes the following local resources:
160 * - the global platform parameters,
161 * - the specific cluster parameters,
162 * - the lock protecting KCM creation,
163 * - the local DQDT nodes,
164 * - the PPM, KHM, and KCM allocators,
165 * - the local core descriptors,
166 * - the local RPC FIFO,
167 * - the process manager.
168 * It does NOT initialise the local device descriptors.
169 ******************************************************************************************
170 * @ info : pointer on the local boot_info_t structure build by the bootloader.
171 *****************************************************************************************/
[19]172error_t cluster_init( boot_info_t * info );
[1]173
174/******************************************************************************************
[19]175 * This function checks the validity of a cluster identifier. TODO useful ??? [AG]
[1]176 ******************************************************************************************
177 * @ cxy    : cluster identifier to be checked.
178 * @ returns true if the identified cluster does not exist.
179 *****************************************************************************************/
180bool_t cluster_is_undefined( cxy_t cxy );
181
182/******************************************************************************************
183 * This function register sysfs information in cluster TODO ???  [AG]
184 *****************************************************************************************/
185void cluster_sysfs_register();
186
187
188/*****************************************************************************************/
189/***************   Process Management Operations   ***************************************/
190/*****************************************************************************************/
191
192/******************************************************************************************
193 * This function returns an extended pointer on the reference process descriptor
[101]194 * from the process PID. This PID can be be different from the calling process PID.
[23]195 * It can be called by any thread running in any cluster,
[1]196 ******************************************************************************************
197 * @ pid  : process identifier.
[23]198 * @ return extended pointer on reference process if success / return XPTR_NULL if error.
[1]199 *****************************************************************************************/
200xptr_t cluster_get_reference_process_from_pid( pid_t pid );
201
[19]202/******************************************************************************************
[1]203 * This function allocates a new PID in local cluster, that becomes the process owner.
[19]204 * It registers the process descriptor extended pointer in the local processs manager
[1]205 * pref_tbl[] array. This function is called by the rpc_process_alloc_pid() function for
206 * remote registration, or by the process_init_create() function for local registration.
207 ******************************************************************************************
208 * @ process    : [in]  extended pointer on the process descriptor.
209 * @ pid        : [out] allocated PID.
[19]210 * @ return 0 if success / return EAGAIN if no PID slot available
[1]211 *****************************************************************************************/
212error_t cluster_pid_alloc( xptr_t    process_xp,
213                           pid_t   * pid );
214
[19]215/******************************************************************************************
[1]216 * This function removes a PID from the local process manager pref_tbl[] array.
217 * It checks that removed process is owned by the local cluster and the lpid is legal.
218 * No memory is released by this function.
219 ******************************************************************************************
220 * @ pid        : allocated PID.
221 *****************************************************************************************/
222void cluster_pid_release( pid_t  pid );
223
224/******************************************************************************************
225 * This function returns a pointer on the local process descriptor from the PID.
226 * It uses the RPC
227 * to create a local process descriptor copy if it does not exist yet.
228 ******************************************************************************************
229 * @ pid     : searched process identifier.
230 * @ returns process descriptor pointer if found / returns NULL if not found.
231 *****************************************************************************************/
232struct process_s * cluster_get_local_process_from_pid( pid_t pid );
233
234/******************************************************************************************
235 * This function registers a local process descriptor in the process manager local_list.
236 ******************************************************************************************
237 * @ process     : pointer on local process descriptor.
238 *****************************************************************************************/
[19]239void cluster_process_local_link( struct process_s * process );
[1]240
241/******************************************************************************************
242 * This function removes a local process descriptor from the process manager local_list.
243 ******************************************************************************************
244 * @ process     : pointer on local process descriptor.
245 *****************************************************************************************/
[19]246void cluster_process_local_unlink( struct process_s * process );
[1]247
248/******************************************************************************************
249 * This function registers a local process descriptor in the owner process manager
250 * copies_list, that can be in a remote cluster.
251 ******************************************************************************************
252 * @ process     : pointer on local process descriptor.
253 *****************************************************************************************/
[19]254void cluster_process_copies_link( struct process_s * process );
[1]255
256/******************************************************************************************
257 * This function removes a local process descriptor from the owner process manager
258 * copies_list, that can be in a remote cluster.
259 ******************************************************************************************
260 * @ process     : pointer on local process descriptor.
261 *****************************************************************************************/
[19]262void cluster_process_copies_unlink( struct process_s * process );
[1]263
264
265
266/*****************************************************************************************/
267/***************   Cores Management Operations   *****************************************/
268/*****************************************************************************************/
269
270/******************************************************************************************
271 * This function increments the "cores_in_kernel" variable in cluster descriptor.
272 *****************************************************************************************/
273void cluster_core_kernel_enter();
274
275/******************************************************************************************
276 * This function decrements the "cores_in_kernel" variable in cluster descriptor.
277 *****************************************************************************************/
278void cluster_core_kernel_exit();
279
280/******************************************************************************************
281 * This function returns the core local index that has the lowest usage in local cluster.
282 *****************************************************************************************/
283lid_t cluster_select_local_core();
284
285#endif  /* _CLUSTER_H_ */
Note: See TracBrowser for help on using the repository browser.