00001 /* 00002 * \brief Memory subsystem 00003 * \author Thomas Friebel <tf13@os.inf.tu-dresden.de> 00004 * \author Christian Helmuth <ch12@os.inf.tu-dresden.de> 00005 * \date 2006-11-03 00006 */ 00007 00008 #ifndef _ddekit_memory_h 00009 #define _ddekit_memory_h 00010 00011 00012 /******************* 00013 ** Slab facility ** 00014 *******************/ 00015 00016 struct ddekit_slab; 00017 00018 /** 00019 * Store user pointer in slab cache 00020 * 00021 * \param slab pointer to slab cache 00022 * \param data user pointer 00023 */ 00024 void ddekit_slab_set_data(struct ddekit_slab * slab, void *data); 00025 00026 /** 00027 * Read user pointer from slab cache 00028 * 00029 * \param slab pointer to slab cache 00030 * 00031 * \return stored user pointer or 0 00032 */ 00033 void *ddekit_slab_get_data(struct ddekit_slab * slab); 00034 00035 /** 00036 * Allocate slab in slab cache 00037 * 00038 * \param slab pointer to slab cache 00039 * 00040 * \return pointer to allocated slab 00041 */ 00042 void *ddekit_slab_alloc(struct ddekit_slab * slab); 00043 00044 /** 00045 * Deallocate slab in slab cache 00046 * 00047 * \param slab pointer to slab cache 00048 * \param objp pointer to allocated slab 00049 */ 00050 void ddekit_slab_free(struct ddekit_slab * slab, void *objp); 00051 00052 /** 00053 * Setup page cache for all slabs 00054 * 00055 * \param pages maximal number of memory pages 00056 * 00057 * If 'pages' is too low, memory pages may be given back to the memory server 00058 * (dm_phys) and just to be allocated again later. This hits performance (but 00059 * saves memory). Increase 'pages' to avoid this thrashing-like effect. 00060 * 00061 * If the maximal number of unused pages is exceeded, subsequent deallocation 00062 * will be freed at the memory server. This page cache caches pages from all 00063 * slabs. 00064 */ 00065 void ddekit_slab_setup_page_cache(unsigned pages); 00066 00067 /** 00068 * Destroy slab cache 00069 * 00070 * \param slab pointer to slab cache structure 00071 */ 00072 void ddekit_slab_destroy(struct ddekit_slab * slab); 00073 00074 /** 00075 * Initialize slab cache 00076 * 00077 * \param size size of cache objects 00078 * \param contiguous make this slab use physically contiguous memory 00079 * 00080 * \return pointer to new slab cache or 0 on error 00081 */ 00082 struct ddekit_slab * ddekit_slab_init(unsigned size, int contiguous); 00083 00084 00085 /********************** 00086 ** Memory allocator ** 00087 **********************/ 00088 00089 /** 00090 * Allocate large memory block 00091 * 00092 * \param size block size 00093 * \return pointer to new memory block 00094 * 00095 * Allocations via this allocator may be slow (because memory servers are 00096 * involved) and should be used only for large (i.e., > page size) blocks. If 00097 * allocations/deallocations are relatively dynamic this may not be what you 00098 * want. 00099 * 00100 * Allocated blocks have valid virt->phys mappings and are physically 00101 * contiguous. 00102 */ 00103 void *ddekit_large_malloc(int size); 00104 00105 /** 00106 * Free large memory block 00107 * 00108 * \param p pointer to memory block 00109 */ 00110 void ddekit_large_free(void *p); 00111 00112 /** FIXME 00113 * contig_malloc() is the lowest-level allocator interface one could implement. 00114 * we should consider to provide vmalloc() too. */ 00115 void *ddekit_contig_malloc( 00116 unsigned long size, 00117 unsigned long low, unsigned long high, 00118 unsigned long alignment, unsigned long boundary 00119 ); 00120 00121 00122 /***************************** 00123 ** Simple memory allocator ** 00124 *****************************/ 00125 00126 /** 00127 * Allocate memory block via simple allocator 00128 * 00129 * \param size block size 00130 * \return pointer to new memory block 00131 * 00132 * The blocks allocated via this allocator CANNOT be used for DMA or other 00133 * device operations, i.e., there exists no virt->phys mapping. 00134 */ 00135 void *ddekit_simple_malloc(unsigned size); 00136 00137 /** 00138 * Free memory block via simple allocator 00139 * 00140 * \param p pointer to memory block 00141 */ 00142 void ddekit_simple_free(void *p); 00143 00144 #endif
1.5.6