aboutsummaryrefslogtreecommitdiffstats
path: root/include
diff options
context:
space:
mode:
authorJens Axboe <axboe@suse.de>2006-05-01 14:02:05 -0400
committerJens Axboe <axboe@suse.de>2006-05-01 14:02:05 -0400
commitf6762b7ad8edd6abc802542ce845d3bc8adcb92f (patch)
treec941aaf7295f8efecaf42aa86112649b9b6f23a9 /include
parente27dedd84c119e2f7af54fcde3293be5ad812103 (diff)
[PATCH] pipe: enable atomic copying of pipe data to/from user space
The pipe ->map() method uses kmap() to virtually map the pages, which is both slow and has known scalability issues on SMP. This patch enables atomic copying of pipe pages, by pre-faulting data and using kmap_atomic() instead. lmbench bw_pipe and lat_pipe measurements agree this is a Good Thing. Here are results from that on a UP machine with highmem (1.5GiB of RAM), running first a UP kernel, SMP kernel, and SMP kernel patched. Vanilla-UP: Pipe bandwidth: 1622.28 MB/sec Pipe bandwidth: 1610.59 MB/sec Pipe bandwidth: 1608.30 MB/sec Pipe latency: 7.3275 microseconds Pipe latency: 7.2995 microseconds Pipe latency: 7.3097 microseconds Vanilla-SMP: Pipe bandwidth: 1382.19 MB/sec Pipe bandwidth: 1317.27 MB/sec Pipe bandwidth: 1355.61 MB/sec Pipe latency: 9.6402 microseconds Pipe latency: 9.6696 microseconds Pipe latency: 9.6153 microseconds Patched-SMP: Pipe bandwidth: 1578.70 MB/sec Pipe bandwidth: 1579.95 MB/sec Pipe bandwidth: 1578.63 MB/sec Pipe latency: 9.1654 microseconds Pipe latency: 9.2266 microseconds Pipe latency: 9.1527 microseconds Signed-off-by: Jens Axboe <axboe@suse.de>
Diffstat (limited to 'include')
-rw-r--r--include/linux/pipe_fs_i.h11
1 files changed, 6 insertions, 5 deletions
diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
index b8aae1fc5185..4c054491e38e 100644
--- a/include/linux/pipe_fs_i.h
+++ b/include/linux/pipe_fs_i.h
@@ -5,7 +5,8 @@
5 5
6#define PIPE_BUFFERS (16) 6#define PIPE_BUFFERS (16)
7 7
8#define PIPE_BUF_FLAG_LRU 0x01 8#define PIPE_BUF_FLAG_LRU 0x01 /* page is on the LRU */
9#define PIPE_BUF_FLAG_ATOMIC 0x02 /* was atomically mapped */
9 10
10struct pipe_buffer { 11struct pipe_buffer {
11 struct page *page; 12 struct page *page;
@@ -28,8 +29,8 @@ struct pipe_buffer {
28 */ 29 */
29struct pipe_buf_operations { 30struct pipe_buf_operations {
30 int can_merge; 31 int can_merge;
31 void * (*map)(struct pipe_inode_info *, struct pipe_buffer *); 32 void * (*map)(struct pipe_inode_info *, struct pipe_buffer *, int);
32 void (*unmap)(struct pipe_inode_info *, struct pipe_buffer *); 33 void (*unmap)(struct pipe_inode_info *, struct pipe_buffer *, void *);
33 int (*pin)(struct pipe_inode_info *, struct pipe_buffer *); 34 int (*pin)(struct pipe_inode_info *, struct pipe_buffer *);
34 void (*release)(struct pipe_inode_info *, struct pipe_buffer *); 35 void (*release)(struct pipe_inode_info *, struct pipe_buffer *);
35 int (*steal)(struct pipe_inode_info *, struct pipe_buffer *); 36 int (*steal)(struct pipe_inode_info *, struct pipe_buffer *);
@@ -64,8 +65,8 @@ void free_pipe_info(struct inode * inode);
64void __free_pipe_info(struct pipe_inode_info *); 65void __free_pipe_info(struct pipe_inode_info *);
65 66
66/* Generic pipe buffer ops functions */ 67/* Generic pipe buffer ops functions */
67void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *); 68void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *, int);
68void generic_pipe_buf_unmap(struct pipe_inode_info *, struct pipe_buffer *); 69void generic_pipe_buf_unmap(struct pipe_inode_info *, struct pipe_buffer *, void *);
69void generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *); 70void generic_pipe_buf_get(struct pipe_inode_info *, struct pipe_buffer *);
70int generic_pipe_buf_pin(struct pipe_inode_info *, struct pipe_buffer *); 71int generic_pipe_buf_pin(struct pipe_inode_info *, struct pipe_buffer *);
71 72