mirror of
https://github.com/adulau/aha.git
synced 2025-01-01 05:36:24 +00:00
IB/ehca: Refactor "maybe missed event" code
Refactor the ehca changes from commit ed23a727
("IB: Return "maybe
missed event" hint from ib_req_notify_cq()") so the queue arithmetic
is done in slightly fewer lines. Also, move the spinlock flags into
the block they're used in.
Signed-off-by: Joachim Fenkes <fenkes@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
1bae4dbf95
commit
fffba373ef
2 changed files with 11 additions and 19 deletions
|
@ -637,7 +637,6 @@ poll_cq_exit0:
|
|||
int ehca_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags notify_flags)
|
||||
{
|
||||
struct ehca_cq *my_cq = container_of(cq, struct ehca_cq, ib_cq);
|
||||
unsigned long spl_flags;
|
||||
int ret = 0;
|
||||
|
||||
switch (notify_flags & IB_CQ_SOLICITED_MASK) {
|
||||
|
@ -652,6 +651,7 @@ int ehca_req_notify_cq(struct ib_cq *cq, enum ib_cq_notify_flags notify_flags)
|
|||
}
|
||||
|
||||
if (notify_flags & IB_CQ_REPORT_MISSED_EVENTS) {
|
||||
unsigned long spl_flags;
|
||||
spin_lock_irqsave(&my_cq->spinlock, spl_flags);
|
||||
ret = ipz_qeit_is_valid(&my_cq->ipz_queue);
|
||||
spin_unlock_irqrestore(&my_cq->spinlock, spl_flags);
|
||||
|
|
|
@ -105,7 +105,6 @@ void *ipz_qpageit_get_inc(struct ipz_queue *queue);
|
|||
* step in struct ipz_queue, will wrap in ringbuffer
|
||||
* returns address (kv) of Queue Entry BEFORE increment
|
||||
* warning don't use in parallel with ipz_qpageit_get_inc()
|
||||
* warning unpredictable results may occur if steps>act_nr_of_queue_entries
|
||||
*/
|
||||
static inline void *ipz_qeit_get_inc(struct ipz_queue *queue)
|
||||
{
|
||||
|
@ -120,32 +119,25 @@ static inline void *ipz_qeit_get_inc(struct ipz_queue *queue)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* return a bool indicating whether current Queue Entry is valid
|
||||
*/
|
||||
static inline int ipz_qeit_is_valid(struct ipz_queue *queue)
|
||||
{
|
||||
struct ehca_cqe *cqe = ipz_qeit_get(queue);
|
||||
return ((cqe->cqe_flags >> 7) == (queue->toggle_state & 1));
|
||||
}
|
||||
|
||||
/*
|
||||
* return current Queue Entry, increment Queue Entry iterator by one
|
||||
* step in struct ipz_queue, will wrap in ringbuffer
|
||||
* returns address (kv) of Queue Entry BEFORE increment
|
||||
* returns 0 and does not increment, if wrong valid state
|
||||
* warning don't use in parallel with ipz_qpageit_get_inc()
|
||||
* warning unpredictable results may occur if steps>act_nr_of_queue_entries
|
||||
*/
|
||||
static inline void *ipz_qeit_get_inc_valid(struct ipz_queue *queue)
|
||||
{
|
||||
struct ehca_cqe *cqe = ipz_qeit_get(queue);
|
||||
u32 cqe_flags = cqe->cqe_flags;
|
||||
|
||||
if ((cqe_flags >> 7) != (queue->toggle_state & 1))
|
||||
return NULL;
|
||||
|
||||
ipz_qeit_get_inc(queue);
|
||||
return cqe;
|
||||
}
|
||||
|
||||
static inline int ipz_qeit_is_valid(struct ipz_queue *queue)
|
||||
{
|
||||
struct ehca_cqe *cqe = ipz_qeit_get(queue);
|
||||
u32 cqe_flags = cqe->cqe_flags;
|
||||
|
||||
return cqe_flags >> 7 == (queue->toggle_state & 1);
|
||||
return ipz_qeit_is_valid(queue) ? ipz_qeit_get_inc(queue) : NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue