/** * Copyright (C) Mellanox Technologies Ltd. 2001-2014. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef UCT_MD_H_ #define UCT_MD_H_ #include "uct_component.h" #include #include #include typedef struct uct_md_rcache_config { size_t alignment; /**< Force address alignment */ unsigned event_prio; /**< Memory events priority */ double overhead; /**< Lookup overhead estimation */ } uct_md_rcache_config_t; extern ucs_config_field_t uct_md_config_rcache_table[]; /** * "Base" structure which defines MD configuration options. * Specific MDs extend this structure. */ struct uct_md_config { /* C standard prohibits empty structures */ char __dummy; }; typedef void (*uct_md_close_func_t)(uct_md_h md); typedef ucs_status_t (*uct_md_query_func_t)(uct_md_h md, uct_md_attr_t *md_attr); typedef ucs_status_t (*uct_md_mem_alloc_func_t)(uct_md_h md, size_t *length_p, void **address_p, unsigned flags, const char *alloc_name, uct_mem_h *memh_p); typedef ucs_status_t (*uct_md_mem_free_func_t)(uct_md_h md, uct_mem_h memh); typedef ucs_status_t (*uct_md_mem_advise_func_t)(uct_md_h md, uct_mem_h memh, void *addr, size_t length, unsigned advice); typedef ucs_status_t (*uct_md_mem_reg_func_t)(uct_md_h md, void *address, size_t length, unsigned flags, uct_mem_h *memh_p); typedef ucs_status_t (*uct_md_mem_dereg_func_t)(uct_md_h md, uct_mem_h memh); typedef ucs_status_t (*uct_md_mkey_pack_func_t)(uct_md_h md, uct_mem_h memh, void *rkey_buffer); typedef int (*uct_md_is_sockaddr_accessible_func_t)(uct_md_h md, const ucs_sock_addr_t *sockaddr, uct_sockaddr_accessibility_t mode); typedef ucs_status_t (*uct_md_detect_memory_type_func_t)(uct_md_h md, const void *addr, size_t length, ucs_memory_type_t *mem_type_p); /** * Memory domain operations */ struct uct_md_ops { uct_md_close_func_t close; uct_md_query_func_t query; uct_md_mem_alloc_func_t mem_alloc; uct_md_mem_free_func_t mem_free; uct_md_mem_advise_func_t mem_advise; uct_md_mem_reg_func_t mem_reg; uct_md_mem_dereg_func_t mem_dereg; uct_md_mkey_pack_func_t mkey_pack; uct_md_is_sockaddr_accessible_func_t is_sockaddr_accessible; uct_md_detect_memory_type_func_t detect_memory_type; }; /** * Memory domain */ struct uct_md { uct_md_ops_t *ops; uct_component_t *component; }; #define UCT_MD_DEFAULT_CONFIG_INITIALIZER \ { \ .name = "Default memory domain", \ .prefix = "", \ .table = uct_md_config_table, \ .size = sizeof(uct_md_config_t), \ } static UCS_F_ALWAYS_INLINE void* uct_md_fill_md_name(uct_md_h md, void *buffer) { #if ENABLE_DEBUG_DATA memcpy(buffer, md->component->name, UCT_COMPONENT_NAME_MAX); return (char*)buffer + UCT_COMPONENT_NAME_MAX; #else return buffer; #endif } /* * Base implementation of query_md_resources(), which returns a single md * resource whose name is identical to component name. */ ucs_status_t uct_md_query_single_md_resource(uct_component_t *component, uct_md_resource_desc_t **resources_p, unsigned *num_resources_p); ucs_status_t uct_md_query_empty_md_resource(uct_md_resource_desc_t **resources_p, unsigned *num_resources_p); /** * @brief Dummy function * Dummy function to emulate unpacking a remote key buffer to handle. * */ ucs_status_t uct_md_stub_rkey_unpack(uct_component_t *component, const void *rkey_buffer, uct_rkey_t *rkey_p, void **handle_p); extern ucs_config_field_t uct_md_config_table[]; #endif