]> err.no Git - linux-2.6/blobdiff - drivers/infiniband/hw/ehca/ipz_pt_fn.h
ipsec: Fix deadlock in xfrm_state management.
[linux-2.6] / drivers / infiniband / hw / ehca / ipz_pt_fn.h
index 39a4f64aff41b91b2c62e7ed9f0a0c54ef65c8cc..a801274ea337ae08c0a463170bb0688a325d326a 100644 (file)
 #include "ehca_tools.h"
 #include "ehca_qes.h"
 
+struct ehca_pd;
+struct ipz_small_queue_page;
+
+extern struct kmem_cache *small_qp_cache;
+
 /* struct generic ehca page */
 struct ipz_page {
        u8 entries[EHCA_PAGESIZE];
 };
 
+#define IPZ_SPAGE_PER_KPAGE (PAGE_SIZE / 512)
+
+struct ipz_small_queue_page {
+       unsigned long page;
+       unsigned long bitmap[IPZ_SPAGE_PER_KPAGE / BITS_PER_LONG];
+       int fill;
+       void *mapped_addr;
+       u32 mmap_count;
+       struct list_head list;
+};
+
 /* struct generic queue in linux kernel virtual memory (kv) */
 struct ipz_queue {
        u64 current_q_offset;   /* current queue entry */
@@ -66,7 +82,8 @@ struct ipz_queue {
        u32 queue_length;       /* queue length allocated in bytes */
        u32 pagesize;
        u32 toggle_state;       /* toggle flag - per page */
-       u32 dummy3;             /* 64 bit alignment */
+       u32 offset; /* save offset within page for small_qp */
+       struct ipz_small_queue_page *small_page;
 };
 
 /*
@@ -188,9 +205,10 @@ struct ipz_qpt {
  * see ipz_qpt_ctor()
  * returns true if ok, false if out of memory
  */
-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);
+int ipz_queue_ctor(struct ehca_pd *pd, struct ipz_queue *queue,
+                  const u32 nr_of_pages, const u32 pagesize,
+                  const u32 qe_size, const u32 nr_of_sg,
+                  int is_small);
 
 /*
  * destructor for a ipz_queue_t
@@ -198,7 +216,7 @@ int ipz_queue_ctor(struct ipz_queue *queue, const u32 nr_of_pages,
  *  see ipz_queue_ctor()
  *  returns true if ok, false if queue was NULL-ptr of free failed
  */
-int ipz_queue_dtor(struct ipz_queue *queue);
+int ipz_queue_dtor(struct ehca_pd *pd, struct ipz_queue *queue);
 
 /*
  * constructor for a ipz_qpt_t,