nommu: struct vm_region's vm_usage count need not be atomic

The vm_usage count field in struct vm_region does not need to be atomic as
it's only even modified whilst nommu_region_sem is write locked.

Signed-off-by: David Howells <dhowells@redhat.com>
Acked-by: Al Viro <viro@zeniv.linux.org.uk>
Cc: Greg Ungerer <gerg@snapgear.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by David Howells and committed by Linus Torvalds 1e2ae599 ed5e5894

+8 -8
+1 -1
include/linux/mm_types.h
··· 122 122 unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */ 123 123 struct file *vm_file; /* the backing file or NULL */ 124 124 125 - atomic_t vm_usage; /* region usage count */ 125 + int vm_usage; /* region usage count (access under nommu_region_sem) */ 126 126 bool vm_icache_flushed : 1; /* true if the icache has been flushed for 127 127 * this region */ 128 128 };
+7 -7
mm/nommu.c
··· 552 552 static void __put_nommu_region(struct vm_region *region) 553 553 __releases(nommu_region_sem) 554 554 { 555 - kenter("%p{%d}", region, atomic_read(&region->vm_usage)); 555 + kenter("%p{%d}", region, region->vm_usage); 556 556 557 557 BUG_ON(!nommu_region_tree.rb_node); 558 558 559 - if (atomic_dec_and_test(&region->vm_usage)) { 559 + if (--region->vm_usage == 0) { 560 560 if (region->vm_top > region->vm_start) 561 561 delete_nommu_region(region); 562 562 up_write(&nommu_region_sem); ··· 1205 1205 if (!vma) 1206 1206 goto error_getting_vma; 1207 1207 1208 - atomic_set(&region->vm_usage, 1); 1208 + region->vm_usage = 1; 1209 1209 region->vm_flags = vm_flags; 1210 1210 region->vm_pgoff = pgoff; 1211 1211 ··· 1272 1272 } 1273 1273 1274 1274 /* we've found a region we can share */ 1275 - atomic_inc(&pregion->vm_usage); 1275 + pregion->vm_usage++; 1276 1276 vma->vm_region = pregion; 1277 1277 start = pregion->vm_start; 1278 1278 start += (pgoff - pregion->vm_pgoff) << PAGE_SHIFT; ··· 1289 1289 vma->vm_region = NULL; 1290 1290 vma->vm_start = 0; 1291 1291 vma->vm_end = 0; 1292 - atomic_dec(&pregion->vm_usage); 1292 + pregion->vm_usage--; 1293 1293 pregion = NULL; 1294 1294 goto error_just_free; 1295 1295 } ··· 1444 1444 /* we're only permitted to split anonymous regions that have a single 1445 1445 * owner */ 1446 1446 if (vma->vm_file || 1447 - atomic_read(&vma->vm_region->vm_usage) != 1) 1447 + vma->vm_region->vm_usage != 1) 1448 1448 return -ENOMEM; 1449 1449 1450 1450 if (mm->map_count >= sysctl_max_map_count) ··· 1518 1518 1519 1519 /* cut the backing region down to size */ 1520 1520 region = vma->vm_region; 1521 - BUG_ON(atomic_read(&region->vm_usage) != 1); 1521 + BUG_ON(region->vm_usage != 1); 1522 1522 1523 1523 down_write(&nommu_region_sem); 1524 1524 delete_nommu_region(region);