[PATCH 2.6.21 3/4] ehca: remove do_mmap()
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()
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; }