[ewg] [PATCH 3/3] ofed-1.3-rc4 IB/ehca: backport patch for rhel4.6
Hoang-Nam Nguyen
hnguyen at linux.vnet.ibm.com
Sat Feb 2 08:48:16 PST 2008
IB/ehca: backport ehca's mmap-to-user-space for 2.6.9_U6
This patch is required since previous version is not patchable due to
many changes in source code. That means no functional changes were
made by this new version.
Signed-off-by: Hoang-Nam Nguyen <hnguyen at de.ibm.com>
---
.../2.6.9_U6/backport_ehca_2_rhel45_umap.patch | 120 ++++++++++----------
1 files changed, 58 insertions(+), 62 deletions(-)
diff --git a/kernel_patches/backport/2.6.9_U6/backport_ehca_2_rhel45_umap.patch b/kernel_patches/backport/2.6.9_U6/backport_ehca_2_rhel45_umap.patch
index fccef72..ff9b9e3 100644
--- a/kernel_patches/backport/2.6.9_U6/backport_ehca_2_rhel45_umap.patch
+++ b/kernel_patches/backport/2.6.9_U6/backport_ehca_2_rhel45_umap.patch
@@ -1,25 +1,22 @@
-diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h
---- ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h 2007-09-26 09:45:25.000000000 -0700
-+++ rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h 2007-09-26 03:41:13.000000000 -0700
-@@ -161,14 +161,13 @@ struct ehca_qp {
- struct ipz_qp_handle ipz_qp_handle;
- struct ehca_pfqp pf;
- struct ib_qp_init_attr init_attr;
-+ u64 uspace_squeue;
-+ u64 uspace_rqueue;
-+ u64 uspace_fwh;
- struct ehca_cq *send_cq;
- struct ehca_cq *recv_cq;
- unsigned int sqerr_purgeflag;
- struct hlist_node list_entries;
+diff -Nurp a/drivers/infiniband/hw/ehca/ehca_classes.h b/drivers/infiniband/hw/ehca/ehca_classes.h
+--- a/drivers/infiniband/hw/ehca/ehca_classes.h 2008-01-23 15:30:42.000000000 +0100
++++ b/drivers/infiniband/hw/ehca/ehca_classes.h 2008-01-23 15:38:37.000000000 +0100
+@@ -179,10 +179,10 @@ struct ehca_qp {
+ /* array to cache modify_qp()'s parms for GSI/SMI qp */
+ struct ehca_mod_qp_parm *mod_qp_parm;
+ int mod_qp_parm_idx;
- /* mmap counter for resources mapped into user space */
- u32 mm_count_squeue;
- u32 mm_count_rqueue;
- u32 mm_count_galpa;
- };
-
- #define IS_SRQ(qp) (qp->ext_type == EQPT_SRQ)
-@@ -189,6 +188,8 @@ struct ehca_cq {
++ /* mmap addr */
++ u64 uspace_squeue;
++ u64 uspace_rqueue;
++ u64 uspace_fwh;
+ /* unsolicited ack circumvention */
+ int unsol_ack_circ;
+ int mtu_shift;
+@@ -208,6 +208,8 @@ struct ehca_cq {
struct ipz_cq_handle ipz_cq_handle;
struct ehca_pfcq pf;
spinlock_t cb_lock;
@@ -28,7 +25,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h rhel4u5_ofa_
struct hlist_head qp_hashtab[QP_HASHTAB_LEN];
struct list_head entry;
u32 nr_callbacks; /* #events assigned to cpu by scaling code */
-@@ -196,9 +197,6 @@ struct ehca_cq {
+@@ -215,9 +217,6 @@ struct ehca_cq {
wait_queue_head_t wait_completion;
spinlock_t task_lock;
u32 ownpid;
@@ -38,7 +35,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h rhel4u5_ofa_
};
enum ehca_mr_flag {
-@@ -301,6 +299,20 @@ struct ehca_ucontext {
+@@ -320,6 +319,20 @@ struct ehca_ucontext {
struct ib_ucontext ib_ucontext;
};
@@ -59,15 +56,15 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h rhel4u5_ofa_
int ehca_init_pd_cache(void);
void ehca_cleanup_pd_cache(void);
int ehca_init_cq_cache(void);
-@@ -326,6 +338,7 @@ extern int ehca_scaling_code;
- extern int ehca_mr_largepage;
+@@ -345,6 +358,7 @@ extern int ehca_scaling_code;
+ extern int ehca_nr_ports;
struct ipzu_queue_resp {
+ u64 queue; /* points to first queue entry */
u32 qe_size; /* queue entry size */
u32 act_nr_of_sg;
u32 queue_length; /* queue length allocated in bytes */
-@@ -338,6 +351,7 @@ struct ehca_create_cq_resp {
+@@ -357,6 +371,7 @@ struct ehca_create_cq_resp {
u32 cq_number;
u32 token;
struct ipzu_queue_resp ipz_queue;
@@ -75,17 +72,17 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_classes.h rhel4u5_ofa_
u32 fw_handle_ofs;
u32 dummy;
};
-@@ -353,6 +367,7 @@ struct ehca_create_qp_resp {
- u32 fw_handle_ofs;
+@@ -373,6 +388,7 @@ struct ehca_create_qp_resp {
+ u32 dummy;
struct ipzu_queue_resp ipz_squeue;
struct ipzu_queue_resp ipz_rqueue;
+ struct h_galpas galpas;
};
struct ehca_alloc_cq_parms {
-diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_cq.c rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_cq.c
---- ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_cq.c 2007-09-26 09:45:25.000000000 -0700
-+++ rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_cq.c 2007-09-26 03:46:28.000000000 -0700
+diff -Nurp a/drivers/infiniband/hw/ehca/ehca_cq.c b/drivers/infiniband/hw/ehca/ehca_cq.c
+--- a/drivers/infiniband/hw/ehca/ehca_cq.c 2008-01-23 15:30:42.000000000 +0100
++++ b/drivers/infiniband/hw/ehca/ehca_cq.c 2008-01-23 15:38:37.000000000 +0100
@@ -273,6 +273,7 @@ struct ib_cq *ehca_create_cq(struct ib_d
if (context) {
struct ipz_queue *ipz_queue = &my_cq->ipz_queue;
@@ -203,12 +200,12 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_cq.c rhel4u5_ofa_kerne
ehca_err(cq->device, "Invalid caller pid=%x ownpid=%x",
cur_pid, my_cq->ownpid);
return -EINVAL;
-diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_iverbs.h rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_iverbs.h
---- ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_iverbs.h 2007-09-24 06:02:36.000000000 -0700
-+++ rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_iverbs.h 2007-09-26 03:25:27.000000000 -0700
-@@ -189,6 +189,14 @@ int ehca_mmap(struct ib_ucontext *contex
-
- void ehca_poll_eqs(unsigned long data);
+diff -Nurp a/drivers/infiniband/hw/ehca/ehca_iverbs.h b/drivers/infiniband/hw/ehca/ehca_iverbs.h
+--- a/drivers/infiniband/hw/ehca/ehca_iverbs.h 2008-01-23 15:30:42.000000000 +0100
++++ b/drivers/infiniband/hw/ehca/ehca_iverbs.h 2008-01-23 15:38:37.000000000 +0100
+@@ -192,6 +192,14 @@ void ehca_poll_eqs(unsigned long data);
+ int ehca_calc_ipd(struct ehca_shca *shca, int port,
+ enum ib_rate path_rate, u32 *ipd);
+int ehca_mmap_nopage(u64 foffset,u64 length,void **mapped,
+ struct vm_area_struct **vma);
@@ -221,10 +218,10 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_iverbs.h rhel4u5_ofa_k
#ifdef CONFIG_PPC_64K_PAGES
void *ehca_alloc_fw_ctrlblock(gfp_t flags);
void ehca_free_fw_ctrlblock(void *ptr);
-diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_main.c rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_main.c
---- ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_main.c 2007-09-26 09:45:25.000000000 -0700
-+++ rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_main.c 2007-09-27 03:14:39.000000000 -0700
-@@ -382,7 +382,7 @@ int ehca_init_device(struct ehca_shca *s
+diff -Nurp a/drivers/infiniband/hw/ehca/ehca_main.c b/drivers/infiniband/hw/ehca/ehca_main.c
+--- a/drivers/infiniband/hw/ehca/ehca_main.c 2008-01-23 15:30:42.000000000 +0100
++++ b/drivers/infiniband/hw/ehca/ehca_main.c 2008-01-23 15:38:37.000000000 +0100
+@@ -394,7 +394,7 @@ int ehca_init_device(struct ehca_shca *s
strlcpy(shca->ib_device.name, "ehca%d", IB_DEVICE_NAME_MAX);
shca->ib_device.owner = THIS_MODULE;
@@ -233,9 +230,9 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_main.c rhel4u5_ofa_ker
shca->ib_device.uverbs_cmd_mask =
(1ull << IB_USER_VERBS_CMD_GET_CONTEXT) |
(1ull << IB_USER_VERBS_CMD_QUERY_DEVICE) |
-diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c
---- ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c 2007-09-26 09:45:25.000000000 -0700
-+++ rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c 2007-09-26 10:29:16.000000000 -0700
+diff -Nurp a/drivers/infiniband/hw/ehca/ehca_qp.c b/drivers/infiniband/hw/ehca/ehca_qp.c
+--- a/drivers/infiniband/hw/ehca/ehca_qp.c 2008-01-23 15:30:42.000000000 +0100
++++ b/drivers/infiniband/hw/ehca/ehca_qp.c 2008-01-23 15:38:37.000000000 +0100
@@ -265,15 +265,19 @@ static inline int ibqptype2servicetype(e
/*
* init userspace queue info from ipz_queue data
@@ -258,7 +255,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
}
/*
-@@ -748,6 +752,7 @@ static struct ehca_qp *internal_create_q
+@@ -773,6 +777,7 @@ static struct ehca_qp *internal_create_q
/* copy queues, galpa data to user space */
if (context && udata) {
struct ehca_create_qp_resp resp;
@@ -266,11 +263,10 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
memset(&resp, 0, sizeof(resp));
resp.qp_num = my_qp->real_qp_num;
-@@ -756,23 +761,55 @@ static struct ehca_qp *internal_create_q
- resp.ext_type = my_qp->ext_type;
+@@ -782,22 +787,55 @@ static struct ehca_qp *internal_create_q
resp.qkey = my_qp->qkey;
resp.real_qp_num = my_qp->real_qp_num;
--
+
- if (HAS_SQ(my_qp))
- queue2resp(&resp.ipz_squeue, &my_qp->ipz_squeue);
- if (HAS_RQ(my_qp))
@@ -284,7 +280,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
+ if (ret) {
+ ehca_err(pd->device,
+ "Could not mmap squeue pages");
-+ goto create_qp_exit4;
++ goto create_qp_exit6;
+ }
+ }
+ if (HAS_RQ(my_qp)) {
@@ -294,7 +290,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
+ if (ret) {
+ ehca_err(pd->device,
+ "Could not mmap rqueue pages");
-+ goto create_qp_exit5;
++ goto create_qp_exit7;
+ }
+ }
+ /* fw_handle */
@@ -304,33 +300,33 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
+ &vma);
+ if (ret) {
+ ehca_err(pd->device, "Could not mmap fw_handle");
-+ goto create_qp_exit6;
++ goto create_qp_exit8;
+ }
+ my_qp->uspace_fwh = (u64)resp.galpas.kernel.fw_handle;
if (ib_copy_to_udata(udata, &resp, sizeof resp)) {
ehca_err(pd->device, "Copy to udata failed");
ret = -EINVAL;
-- goto create_qp_exit4;
-+ goto create_qp_exit7;
+- goto create_qp_exit6;
++ goto create_qp_exit9;
}
}
return my_qp;
-+create_qp_exit7:
++create_qp_exit9:
+ ehca_munmap(my_qp->uspace_fwh, EHCA_PAGESIZE);
+
-+create_qp_exit6:
++create_qp_exit8:
+ ehca_munmap(my_qp->uspace_rqueue, my_qp->ipz_rqueue.queue_length);
+
-+create_qp_exit5:
++create_qp_exit7:
+ ehca_munmap(my_qp->uspace_squeue, my_qp->ipz_squeue.queue_length);
+
- create_qp_exit4:
- if (HAS_RQ(my_qp))
- ipz_queue_dtor(my_pd, &my_qp->ipz_rqueue);
-@@ -1124,7 +1161,7 @@ static int internal_modify_qp(struct ib_
+ create_qp_exit6:
+ ehca_cq_unassign_qp(my_qp->send_cq, my_qp->real_qp_num);
+
+@@ -1157,7 +1195,7 @@ static int internal_modify_qp(struct ib_
my_qp->qp_type == IB_QPT_SMI) &&
statetrans == IB_QPST_SQE2RTS) {
/* mark next free wqe if kernel */
@@ -339,7 +335,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
struct ehca_wqe *wqe;
/* lock send queue */
spin_lock_irqsave(&my_qp->spinlock_s, flags);
-@@ -1777,18 +1814,11 @@ static int internal_destroy_qp(struct ib
+@@ -1927,18 +1965,11 @@ static int internal_destroy_qp(struct ib
enum ib_qp_type qp_type;
unsigned long flags;
@@ -363,7 +359,7 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
}
if (my_qp->send_cq) {
-@@ -1805,6 +1835,24 @@ static int internal_destroy_qp(struct ib
+@@ -1955,6 +1986,24 @@ static int internal_destroy_qp(struct ib
idr_remove(&ehca_qp_idr, my_qp->token);
write_unlock_irqrestore(&ehca_qp_idr_lock, flags);
@@ -388,9 +384,9 @@ diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_qp.c rhel4u5_ofa_kerne
h_ret = hipz_h_destroy_qp(shca->ipz_hca_handle, my_qp);
if (h_ret != H_SUCCESS) {
ehca_err(dev, "hipz_h_destroy_qp() failed h_ret=%li "
-diff -Nurp ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_uverbs.c rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_uverbs.c
---- ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_uverbs.c 2007-09-26 09:45:25.000000000 -0700
-+++ rhel4u5_ofa_kernel-1.3/drivers/infiniband/hw/ehca/ehca_uverbs.c 2007-09-26 06:42:19.000000000 -0700
+diff -Nurp a/drivers/infiniband/hw/ehca/ehca_uverbs.c b/drivers/infiniband/hw/ehca/ehca_uverbs.c
+--- a/drivers/infiniband/hw/ehca/ehca_uverbs.c 2008-01-23 15:30:42.000000000 +0100
++++ b/drivers/infiniband/hw/ehca/ehca_uverbs.c 2008-01-23 15:38:37.000000000 +0100
@@ -68,184 +68,104 @@ int ehca_dealloc_ucontext(struct ib_ucon
return 0;
}
--
1.5.2
More information about the ewg
mailing list