1 /* 2 * Copyright (C) by Argonne National Laboratory 3 * See COPYRIGHT in top-level directory 4 */ 5 6 #ifndef MPIDU_GENQI_SHMEM_TYPES_H_INCLUDED 7 #define MPIDU_GENQI_SHMEM_TYPES_H_INCLUDED 8 9 #include "mpl.h" 10 #include "mpidu_init_shm.h" 11 12 typedef void *MPIDU_genq_shmem_pool_t; 13 typedef void *MPIDU_genq_shmem_queue_t; 14 15 typedef struct MPIDU_genqi_shmem_cell_header { 16 uintptr_t handle; 17 int block_idx; 18 union { 19 struct { 20 uintptr_t next; 21 } serial_queue; 22 struct { 23 uintptr_t prev; /* used in the tail queue */ 24 uintptr_t next; /* used in the detached header queue */ 25 } inverse_queue; 26 struct { 27 MPL_atomic_ptr_t next_m; 28 } nem_queue; 29 } u; 30 } MPIDU_genqi_shmem_cell_header_s; 31 32 typedef union MPIDU_genq_shmem_queue { 33 struct { 34 union { 35 uintptr_t s; 36 MPL_atomic_ptr_t m; 37 uint8_t pad[MPIDU_SHM_CACHE_LINE_LEN]; 38 } head; 39 union { 40 uintptr_t s; 41 MPL_atomic_ptr_t m; 42 uint8_t pad[MPIDU_SHM_CACHE_LINE_LEN]; 43 } tail; 44 unsigned flags; 45 } q; 46 uint8_t pad[3 * MPIDU_SHM_CACHE_LINE_LEN]; 47 } MPIDU_genq_shmem_queue_u; 48 49 typedef struct MPIDU_genqi_shmem_pool { 50 uintptr_t cell_size; 51 uintptr_t cell_alloc_size; 52 uintptr_t cells_per_proc; 53 uintptr_t num_proc; 54 int rank; 55 56 void *slab; 57 MPIDU_genqi_shmem_cell_header_s *cell_header_base; 58 MPIDU_genqi_shmem_cell_header_s **cell_headers; 59 union MPIDU_genq_shmem_queue *free_queues; 60 } MPIDU_genqi_shmem_pool_s; 61 62 #define HEADER_TO_CELL(header) \ 63 ((char *) (header) + sizeof(MPIDU_genqi_shmem_cell_header_s)) 64 65 #define CELL_TO_HEADER(cell) \ 66 ((MPIDU_genqi_shmem_cell_header_s *) ((char *) (cell) \ 67 - sizeof(MPIDU_genqi_shmem_cell_header_s))) 68 69 /* The handle value is calculated using (address_offset + 1), see MPIDU_genq_shmem_pool.h */ 70 #define HANDLE_TO_HEADER(pool, handle) \ 71 ((MPIDU_genqi_shmem_cell_header_s *) ((char *) (pool)->cell_header_base + (uintptr_t) (handle) \ 72 - 1)) 73 74 /* declare static inline prototypes to avoid circular inclusion */ 75 76 int MPIDU_genq_shmem_queue_init(MPIDU_genq_shmem_queue_t queue, int flags); 77 static inline int MPIDU_genq_shmem_queue_dequeue(MPIDU_genq_shmem_pool_t pool, 78 MPIDU_genq_shmem_queue_t queue, void **cell); 79 static inline int MPIDU_genq_shmem_queue_enqueue(MPIDU_genq_shmem_pool_t pool, 80 MPIDU_genq_shmem_queue_t queue, void *cell); 81 82 #endif /* ifndef MPIDU_GENQI_SHMEM_TYPES_H_INCLUDED */ 83