rdmavt_cq.h (1783B)
1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2/* 3 * Copyright(c) 2016 - 2018 Intel Corporation. 4 */ 5 6#ifndef DEF_RDMAVT_INCCQ_H 7#define DEF_RDMAVT_INCCQ_H 8 9#include <linux/kthread.h> 10#include <rdma/ib_user_verbs.h> 11#include <rdma/ib_verbs.h> 12 13/* 14 * Define an ib_cq_notify value that is not valid so we know when CQ 15 * notifications are armed. 16 */ 17#define RVT_CQ_NONE (IB_CQ_NEXT_COMP + 1) 18 19/* 20 * Define read macro that apply smp_load_acquire memory barrier 21 * when reading indice of circular buffer that mmaped to user space. 22 */ 23#define RDMA_READ_UAPI_ATOMIC(member) smp_load_acquire(&(member).val) 24 25/* 26 * Define write macro that uses smp_store_release memory barrier 27 * when writing indice of circular buffer that mmaped to user space. 28 */ 29#define RDMA_WRITE_UAPI_ATOMIC(member, x) smp_store_release(&(member).val, x) 30#include <rdma/rvt-abi.h> 31 32/* 33 * This structure is used to contain the head pointer, tail pointer, 34 * and completion queue entries as a single memory allocation so 35 * it can be mmap'ed into user space. 36 */ 37struct rvt_k_cq_wc { 38 u32 head; /* index of next entry to fill */ 39 u32 tail; /* index of next ib_poll_cq() entry */ 40 struct ib_wc kqueue[]; 41}; 42 43/* 44 * The completion queue structure. 45 */ 46struct rvt_cq { 47 struct ib_cq ibcq; 48 struct work_struct comptask; 49 spinlock_t lock; /* protect changes in this struct */ 50 u8 notify; 51 u8 triggered; 52 u8 cq_full; 53 int comp_vector_cpu; 54 struct rvt_dev_info *rdi; 55 struct rvt_cq_wc *queue; 56 struct rvt_mmap_info *ip; 57 struct rvt_k_cq_wc *kqueue; 58}; 59 60static inline struct rvt_cq *ibcq_to_rvtcq(struct ib_cq *ibcq) 61{ 62 return container_of(ibcq, struct rvt_cq, ibcq); 63} 64 65bool rvt_cq_enter(struct rvt_cq *cq, struct ib_wc *entry, bool solicited); 66 67#endif /* DEF_RDMAVT_INCCQH */