diff options
author | Hoang-Nam Nguyen <hnguyen@linux.vnet.ibm.com> | 2006-11-20 23:54:12 +0100 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2006-11-29 15:33:08 -0800 |
commit | 2771e9ed4702e46c3f4c305eb2e047c251c2ad2b (patch) | |
tree | da6ffee90c3725fb84949cf44ea78f8e8c8965c1 /drivers/infiniband/hw/ehca/ipz_pt_fn.c | |
parent | 9ab1ffa8775d9c677b1301cccce8a7d91e5163d0 (diff) | |
download | blackbird-op-linux-2771e9ed4702e46c3f4c305eb2e047c251c2ad2b.tar.gz blackbird-op-linux-2771e9ed4702e46c3f4c305eb2e047c251c2ad2b.zip |
IB/ehca: Use WQE offset instead of WQE addr for pending work reqs
This is a patch for ehca to fix a bug in prepare_sqe_to_rts(), which
used WQE address to iterate pending work requests. This might cause
an access violation since the queue pages can not be assumed to follow
each other consecutively. Thus, this patch introduces a few queue
functions to determine WQE offset based on its address and uses WQE
offset to iterate the pending work requests.
Signed-off-by: Hoang-Nam Nguyen <hnguyen@de.ibm.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband/hw/ehca/ipz_pt_fn.c')
-rw-r--r-- | drivers/infiniband/hw/ehca/ipz_pt_fn.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/infiniband/hw/ehca/ipz_pt_fn.c b/drivers/infiniband/hw/ehca/ipz_pt_fn.c index e028ff1588cc..bf7a40088f61 100644 --- a/drivers/infiniband/hw/ehca/ipz_pt_fn.c +++ b/drivers/infiniband/hw/ehca/ipz_pt_fn.c @@ -70,6 +70,19 @@ void *ipz_qeit_eq_get_inc(struct ipz_queue *queue) return ret; } +int ipz_queue_abs_to_offset(struct ipz_queue *queue, u64 addr, u64 *q_offset) +{ + int i; + for (i = 0; i < queue->queue_length / queue->pagesize; i++) { + u64 page = (u64)virt_to_abs(queue->queue_pages[i]); + if (addr >= page && addr < page + queue->pagesize) { + *q_offset = addr - page + i * queue->pagesize; + return 0; + } + } + return -EINVAL; +} + int ipz_queue_ctor(struct ipz_queue *queue, const u32 nr_of_pages, const u32 pagesize, const u32 qe_size, const u32 nr_of_sg) |