/** * Copyright (C) Mellanox Technologies Ltd. 2001-2015. ALL RIGHTS RESERVED. * * See file LICENSE for terms. */ #ifndef UCM_EVENT_H_ #define UCM_EVENT_H_ #include #include #include #include #define UCM_NATIVE_EVENT_VM_MAPPED (UCM_EVENT_MMAP | UCM_EVENT_MREMAP | \ UCM_EVENT_SHMAT | UCM_EVENT_SBRK) #define UCM_NATIVE_EVENT_VM_UNMAPPED (UCM_EVENT_MMAP | UCM_EVENT_MUNMAP | \ UCM_EVENT_MREMAP | UCM_EVENT_SHMDT | \ UCM_EVENT_SHMAT | UCM_EVENT_SBRK | \ UCM_EVENT_MADVISE) typedef struct ucm_event_handler { ucs_list_link_t list; int events; int priority; ucm_event_callback_t cb; void *arg; } ucm_event_handler_t; typedef struct ucm_event_installer { ucs_status_t (*install)(int events); void (*get_existing_alloc)(ucm_event_handler_t *handler); ucs_list_link_t list; } ucm_event_installer_t; extern ucs_list_link_t ucm_event_installer_list; ucs_status_t ucm_set_mmap_hooks(); void ucm_event_handler_add(ucm_event_handler_t *handler); void ucm_event_handler_remove(ucm_event_handler_t *handler); void ucm_event_dispatch(ucm_event_type_t event_type, ucm_event_t *event); void ucm_event_enter(); void ucm_event_enter_exclusive(); void ucm_event_leave(); static UCS_F_ALWAYS_INLINE void ucm_dispatch_vm_mmap(void *addr, size_t length) { ucm_event_t event; ucm_trace("vm_map addr=%p length=%zu", addr, length); event.vm_mapped.address = addr; event.vm_mapped.size = length; ucm_event_dispatch(UCM_EVENT_VM_MAPPED, &event); } static UCS_F_ALWAYS_INLINE void ucm_dispatch_vm_munmap(void *addr, size_t length) { ucm_event_t event; ucm_trace("vm_unmap addr=%p length=%zu", addr, length); event.vm_unmapped.address = addr; event.vm_unmapped.size = length; ucm_event_dispatch(UCM_EVENT_VM_UNMAPPED, &event); } #endif