[PATCH 2.6.21 3/4] ehca: remove do_mmap()

2007-01-23 Thread Hoang-Nam Nguyen
This patch removes do_mmap() from ehca:
- Call remap_pfn_range() for hardware register block
- Use vm_insert_page() to register memory allocated for completion queues
and queue pairs
- The actual mmap() call/trigger is now controlled by user space, ie. libehca

Thanks
Nam


Signed-off-by: Hoang-Nam Nguyen <[EMAIL PROTECTED]>
---


 ehca_classes.h |   15 +-
 ehca_cq.c  |   65 ++---
 ehca_iverbs.h  |8 -
 ehca_main.c|6 
 ehca_qp.c  |   78 ++-
 ehca_uverbs.c  |  395 +++--
 6 files changed, 204 insertions(+), 363 deletions(-)


diff -Nurp infiniband_orig/drivers/infiniband/hw/ehca/ehca_classes.h 
infiniband_work/drivers/infiniband/hw/ehca/ehca_classes.h
--- infiniband_orig/drivers/infiniband/hw/ehca/ehca_classes.h   2007-01-20 
00:19:10.0 +0100
+++ infiniband_work/drivers/infiniband/hw/ehca/ehca_classes.h   2007-01-20 
00:21:21.0 +0100
@@ -119,13 +119,14 @@ 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;
+   /* mmap counter for resources mapped into user space */
+   u32 mm_count_squeue;
+   u32 mm_count_rqueue;
+   u32 mm_count_galpa;
 };
 
 /* must be power of 2 */
@@ -142,13 +143,14 @@ struct ehca_cq {
struct ipz_cq_handle ipz_cq_handle;
struct ehca_pfcq pf;
spinlock_t cb_lock;
-   u64 uspace_queue;
-   u64 uspace_fwh;
struct hlist_head qp_hashtab[QP_HASHTAB_LEN];
struct list_head entry;
u32 nr_callbacks;
spinlock_t task_lock;
u32 ownpid;
+   /* mmap counter for resources mapped into user space */
+   u32 mm_count_queue;
+   u32 mm_count_galpa;
 };
 
 enum ehca_mr_flag {
@@ -283,7 +285,6 @@ extern int ehca_port_act_time;
 extern int ehca_use_hp_mr;
 
 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 */
@@ -296,7 +297,6 @@ struct ehca_create_cq_resp {
u32 cq_number;
u32 token;
struct ipzu_queue_resp ipz_queue;
-   struct h_galpas galpas;
 };
 
 struct ehca_create_qp_resp {
@@ -309,7 +309,6 @@ struct ehca_create_qp_resp {
u32 dummy; /* padding for 8 byte alignment */
struct ipzu_queue_resp ipz_squeue;
struct ipzu_queue_resp ipz_rqueue;
-   struct h_galpas galpas;
 };
 
 struct ehca_alloc_cq_parms {
diff -Nurp infiniband_orig/drivers/infiniband/hw/ehca/ehca_cq.c 
infiniband_work/drivers/infiniband/hw/ehca/ehca_cq.c
--- infiniband_orig/drivers/infiniband/hw/ehca/ehca_cq.c2007-01-20 
00:19:10.0 +0100
+++ infiniband_work/drivers/infiniband/hw/ehca/ehca_cq.c2007-01-20 
00:21:21.0 +0100
@@ -267,7 +267,6 @@ struct ib_cq *ehca_create_cq(struct ib_d
if (context) {
struct ipz_queue *ipz_queue = _cq->ipz_queue;
struct ehca_create_cq_resp resp;
-   struct vm_area_struct *vma;
memset(, 0, sizeof(resp));
resp.cq_number = my_cq->cq_number;
resp.token = my_cq->token;
@@ -276,40 +275,14 @@ struct ib_cq *ehca_create_cq(struct ib_d
resp.ipz_queue.queue_length = ipz_queue->queue_length;
resp.ipz_queue.pagesize = ipz_queue->pagesize;
resp.ipz_queue.toggle_state = ipz_queue->toggle_state;
-   ret = ehca_mmap_nopage(((u64)(my_cq->token) << 32) | 0x1200,
-  ipz_queue->queue_length,
-  (void**)_queue.queue,
-  );
-   if (ret) {
-   ehca_err(device, "Could not mmap queue pages");
-   cq = ERR_PTR(ret);
-   goto create_cq_exit4;
-   }
-   my_cq->uspace_queue = resp.ipz_queue.queue;
-   resp.galpas = my_cq->galpas;
-   ret = ehca_mmap_register(my_cq->galpas.user.fw_handle,
-(void**)_handle,
-);
-   if (ret) {
-   ehca_err(device, "Could not mmap fw_handle");
-   cq = ERR_PTR(ret);
-   goto create_cq_exit5;
-   }
-   my_cq->uspace_fwh = (u64)resp.galpas.kernel.fw_handle;
if (ib_copy_to_udata(udata, , sizeof(resp))) {
ehca_err(device, "Copy to udata failed.");
-   goto create_cq_exit6;
+   goto create_cq_exit4;
}
}
 

[PATCH 2.6.21 3/4] ehca: remove do_mmap()

2007-01-23 Thread Hoang-Nam Nguyen
This patch removes do_mmap() from ehca:
- Call remap_pfn_range() for hardware register block
- Use vm_insert_page() to register memory allocated for completion queues
and queue pairs
- The actual mmap() call/trigger is now controlled by user space, ie. libehca

Thanks
Nam


Signed-off-by: Hoang-Nam Nguyen [EMAIL PROTECTED]
---


 ehca_classes.h |   15 +-
 ehca_cq.c  |   65 ++---
 ehca_iverbs.h  |8 -
 ehca_main.c|6 
 ehca_qp.c  |   78 ++-
 ehca_uverbs.c  |  395 +++--
 6 files changed, 204 insertions(+), 363 deletions(-)


diff -Nurp infiniband_orig/drivers/infiniband/hw/ehca/ehca_classes.h 
infiniband_work/drivers/infiniband/hw/ehca/ehca_classes.h
--- infiniband_orig/drivers/infiniband/hw/ehca/ehca_classes.h   2007-01-20 
00:19:10.0 +0100
+++ infiniband_work/drivers/infiniband/hw/ehca/ehca_classes.h   2007-01-20 
00:21:21.0 +0100
@@ -119,13 +119,14 @@ 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;
+   /* mmap counter for resources mapped into user space */
+   u32 mm_count_squeue;
+   u32 mm_count_rqueue;
+   u32 mm_count_galpa;
 };
 
 /* must be power of 2 */
@@ -142,13 +143,14 @@ struct ehca_cq {
struct ipz_cq_handle ipz_cq_handle;
struct ehca_pfcq pf;
spinlock_t cb_lock;
-   u64 uspace_queue;
-   u64 uspace_fwh;
struct hlist_head qp_hashtab[QP_HASHTAB_LEN];
struct list_head entry;
u32 nr_callbacks;
spinlock_t task_lock;
u32 ownpid;
+   /* mmap counter for resources mapped into user space */
+   u32 mm_count_queue;
+   u32 mm_count_galpa;
 };
 
 enum ehca_mr_flag {
@@ -283,7 +285,6 @@ extern int ehca_port_act_time;
 extern int ehca_use_hp_mr;
 
 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 */
@@ -296,7 +297,6 @@ struct ehca_create_cq_resp {
u32 cq_number;
u32 token;
struct ipzu_queue_resp ipz_queue;
-   struct h_galpas galpas;
 };
 
 struct ehca_create_qp_resp {
@@ -309,7 +309,6 @@ struct ehca_create_qp_resp {
u32 dummy; /* padding for 8 byte alignment */
struct ipzu_queue_resp ipz_squeue;
struct ipzu_queue_resp ipz_rqueue;
-   struct h_galpas galpas;
 };
 
 struct ehca_alloc_cq_parms {
diff -Nurp infiniband_orig/drivers/infiniband/hw/ehca/ehca_cq.c 
infiniband_work/drivers/infiniband/hw/ehca/ehca_cq.c
--- infiniband_orig/drivers/infiniband/hw/ehca/ehca_cq.c2007-01-20 
00:19:10.0 +0100
+++ infiniband_work/drivers/infiniband/hw/ehca/ehca_cq.c2007-01-20 
00:21:21.0 +0100
@@ -267,7 +267,6 @@ struct ib_cq *ehca_create_cq(struct ib_d
if (context) {
struct ipz_queue *ipz_queue = my_cq-ipz_queue;
struct ehca_create_cq_resp resp;
-   struct vm_area_struct *vma;
memset(resp, 0, sizeof(resp));
resp.cq_number = my_cq-cq_number;
resp.token = my_cq-token;
@@ -276,40 +275,14 @@ struct ib_cq *ehca_create_cq(struct ib_d
resp.ipz_queue.queue_length = ipz_queue-queue_length;
resp.ipz_queue.pagesize = ipz_queue-pagesize;
resp.ipz_queue.toggle_state = ipz_queue-toggle_state;
-   ret = ehca_mmap_nopage(((u64)(my_cq-token)  32) | 0x1200,
-  ipz_queue-queue_length,
-  (void**)resp.ipz_queue.queue,
-  vma);
-   if (ret) {
-   ehca_err(device, Could not mmap queue pages);
-   cq = ERR_PTR(ret);
-   goto create_cq_exit4;
-   }
-   my_cq-uspace_queue = resp.ipz_queue.queue;
-   resp.galpas = my_cq-galpas;
-   ret = ehca_mmap_register(my_cq-galpas.user.fw_handle,
-(void**)resp.galpas.kernel.fw_handle,
-vma);
-   if (ret) {
-   ehca_err(device, Could not mmap fw_handle);
-   cq = ERR_PTR(ret);
-   goto create_cq_exit5;
-   }
-   my_cq-uspace_fwh = (u64)resp.galpas.kernel.fw_handle;
if (ib_copy_to_udata(udata, resp, sizeof(resp))) {
ehca_err(device, Copy to udata failed.);
-   goto create_cq_exit6;
+   goto create_cq_exit4;
}