Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.15-rc2 118 lines 2.8 kB view raw
1/* 2 * Copyright (c) 2000-2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18#include <linux/sched.h> 19#include <linux/mm.h> 20#include <linux/vmalloc.h> 21#include <linux/highmem.h> 22#include <linux/swap.h> 23#include <linux/blkdev.h> 24#include "time.h" 25#include "kmem.h" 26 27#define MAX_VMALLOCS 6 28#define MAX_SLAB_SIZE 0x20000 29 30void * 31kmem_alloc(size_t size, unsigned int __nocast flags) 32{ 33 int retries = 0; 34 gfp_t lflags = kmem_flags_convert(flags); 35 void *ptr; 36 37 do { 38 if (size < MAX_SLAB_SIZE || retries > MAX_VMALLOCS) 39 ptr = kmalloc(size, lflags); 40 else 41 ptr = __vmalloc(size, lflags, PAGE_KERNEL); 42 if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) 43 return ptr; 44 if (!(++retries % 100)) 45 printk(KERN_ERR "XFS: possible memory allocation " 46 "deadlock in %s (mode:0x%x)\n", 47 __FUNCTION__, lflags); 48 blk_congestion_wait(WRITE, HZ/50); 49 } while (1); 50} 51 52void * 53kmem_zalloc(size_t size, unsigned int __nocast flags) 54{ 55 void *ptr; 56 57 ptr = kmem_alloc(size, flags); 58 if (ptr) 59 memset((char *)ptr, 0, (int)size); 60 return ptr; 61} 62 63void 64kmem_free(void *ptr, size_t size) 65{ 66 if (((unsigned long)ptr < VMALLOC_START) || 67 ((unsigned long)ptr >= VMALLOC_END)) { 68 kfree(ptr); 69 } else { 70 vfree(ptr); 71 } 72} 73 74void * 75kmem_realloc(void *ptr, size_t newsize, size_t oldsize, 76 unsigned int __nocast flags) 77{ 78 void *new; 79 80 new = kmem_alloc(newsize, flags); 81 if (ptr) { 82 if (new) 83 memcpy(new, ptr, 84 ((oldsize < newsize) ? oldsize : newsize)); 85 kmem_free(ptr, oldsize); 86 } 87 return new; 88} 89 90void * 91kmem_zone_alloc(kmem_zone_t *zone, unsigned int __nocast flags) 92{ 93 int retries = 0; 94 gfp_t lflags = kmem_flags_convert(flags); 95 void *ptr; 96 97 do { 98 ptr = kmem_cache_alloc(zone, lflags); 99 if (ptr || (flags & (KM_MAYFAIL|KM_NOSLEEP))) 100 return ptr; 101 if (!(++retries % 100)) 102 printk(KERN_ERR "XFS: possible memory allocation " 103 "deadlock in %s (mode:0x%x)\n", 104 __FUNCTION__, lflags); 105 blk_congestion_wait(WRITE, HZ/50); 106 } while (1); 107} 108 109void * 110kmem_zone_zalloc(kmem_zone_t *zone, unsigned int __nocast flags) 111{ 112 void *ptr; 113 114 ptr = kmem_zone_alloc(zone, flags); 115 if (ptr) 116 memset((char *)ptr, 0, kmem_cache_size(zone)); 117 return ptr; 118}