Whamcloud - gitweb
Landing b_hd_newconfig on HEAD
[fs/lustre-release.git] / lnet / include / libcfs / darwin / darwin-mem.h
index 922a1b8..5ffcd4e 100644 (file)
 #include <libcfs/list.h>
 
 /*
- * Page of OSX
- *
- * There is no page in OSX, however, we need page in lustre.
- */
-#define PAGE_MASK                              (~(PAGE_SIZE-1))
-#define _ALIGN_UP(addr,size)                   (((addr)+((size)-1))&(~((size)-1)))
-#define _ALIGN(addr,size)                      _ALIGN_UP(addr,size)
-#define PAGE_ALIGN(addr)                       _ALIGN(addr, PAGE_SIZE)
-
-/*
  * Basic xnu_page struct, should be binary compatibility with
  * all page types in xnu (we have only xnu_raw_page, xll_page now)
  */
 
 /* Variable sized pages are not supported */
 
+#ifdef PAGE_SHIFT
+#define CFS_PAGE_SHIFT PAGE_SHIFT
+#else
 #define CFS_PAGE_SHIFT 12
-#define CFS_PAGE_SIZE  (1 << CFS_PAGE_SHIFT)
-#define PAGE_CACHE_SIZE CFS_PAGE_SIZE
-#define CFS_PAGE_MASK  (~(CFS_PAGE_SIZE - 1))
+#endif
+
+#define CFS_PAGE_SIZE  (1UL << CFS_PAGE_SHIFT)
+
+#define CFS_PAGE_MASK  (~((__u64)CFS_PAGE_SIZE - 1))
 
 enum {
        XNU_PAGE_RAW,
@@ -98,20 +93,16 @@ void xnu_page_ops_unregister(int type);
  * raw page, no cache object, just like buffer
  */
 struct xnu_raw_page {
-       struct xnu_page header;
-       vm_address_t    virtual;
-       upl_t           upl;
-       int             order;
-       atomic_t        count;
-       void           *private;
+       struct xnu_page  header;
+       void            *virtual;
+       atomic_t         count;
+       struct list_head link;
 };
 
 /*
  * Public interface to lustre
  *
- * - cfs_alloc_pages(f, o)
  * - cfs_alloc_page(f)
- * - cfs_free_pages(p, o)
  * - cfs_free_page(p)
  * - cfs_kmap(p)
  * - cfs_kunmap(p)
@@ -124,14 +115,12 @@ struct xnu_raw_page {
  * pages only.
  */
 
-cfs_page_t *cfs_alloc_pages(u_int32_t flags, u_int32_t order);
 cfs_page_t *cfs_alloc_page(u_int32_t flags);
-void cfs_free_pages(cfs_page_t *pages, int order);
 void cfs_free_page(cfs_page_t *page);
 void cfs_get_page(cfs_page_t *page);
 int cfs_put_page_testzero(cfs_page_t *page);
 int cfs_page_count(cfs_page_t *page);
-void cfs_set_page_count(cfs_page_t *page, int v);
+#define cfs_page_index(pg)     (0)
 
 void *cfs_page_address(cfs_page_t *pg);
 void *cfs_kmap(cfs_page_t *pg);
@@ -141,48 +130,84 @@ void cfs_kunmap(cfs_page_t *pg);
  * Memory allocator
  */
 
-extern void *cfs_alloc(size_t nr_bytes, u_int32_t flags);
-extern void  cfs_free(void *addr);
+void *cfs_alloc(size_t nr_bytes, u_int32_t flags);
+void  cfs_free(void *addr);
+
+void *cfs_alloc_large(size_t nr_bytes);
+void  cfs_free_large(void *addr);
 
-extern void *cfs_alloc_large(size_t nr_bytes);
-extern void  cfs_free_large(void *addr);
+extern int get_preemption_level(void);
+
+#define CFS_ALLOC_ATOMIC_TRY                                    \
+       (get_preemption_level() != 0 ? CFS_ALLOC_ATOMIC : 0)
 
 /*
  * Slab:
  *
- * No slab in OSX, use zone allocator to fake slab
+ * No slab in OSX, use zone allocator to simulate slab
  */
 #define SLAB_HWCACHE_ALIGN             0
 
+#ifdef __DARWIN8__
+/* 
+ * In Darwin8, we cannot use zalloc_noblock(not exported by kernel),
+ * also, direct using of zone allocator is not recommended.
+ */
+#define CFS_INDIVIDUAL_ZONE     (0)
+
+#if !CFS_INDIVIDUAL_ZONE
+#include <libkern/OSMalloc.h>
+typedef        OSMallocTag     mem_cache_t;
+#else
+typedef                void*           zone_t;
+typedef                zone_t          mem_cache_t;
+#endif
+
+#else /* !__DARWIN8__ */
+
+#define CFS_INDIVIDUAL_ZONE     (1)
+
+typedef        zone_t          mem_cache_t;
+
+#endif /* !__DARWIN8__ */
+
+#define MC_NAME_MAX_LEN                64
+
 typedef struct cfs_mem_cache {
-       struct list_head        link;
-       zone_t                  zone;
-       int                     size;
-       char                    name [ZONE_NAME_MAX_LEN];
+       int                     mc_size;
+       mem_cache_t             mc_cache;
+       struct list_head        mc_link;
+       char                    mc_name [MC_NAME_MAX_LEN];
 } cfs_mem_cache_t;
 
 #define KMEM_CACHE_MAX_COUNT   64
 #define KMEM_MAX_ZONE          8192
 
-extern cfs_mem_cache_t * cfs_mem_cache_create (const char *, size_t, size_t, unsigned long,
-                                              void (*)(void *, cfs_mem_cache_t *, unsigned long),
-                                              void (*)(void *, cfs_mem_cache_t *, unsigned long));
-extern int cfs_mem_cache_destroy ( cfs_mem_cache_t * );
-extern void *cfs_mem_cache_alloc ( cfs_mem_cache_t *, int);
-extern void cfs_mem_cache_free ( cfs_mem_cache_t *, void *);
+cfs_mem_cache_t * cfs_mem_cache_create (const char *, size_t, size_t, unsigned long);
+int cfs_mem_cache_destroy ( cfs_mem_cache_t * );
+void *cfs_mem_cache_alloc ( cfs_mem_cache_t *, int);
+void cfs_mem_cache_free ( cfs_mem_cache_t *, void *);
 
 /*
  * Misc
  */
-/* XXX fix me */
+/* XXX Liang: num_physpages... fix me */
 #define num_physpages                  (64 * 1024)
 
 #define CFS_DECL_MMSPACE               
 #define CFS_MMSPACE_OPEN               do {} while(0)
 #define CFS_MMSPACE_CLOSE              do {} while(0)
 
-#define copy_from_user(kaddr, uaddr, size)     copyin((caddr_t)uaddr, (caddr_t)kaddr, size)
-#define copy_to_user(uaddr, kaddr, size)       copyout((caddr_t)kaddr, (caddr_t)uaddr, size)
+#define copy_from_user(kaddr, uaddr, size)     copyin(CAST_USER_ADDR_T(uaddr), (caddr_t)kaddr, size)
+#define copy_to_user(uaddr, kaddr, size)       copyout((caddr_t)kaddr, CAST_USER_ADDR_T(uaddr), size)
+
+#if 0
+static inline int strncpy_from_user(char *kaddr, char *uaddr, int size)
+{
+       size_t count;
+       return copyinstr((const user_addr_t)uaddr, (void *)kaddr, size, &count);
+}
+#endif
 
 #if defined (__ppc__)
 #define mb()  __asm__ __volatile__ ("sync" : : : "memory")
@@ -198,9 +223,10 @@ extern void cfs_mem_cache_free ( cfs_mem_cache_t *, void *);
 
 #else  /* !__KERNEL__ */
 
-typedef struct cfs_page{
-       void    *foo;
-} cfs_page_t;
+#define CFS_CACHE_SHIFT 12
+#define PAGE_CACHE_SIZE (1 << CFS_CACHE_SHIFT)
+#include <libcfs/user-prim.h>
+
 #endif /* __KERNEL__ */
 
 #endif /* __XNU_CFS_MEM_H__ */