vmalloc.c (913272b3864d6da89c70d9fc2c30ccb57794b369) | vmalloc.c (db1aecafef58b5dda39c4228debe2c845e4a27ab) |
---|---|
1/* 2 * linux/mm/vmalloc.c 3 * 4 * Copyright (C) 1993 Linus Torvalds 5 * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 6 * SMP-safe vmalloc/vfree/ioremap, Tigran Aivazian <tigran@veritas.com>, May 2000 7 * Major rework to support vmap/vunmap, Christoph Hellwig, SGI, August 2002 8 * Numa awareness, Christoph Lameter, SGI, June 2005 --- 242 unchanged lines hidden (view full) --- 251 252struct vmap_area { 253 unsigned long va_start; 254 unsigned long va_end; 255 unsigned long flags; 256 struct rb_node rb_node; /* address sorted rbtree */ 257 struct list_head list; /* address sorted list */ 258 struct list_head purge_list; /* "lazy purge" list */ | 1/* 2 * linux/mm/vmalloc.c 3 * 4 * Copyright (C) 1993 Linus Torvalds 5 * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999 6 * SMP-safe vmalloc/vfree/ioremap, Tigran Aivazian <tigran@veritas.com>, May 2000 7 * Major rework to support vmap/vunmap, Christoph Hellwig, SGI, August 2002 8 * Numa awareness, Christoph Lameter, SGI, June 2005 --- 242 unchanged lines hidden (view full) --- 251 252struct vmap_area { 253 unsigned long va_start; 254 unsigned long va_end; 255 unsigned long flags; 256 struct rb_node rb_node; /* address sorted rbtree */ 257 struct list_head list; /* address sorted list */ 258 struct list_head purge_list; /* "lazy purge" list */ |
259 void *private; | 259 struct vm_struct *vm; |
260 struct rcu_head rcu_head; 261}; 262 263static DEFINE_SPINLOCK(vmap_area_lock); 264static LIST_HEAD(vmap_area_list); 265static struct rb_root vmap_area_root = RB_ROOT; 266 267/* The vmap cache globals are protected by vmap_area_lock */ --- 845 unchanged lines hidden (view full) --- 1113 vm_unmap_ram(mem, count); 1114 return NULL; 1115 } 1116 return mem; 1117} 1118EXPORT_SYMBOL(vm_map_ram); 1119 1120/** | 260 struct rcu_head rcu_head; 261}; 262 263static DEFINE_SPINLOCK(vmap_area_lock); 264static LIST_HEAD(vmap_area_list); 265static struct rb_root vmap_area_root = RB_ROOT; 266 267/* The vmap cache globals are protected by vmap_area_lock */ --- 845 unchanged lines hidden (view full) --- 1113 vm_unmap_ram(mem, count); 1114 return NULL; 1115 } 1116 return mem; 1117} 1118EXPORT_SYMBOL(vm_map_ram); 1119 1120/** |
1121 * vm_area_add_early - add vmap area early during boot 1122 * @vm: vm_struct to add 1123 * 1124 * This function is used to add fixed kernel vm area to vmlist before 1125 * vmalloc_init() is called. @vm->addr, @vm->size, and @vm->flags 1126 * should contain proper values and the other fields should be zero. 1127 * 1128 * DO NOT USE THIS FUNCTION UNLESS YOU KNOW WHAT YOU'RE DOING. 1129 */ 1130void __init vm_area_add_early(struct vm_struct *vm) 1131{ 1132 struct vm_struct *tmp, **p; 1133 1134 BUG_ON(vmap_initialized); 1135 for (p = &vmlist; (tmp = *p) != NULL; p = &tmp->next) { 1136 if (tmp->addr >= vm->addr) { 1137 BUG_ON(tmp->addr < vm->addr + vm->size); 1138 break; 1139 } else 1140 BUG_ON(tmp->addr + tmp->size > vm->addr); 1141 } 1142 vm->next = *p; 1143 *p = vm; 1144} 1145 1146/** |
|
1121 * vm_area_register_early - register vmap area early during boot 1122 * @vm: vm_struct to register 1123 * @align: requested alignment 1124 * 1125 * This function is used to register kernel vm area before 1126 * vmalloc_init() is called. @vm->size and @vm->flags should contain 1127 * proper values on entry and other fields should be zero. On return, 1128 * vm->addr contains the allocated address. --- 5 unchanged lines hidden (view full) --- 1134 static size_t vm_init_off __initdata; 1135 unsigned long addr; 1136 1137 addr = ALIGN(VMALLOC_START + vm_init_off, align); 1138 vm_init_off = PFN_ALIGN(addr + vm->size) - VMALLOC_START; 1139 1140 vm->addr = (void *)addr; 1141 | 1147 * vm_area_register_early - register vmap area early during boot 1148 * @vm: vm_struct to register 1149 * @align: requested alignment 1150 * 1151 * This function is used to register kernel vm area before 1152 * vmalloc_init() is called. @vm->size and @vm->flags should contain 1153 * proper values on entry and other fields should be zero. On return, 1154 * vm->addr contains the allocated address. --- 5 unchanged lines hidden (view full) --- 1160 static size_t vm_init_off __initdata; 1161 unsigned long addr; 1162 1163 addr = ALIGN(VMALLOC_START + vm_init_off, align); 1164 vm_init_off = PFN_ALIGN(addr + vm->size) - VMALLOC_START; 1165 1166 vm->addr = (void *)addr; 1167 |
1142 vm->next = vmlist; 1143 vmlist = vm; | 1168 vm_area_add_early(vm); |
1144} 1145 1146void __init vmalloc_init(void) 1147{ 1148 struct vmap_area *va; 1149 struct vm_struct *tmp; 1150 int i; 1151 --- 103 unchanged lines hidden (view full) --- 1255 1256static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, 1257 unsigned long flags, void *caller) 1258{ 1259 vm->flags = flags; 1260 vm->addr = (void *)va->va_start; 1261 vm->size = va->va_end - va->va_start; 1262 vm->caller = caller; | 1169} 1170 1171void __init vmalloc_init(void) 1172{ 1173 struct vmap_area *va; 1174 struct vm_struct *tmp; 1175 int i; 1176 --- 103 unchanged lines hidden (view full) --- 1280 1281static void setup_vmalloc_vm(struct vm_struct *vm, struct vmap_area *va, 1282 unsigned long flags, void *caller) 1283{ 1284 vm->flags = flags; 1285 vm->addr = (void *)va->va_start; 1286 vm->size = va->va_end - va->va_start; 1287 vm->caller = caller; |
1263 va->private = vm; | 1288 va->vm = vm; |
1264 va->flags |= VM_VM_AREA; 1265} 1266 1267static void insert_vmalloc_vmlist(struct vm_struct *vm) 1268{ 1269 struct vm_struct *tmp, **p; 1270 1271 vm->flags &= ~VM_UNLIST; --- 13 unchanged lines hidden (view full) --- 1285 setup_vmalloc_vm(vm, va, flags, caller); 1286 insert_vmalloc_vmlist(vm); 1287} 1288 1289static struct vm_struct *__get_vm_area_node(unsigned long size, 1290 unsigned long align, unsigned long flags, unsigned long start, 1291 unsigned long end, int node, gfp_t gfp_mask, void *caller) 1292{ | 1289 va->flags |= VM_VM_AREA; 1290} 1291 1292static void insert_vmalloc_vmlist(struct vm_struct *vm) 1293{ 1294 struct vm_struct *tmp, **p; 1295 1296 vm->flags &= ~VM_UNLIST; --- 13 unchanged lines hidden (view full) --- 1310 setup_vmalloc_vm(vm, va, flags, caller); 1311 insert_vmalloc_vmlist(vm); 1312} 1313 1314static struct vm_struct *__get_vm_area_node(unsigned long size, 1315 unsigned long align, unsigned long flags, unsigned long start, 1316 unsigned long end, int node, gfp_t gfp_mask, void *caller) 1317{ |
1293 static struct vmap_area *va; | 1318 struct vmap_area *va; |
1294 struct vm_struct *area; 1295 1296 BUG_ON(in_interrupt()); 1297 if (flags & VM_IOREMAP) { 1298 int bit = fls(size); 1299 1300 if (bit > IOREMAP_MAX_ORDER) 1301 bit = IOREMAP_MAX_ORDER; --- 76 unchanged lines hidden (view full) --- 1378} 1379 1380static struct vm_struct *find_vm_area(const void *addr) 1381{ 1382 struct vmap_area *va; 1383 1384 va = find_vmap_area((unsigned long)addr); 1385 if (va && va->flags & VM_VM_AREA) | 1319 struct vm_struct *area; 1320 1321 BUG_ON(in_interrupt()); 1322 if (flags & VM_IOREMAP) { 1323 int bit = fls(size); 1324 1325 if (bit > IOREMAP_MAX_ORDER) 1326 bit = IOREMAP_MAX_ORDER; --- 76 unchanged lines hidden (view full) --- 1403} 1404 1405static struct vm_struct *find_vm_area(const void *addr) 1406{ 1407 struct vmap_area *va; 1408 1409 va = find_vmap_area((unsigned long)addr); 1410 if (va && va->flags & VM_VM_AREA) |
1386 return va->private; | 1411 return va->vm; |
1387 1388 return NULL; 1389} 1390 1391/** 1392 * remove_vm_area - find and remove a continuous kernel virtual area 1393 * @addr: base address 1394 * 1395 * Search for the kernel VM area starting at @addr, and remove it. 1396 * This function returns the found VM area, but using it is NOT safe 1397 * on SMP machines, except for its size or flags. 1398 */ 1399struct vm_struct *remove_vm_area(const void *addr) 1400{ 1401 struct vmap_area *va; 1402 1403 va = find_vmap_area((unsigned long)addr); 1404 if (va && va->flags & VM_VM_AREA) { | 1412 1413 return NULL; 1414} 1415 1416/** 1417 * remove_vm_area - find and remove a continuous kernel virtual area 1418 * @addr: base address 1419 * 1420 * Search for the kernel VM area starting at @addr, and remove it. 1421 * This function returns the found VM area, but using it is NOT safe 1422 * on SMP machines, except for its size or flags. 1423 */ 1424struct vm_struct *remove_vm_area(const void *addr) 1425{ 1426 struct vmap_area *va; 1427 1428 va = find_vmap_area((unsigned long)addr); 1429 if (va && va->flags & VM_VM_AREA) { |
1405 struct vm_struct *vm = va->private; | 1430 struct vm_struct *vm = va->vm; |
1406 1407 if (!(vm->flags & VM_UNLIST)) { 1408 struct vm_struct *tmp, **p; 1409 /* 1410 * remove from list and disallow access to 1411 * this vm_struct before unmap. (address range 1412 * confliction is maintained by vmap.) 1413 */ --- 214 unchanged lines hidden (view full) --- 1628 goto fail; 1629 1630 area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST, 1631 start, end, node, gfp_mask, caller); 1632 if (!area) 1633 goto fail; 1634 1635 addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller); | 1431 1432 if (!(vm->flags & VM_UNLIST)) { 1433 struct vm_struct *tmp, **p; 1434 /* 1435 * remove from list and disallow access to 1436 * this vm_struct before unmap. (address range 1437 * confliction is maintained by vmap.) 1438 */ --- 214 unchanged lines hidden (view full) --- 1653 goto fail; 1654 1655 area = __get_vm_area_node(size, align, VM_ALLOC | VM_UNLIST, 1656 start, end, node, gfp_mask, caller); 1657 if (!area) 1658 goto fail; 1659 1660 addr = __vmalloc_area_node(area, gfp_mask, prot, node, caller); |
1661 if (!addr) 1662 return NULL; |
|
1636 1637 /* 1638 * In this function, newly allocated vm_struct is not added 1639 * to vmlist at __get_vm_area_node(). so, it is added here. 1640 */ 1641 insert_vmalloc_vmlist(area); 1642 1643 /* --- 965 unchanged lines hidden --- | 1663 1664 /* 1665 * In this function, newly allocated vm_struct is not added 1666 * to vmlist at __get_vm_area_node(). so, it is added here. 1667 */ 1668 insert_vmalloc_vmlist(area); 1669 1670 /* --- 965 unchanged lines hidden --- |