Skip to content

Commit

Permalink
nommu: struct vm_region's vm_usage count need not be atomic
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
dhowells authored and torvalds committed Jan 16, 2010
1 parent ed5e589 commit 1e2ae59
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 8 deletions.
2 changes: 1 addition & 1 deletion include/linux/mm_types.h
Expand Up @@ -122,7 +122,7 @@ struct vm_region {
unsigned long vm_pgoff; /* the offset in vm_file corresponding to vm_start */
struct file *vm_file; /* the backing file or NULL */

atomic_t vm_usage; /* region usage count */
int vm_usage; /* region usage count (access under nommu_region_sem) */
bool vm_icache_flushed : 1; /* true if the icache has been flushed for
* this region */
};
Expand Down
14 changes: 7 additions & 7 deletions mm/nommu.c
Expand Up @@ -552,11 +552,11 @@ static void free_page_series(unsigned long from, unsigned long to)
static void __put_nommu_region(struct vm_region *region)
__releases(nommu_region_sem)
{
kenter("%p{%d}", region, atomic_read(&region->vm_usage));
kenter("%p{%d}", region, region->vm_usage);

BUG_ON(!nommu_region_tree.rb_node);

if (atomic_dec_and_test(&region->vm_usage)) {
if (--region->vm_usage == 0) {
if (region->vm_top > region->vm_start)
delete_nommu_region(region);
up_write(&nommu_region_sem);
Expand Down Expand Up @@ -1205,7 +1205,7 @@ unsigned long do_mmap_pgoff(struct file *file,
if (!vma)
goto error_getting_vma;

atomic_set(&region->vm_usage, 1);
region->vm_usage = 1;
region->vm_flags = vm_flags;
region->vm_pgoff = pgoff;

Expand Down Expand Up @@ -1272,7 +1272,7 @@ unsigned long do_mmap_pgoff(struct file *file,
}

/* we've found a region we can share */
atomic_inc(&pregion->vm_usage);
pregion->vm_usage++;
vma->vm_region = pregion;
start = pregion->vm_start;
start += (pgoff - pregion->vm_pgoff) << PAGE_SHIFT;
Expand All @@ -1289,7 +1289,7 @@ unsigned long do_mmap_pgoff(struct file *file,
vma->vm_region = NULL;
vma->vm_start = 0;
vma->vm_end = 0;
atomic_dec(&pregion->vm_usage);
pregion->vm_usage--;
pregion = NULL;
goto error_just_free;
}
Expand Down Expand Up @@ -1444,7 +1444,7 @@ int split_vma(struct mm_struct *mm, struct vm_area_struct *vma,
/* we're only permitted to split anonymous regions that have a single
* owner */
if (vma->vm_file ||
atomic_read(&vma->vm_region->vm_usage) != 1)
vma->vm_region->vm_usage != 1)
return -ENOMEM;

if (mm->map_count >= sysctl_max_map_count)
Expand Down Expand Up @@ -1518,7 +1518,7 @@ static int shrink_vma(struct mm_struct *mm,

/* cut the backing region down to size */
region = vma->vm_region;
BUG_ON(atomic_read(&region->vm_usage) != 1);
BUG_ON(region->vm_usage != 1);

down_write(&nommu_region_sem);
delete_nommu_region(region);
Expand Down

0 comments on commit 1e2ae59

Please sign in to comment.