Replace sdp_kmap by kmap_atomic. Use KM_IRQ0 slot, and
disable local interrupts to avoid kmap slot collision.
Incidentially, sdp_iocb.h is now free of stuff not related
to iocb.

Signed-off-by: Michael S. Tsirkin <[EMAIL PROTECTED]>

Index: drivers/infiniband/ulp/sdp/sdp_send.c
===================================================================
--- drivers/infiniband/ulp/sdp/sdp_send.c       (revision 2096)
+++ drivers/infiniband/ulp/sdp/sdp_send.c       (working copy)
@@ -641,6 +641,7 @@ static int sdp_send_data_iocb_src(struct
        SDP_BUFF_F_CLR_UNSIG(buff);
 
        if (conn->send_mode == SDP_MODE_COMB) {
+               unsigned long flags;
                void *addr;
                int   pos;
                int   off;
@@ -662,21 +663,22 @@ static int sdp_send_data_iocb_src(struct
                        result = -EFAULT;
                        goto error;
                }
-               /*
-                * map, copy, unmap.
-                */
-               addr = sdp_kmap(iocb->page_array[pos]);
+
+               local_irq_save(flags);
+               
+               addr = kmap_atomic(iocb->page_array[pos], KM_IRQ0);
                if (!addr) {
                        result = -ENOMEM;
+                       local_irq_restore(flags);
                        goto error;
                }
 
                memcpy(buff->tail, (addr + off), len);
 
-               sdp_kunmap(iocb->page_array[pos]);
-               /*
-                * update pointers
-                */
+               kunmap_atomic(iocb->page_array[pos], KM_IRQ0);
+
+               local_irq_restore(flags);
+
                buff->data_size  = len;
                buff->tail      += len;
 
@@ -731,14 +733,16 @@ static int sdp_send_iocb_buff_write(stru
        counter = (iocb->post + iocb->page_offset) >> PAGE_SHIFT;
        offset  = (iocb->post + iocb->page_offset) & (~PAGE_MASK);
 
-       while (buff->tail < buff->end &&
-              iocb->len > 0) {
-               /*
-                * map correct page of iocb
-                */
-               addr = sdp_kmap(iocb->page_array[counter]);
-               if (!addr)
+
+       while (buff->tail < buff->end && iocb->len > 0) {
+               unsigned long flags;
+               local_irq_save(flags);
+
+               addr = kmap_atomic(iocb->page_array[counter], KM_IRQ0);
+               if (!addr) {
+                       local_irq_restore(flags);
                        break;
+               }
                
                copy = min((PAGE_SIZE - offset),
                           (unsigned long)(buff->end - buff->tail));
@@ -755,7 +759,8 @@ static int sdp_send_iocb_buff_write(stru
                offset += copy;
                offset &= (~PAGE_MASK);
 
-               sdp_kunmap(iocb->page_array[counter++]);
+               kunmap_atomic(iocb->page_array[counter++], KM_IRQ0);
+               local_irq_restore(flags);
        }
 
        return 0;
Index: drivers/infiniband/ulp/sdp/sdp_recv.c
===================================================================
--- drivers/infiniband/ulp/sdp/sdp_recv.c       (revision 2096)
+++ drivers/infiniband/ulp/sdp/sdp_recv.c       (working copy)
@@ -659,12 +659,11 @@ static int sdp_read_buff_iocb(struct sdp
        counter = (iocb->post + iocb->page_offset) >> PAGE_SHIFT;
        offset  = (iocb->post + iocb->page_offset) & (~PAGE_MASK);
 
-       while (buff->data < buff->tail &&
-              iocb->len > 0) {
-               /*
-                * map correct page of iocb
-                */
-               addr = sdp_kmap(iocb->page_array[counter]);
+       while (buff->data < buff->tail && iocb->len > 0) {
+               unsigned long flags;
+               local_irq_save(flags);
+
+               addr = kmap_atomic(iocb->page_array[counter], KM_IRQ0);
                if (!addr)
                        break;
 
@@ -682,7 +681,9 @@ static int sdp_read_buff_iocb(struct sdp
                offset     += copy;
                offset     &= (~PAGE_MASK);
                
-               sdp_kunmap(iocb->page_array[counter++]);
+               kunmap_atomic(iocb->page_array[counter++], KM_IRQ0);
+
+               local_irq_restore(flags);
        }
        /*
         * restore tail from OOB offset.
Index: drivers/infiniband/ulp/sdp/sdp_iocb.h
===================================================================
--- drivers/infiniband/ulp/sdp/sdp_iocb.h       (revision 2096)
+++ drivers/infiniband/ulp/sdp/sdp_iocb.h       (working copy)
@@ -124,30 +124,4 @@ struct sdpc_iocb_q {
        int size;               /* current number of IOCBs in table */
 };
 
-/*
- * Address translations
- */
-
-/*
- * sdp_kmap - map a page into kernel space
- */
-static inline void *sdp_kmap(struct page *page)
-{
-       if (in_atomic() || irqs_disabled())
-               return kmap_atomic(page, KM_IRQ0);
-       else
-               return kmap(page);
-}
-
-/*
- * sdp_kunmap - unmap a page into kernel space
- */
-static inline void sdp_kunmap(struct page *page)
-{
-       if (in_atomic() || irqs_disabled())
-               kunmap_atomic(page, KM_IRQ0);
-       else
-               kunmap(page);
-}
-
 #endif /* _SDP_IOCB_H */

-- 
MST - Michael S. Tsirkin
_______________________________________________
openib-general mailing list
[email protected]
http://openib.org/mailman/listinfo/openib-general

To unsubscribe, please visit http://openib.org/mailman/listinfo/openib-general

Reply via email to