2N/A * The contents of this file are subject to the terms of the 2N/A * Common Development and Distribution License (the "License"). 2N/A * You may not use this file except in compliance with the License. 2N/A * See the License for the specific language governing permissions 2N/A * and limitations under the License. 2N/A * When distributing Covered Code, include this CDDL HEADER in each 2N/A * If applicable, add the following below this CDDL HEADER, with the 2N/A * fields enclosed by brackets "[]" replaced with your own identifying 2N/A * information: Portions Copyright [yyyy] [name of copyright owner] 2N/A * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved. 2N/A/* Function prototypes */ 2N/A * place holder for now 2N/A * ia_handle IA handle 2N/A * evd_ptr pointer to EVD struct 2N/A * cno_ptr pointer to CNO struct 2N/A * cqlen minimum QLen 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A /* cq handle is created even for non-cq type events */ 2N/A /* since cq handle is where the evd fd gets stored. */ 2N/A "cq_alloc: evd_ptr 0x%p, cq_handle == NULL\n",
2N/A /* get the hca information from ia_ptr */ 2N/A "cq_alloc: evd 0x%p, flags 0x%x, cookie 0x%llx, hkey 0x%llx,\n" 2N/A /* The next line is only needed for backward compatibility */ 2N/A /* call into driver to allocate cq */ 2N/A "cq_alloc: created, evd 0x%p, hkey 0x%016llx\n\n",
evd_ptr,
2N/A * allocate a hash table for wrid management, the key is 2N/A * a combination of QPnumber and SEND/RECV type. This is 2N/A * required only for evd which have a CQ mapped to 2N/A "cq_alloc: hash_create failed\n");
2N/A /* In the case of Arbel or Hermon */ 2N/A "cq_alloc: EVD_FREE err:%s\n",
2N/A "cq_alloc: DAPL_CQ_ALLOC failed\n");
2N/A /* free the hash table we created */ 2N/A * cq_size is the actual depth of the CQ which is 1 more 2N/A * than what ibt_alloc_cq reports. However the application 2N/A * can only use (cq_size - 1) entries. 2N/A * evd_ptr pointer to EVD struct 2N/A * cqlen new length of the cq 2N/A * DAT_INVALID_HANDLE 2N/A * DAT_INTERNAL_ERROR 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A /* attempt to resize back to the current size */ 2N/A * XXX this is catastrophic need to post an event 2N/A * dapli_ib_cq_resize_internal 2N/A * An internal routine to resize a CQ. 2N/A * evd_ptr pointer to EVD struct 2N/A * cqlen new length of the cq 2N/A * DAT_INVALID_HANDLE 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "dapls_ib_cq_resize: evd 0x%p cq 0x%p " 2N/A "evd_hkey 0x%016llx cqlen %d\n",
2N/A * Since CQs are created in powers of 2 with one non-usable slot, 2N/A * its possible that the previously allocated CQ has sufficient 2N/A * entries. If the current cq is big enough and it is mapped in 2N/A /* unmap the CQ before resizing it */ 2N/A "cq_resize: munmap(%p:0x%llx) failed(%d)\n",
2N/A /* cq_addr is unmapped and no longer valid */ 2N/A /* The next line is only needed for backward compatibility */ 2N/A "dapls_ib_cq_resize: evd 0x%p, err: %s\n",
2N/A }
else {
/* Need to retry resize with a smaller qlen */ 2N/A /* In the case of Arbel or Hermon */ 2N/A /* Need to retry resize with a smaller qlen */ 2N/A * upon resize the old events are moved to the start of the CQ 2N/A * hence we need to reset the consumer index too 2N/A }
else {
/* Hermon */ 2N/A * ia_handle IA handle 2N/A * evd_ptr pointer to EVD struct 2N/A * DAT_INVALID_HANDLE 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "dapls_ib_cq_free: evd 0x%p cq 0x%p hkey %016llx\n",
evd_ptr,
2N/A /* If the cq was mmap'd unmap it before freeing it */ 2N/A "dapls_ib_cq_free: evd 0x%p, err: %s\n",
2N/A * dapl_set_cq_notify 2N/A * Set up CQ completion notifications 2N/A * ia_handle IA handle 2N/A * evd_ptr pointer to EVD struct 2N/A * DAT_INVALID_HANDLE 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "dapls_ib_cq_notify: evd 0x%p cq 0x%p\n",
evd_ptr,
2N/A "dapls_set_cqN_notify:evd %p cq %p num_events %d\n",
evd_ptr,
2N/A * dapls_ib_cqd_create 2N/A * Set up CQ notification event thread 2N/A * ia_handle IA handle 2N/A * DAT_INVALID_HANDLE 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A * Destroy CQ notification event thread 2N/A * ia_handle IA handle 2N/A * DAT_INVALID_HANDLE 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A /* free up the dummy cq */ 2N/A "dapls_ib_cqd_destroy: EVD_FREE err:%d errno:%d\n",
2N/A * ia_handle IA handle 2N/A * PZ_ptr pointer to PZEVD struct 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "pd_alloc: ia 0x%p, pz 0x%p, cannot allocate pd\n",
2N/A "pd_alloc: ia 0x%p, pz 0x%p, cannot create pd, " 2N/A "pd_alloc: successful, ia 0x%p, pz 0x%p, hkey %016llx\n",
2N/A * ia_handle IA handle 2N/A * PZ_ptr pointer to PZ struct 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "pd_free: pz 0x%p, cannot free pd\n",
pz);
2N/A * dapl_ib_mr_register 2N/A * Register a virtual memory region 2N/A * ia_handle IA handle 2N/A * lmr pointer to dapl_lmr struct 2N/A * virt_addr virtual address of beginning of mem region 2N/A * length length of memory region 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "mr_register: lmr 0x%p, ia 0x%p, " 2N/A "mr_register: lmr 0x%p, ia 0x%p, " 2N/A "mr_register: lmr 0x%p, pd_hkey 0x%016llx, vaddr 0x%016llx, " 2N/A /* call into driver to allocate MR resource */ 2N/A "mr_register: lmr 0x%p, failed (%s)\n",
2N/A "mr_register: successful, lmr 0x%p, mr_hkey 0x%016llx, " 2N/A * dapl_ib_mr_register_shared 2N/A * Register a shared virtual memory region 2N/A * ia_handle IA handle 2N/A * lmr pointer to dapl_lmr struct 2N/A * virt_addr virtual address of beginning of mem region 2N/A * cookie shared memory identifer 2N/A * length length of memory region 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "mr_register_shared: lmr 0x%p, ia 0x%p, " 2N/A "mr_register_shared: lmr 0x%p, ia 0x%p, " 2N/A "mr_register_shared: lmr 0x%p, pd_hkey 0x%016llx, " 2N/A "vaddr 0x%016llx, len %llu, flags 0x%x\n",
2N/A "mr_register_shared: cookie \n0x");
2N/A for (i =
4; i >= 0; i--) {
2N/A /* call into driver to allocate MR resource */ 2N/A "mr_register_shared: lmr 0x%p, failed (%s)\n",
2N/A "mr_register_shared: successful, lmr 0x%p, mr_hkey 0x%016llx, " 2N/A * dapl_ib_mr_deregister 2N/A * Free a memory region 2N/A * lmr pointer to dapl_lmr struct 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "mr_deregister: lmr 0x%p, hkey 0x%016llx, lmr_ctx 0x%08x\n" 2N/A " vaddr 0x%016llx, len %llu, flags 0x%x\n",
2N/A /* call into driver to do MR deregister */ 2N/A "mr_deregister: lmr 0x%p, failed (%s)\n",
2N/A "mr_deregister: successful\n\n");
2N/A * dapl_ib_mr_register_lmr 2N/A * Register a memory region based on attributes of an existing one 2N/A * ia_handle IA handle 2N/A * lmr pointer to dapl_lmr struct 2N/A * virt_addr virtual address of beginning of mem region 2N/A * length length of memory region 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "mr_register_lmr: lmr 0x%p, ia 0x%p, " 2N/A "mr_register_lmr: lmr 0x%p, hkey 0x%016llx, lmr_ctx 0x%08x\n" 2N/A " vaddr 0x%016llx, len %llu, flags 0x%x\n",
2N/A /* call into driver to allocate MR resource */ 2N/A "mr_register_lmr: failed (%s), orig_hkey (%016llx)\n",
2N/A "mr_registered_lmr: successful, lmr 0x%p, hkey 0x%016llx\n",
2N/A * Bind a protection domain to a memory window 2N/A * rmr Initialized rmr to hold binding handles 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "mw_alloc: rmr 0x%p, cannot alloc mw_handle\n",
rmr);
2N/A "mw_alloc: rmr 0x%p, pd_hkey 0x%016llx\n",
2N/A "mw_alloc: successful, rmr 0x%p, mw_hkey 0x%llx, " 2N/A * Release bindings of a protection domain to a memory window 2N/A * rmr Initialized rmr to hold binding handles 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A * Bind a protection domain to a memory window 2N/A * rmr Initialized rmr to hold binding handles 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A * wre.wr_flags = (is_signaled) ? IBT_WR_SEND_SIGNAL : 2N/A * Till we fix the chan alloc flags do the following - 2N/A /* Translate dapl flags */ 2N/A /* suppress completions */ 2N/A "mw_bind: rmr 0x%p, wr_flags 0x%x, rkey 0x%x, bind_flags 0x%x\n" 2N/A " bind_va 0x%llx, bind_len 0x%llx, mem_priv 0x%x\n",
2N/A /* This flag is used to control notification of completions */ 2N/A * The evd waiter will use threshold to control wakeups 2N/A * Hence the event notification will be done via arming the 2N/A * CQ so we do not need special notification generation 2N/A * hence set suppression to true 2N/A * dapls_ib_mw_unbind 2N/A * Unbind a protection domain from a memory window 2N/A * rmr Initialized rmr to hold binding handles 2N/A * DAT_INSUFFICIENT_RESOURCES 2N/A "mw_unbind: rmr 0x%p, enter\n",
rmr);
2N/A "mw_unbind: rmr 0x%p, exit\n\n",
rmr);
2N/A * Processes async events and calls appropriate callbacks so that events 2N/A * can be posted to the async evd. 2N/A * Walk the EPs to match this EP, then invoke the 2N/A * routine when we have the EP we need 2N/A * Walk the EVDs to match this EVD, then invoke the 2N/A * routine when we have the EVD we need 2N/A * We are not interested in the following events 2N/A * case IBT_EVENT_PATH_MIGRATED: 2N/A * case IBT_EVENT_COM_EST: 2N/A * case IBT_EVENT_SQD: 2N/A * case IBT_ERROR_PATH_MIGRATE_REQ: 2N/A * case IBT_EVENT_PORT_UP: 2N/A "dapls_ib_async_callback: unhandled async code:%x\n",
2N/A * dapls_ib_setup_async_callback 2N/A * The reference implementation calls this to register callbacks, 2N/A * but since our model of polling for events is based on retrieving 2N/A * events by the waiting thread itself this is a NOOP for us. 2N/A * dapls_ib_query_hca 2N/A * Set up an asynchronous callbacks of various kinds 2N/A * hca_handl hca handle 2N/A * ep_attr attribute of the ep 2N/A * DAT_INVALID_PARAMETER 2N/A/* these are just arbitrary values for now */ 2N/A /* max_iov_segments_per_dto is for non-RDMA */ 2N/A /* all instances of IA */ 2N/A "\tadapter_name %s\n " 2N/A "\tvendor_name %s\n " 2N/A "\thardware_version_major 0x%08x\n" 2N/A "\tmax_dto_per_ep %d\n" 2N/A "\tmax_rdma_read_per_ep_in %d\n" 2N/A "\tmax_rdma_read_per_ep_out %d\n" 2N/A "\tmax_evd_qlen %d\n" 2N/A "\tmax_iov_segments_per_dto %d\n" 2N/A "\tmax_lmr_block_size 0x%016llx\n" 2N/A "\tmax_lmr_virtual_address 0x%016llx\n" 2N/A "\tmax_mtu_size 0x%016llx\n" 2N/A "\tmax_rdma_size 0x%016llx\n" 2N/A "\tmax_rmr_target_address 0x%016llx\n" 2N/A "\tmax_iov_segments_per_rdma_read %d\n" 2N/A "\tmax_iov_segments_per_rdma_write %d\n" 2N/A "\tmax_rdma_read_in %d\n" 2N/A "\tmax_rdma_read_out %d\n" 2N/A "\tmax_ep_per_srq %d\n" 2N/A "\tmax_recv_per_srq %d\n" 2N/A * For QPs with SRQ attached store the premature event in the 2N/A * SRQ's premature event list 2N/A * mark cqe as valid before storing it in the 2N/A * premature events list 2N/A * Return the premature events to the free list after processing it 2N/A * This function is called only for premature events on the SRQ 2N/A * dapls_ib_get_async_event 2N/A * Translate an asynchronous event type to the DAT event. 2N/A * Note that different providers have different sets of errors. 2N/A * cause_ptr provider event cause 2N/A * async_event DAT mapping of error 2N/A * DAT_NOT_IMPLEMENTED Caller is not interested this event 2N/A /* CATASTROPHIC errors */ 2N/A * Errors we are not interested in reporting: 2N/A * IBT_EVENT_PATH_MIGRATED 2N/A * IBT_ERROR_PATH_MIGRATE_REQ 2N/A "event_poll: evd 0x%p, hkey 0x%llx, threshold %d,\n" 2N/A " timeout 0x%llx, evp_ptr 0x%p, num_ev %d\n",
2N/A * Poll the EVD and if there are no events then we wait in 2N/A "event_poll: evd 0x%p, retval %d err: %s\n",
2N/A "dapls_ib_event_poll: evd %p nevents %d\n",
evd_ptr,
2N/A "event_wakeup: evd 0x%p, hkey 0x%llx\n",
2N/A * Wakeup any thread waiting in the kernel on this EVD 2N/A "event_wakeup: evd 0x%p, retval %d err: %s\n",
2N/A * dapls_ib_cq_peek is used by dapl_cno_wait(). After the CQ has been 2N/A * inspected we arm the CQ if it was empty. 2N/A /* No events found in CQ arm it now */ 2N/A "dapls_ib_cq_peek: set_cq_notify\n");
2N/A * Modifies the CNO associated to an EVD 2N/A "modify_cno: evd 0x%p, hkey 0x%llx, cno 0x%p, cno_hkey 0x%llx\n",
2N/A * modify CNO associated with the EVD 2N/A "modify_cno: evd 0x%p, cno %p retval %d err: %s\n",
2N/A "cno_wait: cno 0x%p, hkey 0x%016llx, timeout 0x%016llx\n",
2N/A "cno_wait: cno 0x%p ioctl err: %s\n",
2N/A "cno_wait: woken up, cno 0x%p, evd 0x%p\n\n",
2N/A "cno_alloc: cno 0x%p, wait_agent != NULL\n",
cno_ptr);
2N/A "cno_alloc: cno 0x%p ioctl err: %s\n",
2N/A "cno_alloc: cno 0x%p allocated, ia_ptr 0x%p, hkey 0x%016llx\n",
2N/A "cno_free: cno 0x%p, hkey 0x%016llx\n",
2N/A "cno_free: cno 0x%p ioctl err: %s\n",
2N/A * Connecting to a non-existant conn qual gets 2N/A * forward ipaddr lookup failed 2N/A/* Function that returns a pointer to the specified doorbell entry */ 2N/A /* Check to see if page already mapped for entry */ 2N/A /* If not, map a new page and prepend to pagelist */