summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_pipe.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-02-13 19:39:54 +0000
committeralc <alc@FreeBSD.org>2003-02-13 19:39:54 +0000
commitd3cfca777cfe7ba70a7f768f43da01965478cbaa (patch)
treea0e776497e3dccfc14114e72019e2483fb6b029c /sys/kern/sys_pipe.c
parent43e82f74f729c77a0250f5cd4bb20450b59f605b (diff)
downloadFreeBSD-src-d3cfca777cfe7ba70a7f768f43da01965478cbaa.zip
FreeBSD-src-d3cfca777cfe7ba70a7f768f43da01965478cbaa.tar.gz
Use atomic ops to update amountpipekva. Amountpipekva represents the
total kernel virtual address space used by all pipes. It is, thus, outside the scope of any individual pipe lock.
Diffstat (limited to 'sys/kern/sys_pipe.c')
-rw-r--r--sys/kern/sys_pipe.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/sys/kern/sys_pipe.c b/sys/kern/sys_pipe.c
index 937e909..7fbceb5 100644
--- a/sys/kern/sys_pipe.c
+++ b/sys/kern/sys_pipe.c
@@ -332,7 +332,7 @@ pipespace(cpipe, size)
cpipe->pipe_buffer.in = 0;
cpipe->pipe_buffer.out = 0;
cpipe->pipe_buffer.cnt = 0;
- amountpipekva += cpipe->pipe_buffer.size;
+ atomic_add_int(&amountpipekva, cpipe->pipe_buffer.size);
return (0);
}
@@ -676,7 +676,8 @@ pipe_build_write_buffer(wpipe, uio)
*/
wpipe->pipe_map.kva = kmem_alloc_pageable(kernel_map,
wpipe->pipe_buffer.size + PAGE_SIZE);
- amountpipekva += wpipe->pipe_buffer.size + PAGE_SIZE;
+ atomic_add_int(&amountpipekva,
+ wpipe->pipe_buffer.size + PAGE_SIZE);
}
pmap_qenter(wpipe->pipe_map.kva, wpipe->pipe_map.ms,
wpipe->pipe_map.npages);
@@ -714,7 +715,8 @@ pipe_destroy_write_buffer(wpipe)
wpipe->pipe_map.kva = 0;
kmem_free(kernel_map, kva,
wpipe->pipe_buffer.size + PAGE_SIZE);
- amountpipekva -= wpipe->pipe_buffer.size + PAGE_SIZE;
+ atomic_subtract_int(&amountpipekva,
+ wpipe->pipe_buffer.size + PAGE_SIZE);
}
}
vm_page_lock_queues();
@@ -1338,7 +1340,7 @@ pipe_free_kmem(cpipe)
if (cpipe->pipe_buffer.buffer != NULL) {
if (cpipe->pipe_buffer.size > PIPE_SIZE)
--nbigpipe;
- amountpipekva -= cpipe->pipe_buffer.size;
+ atomic_subtract_int(&amountpipekva, cpipe->pipe_buffer.size);
kmem_free(kernel_map,
(vm_offset_t)cpipe->pipe_buffer.buffer,
cpipe->pipe_buffer.size);
@@ -1346,7 +1348,8 @@ pipe_free_kmem(cpipe)
}
#ifndef PIPE_NODIRECT
if (cpipe->pipe_map.kva != 0) {
- amountpipekva -= cpipe->pipe_buffer.size + PAGE_SIZE;
+ atomic_subtract_int(&amountpipekva,
+ cpipe->pipe_buffer.size + PAGE_SIZE);
kmem_free(kernel_map,
cpipe->pipe_map.kva,
cpipe->pipe_buffer.size + PAGE_SIZE);
OpenPOWER on IntegriCloud