diff options
| author | Paul Mackerras <paulus@samba.org> | 2008-05-09 06:12:06 -0400 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2008-05-09 06:12:06 -0400 |
| commit | 2a5f2e3e6cd1ce9fb3f8b186b6bc9aa1f1497a92 (patch) | |
| tree | b2306840f227972a7c9d4a2b75e516fe81358ce8 /kernel/relay.c | |
| parent | 02539d71fa98d5737bb668b02286c76241e4bac9 (diff) | |
| parent | 78be76476a34a77f0ea9db2f78ba46a2b0fd5ab5 (diff) | |
Merge branch 'for-2.6.26' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer/powerpc-4xx into merge
Diffstat (limited to 'kernel/relay.c')
| -rw-r--r-- | kernel/relay.c | 37 |
1 files changed, 33 insertions, 4 deletions
diff --git a/kernel/relay.c b/kernel/relay.c index d6204a485818..7de644cdec43 100644 --- a/kernel/relay.c +++ b/kernel/relay.c | |||
| @@ -65,6 +65,35 @@ static struct vm_operations_struct relay_file_mmap_ops = { | |||
| 65 | .close = relay_file_mmap_close, | 65 | .close = relay_file_mmap_close, |
| 66 | }; | 66 | }; |
| 67 | 67 | ||
| 68 | /* | ||
| 69 | * allocate an array of pointers of struct page | ||
| 70 | */ | ||
| 71 | static struct page **relay_alloc_page_array(unsigned int n_pages) | ||
| 72 | { | ||
| 73 | struct page **array; | ||
| 74 | size_t pa_size = n_pages * sizeof(struct page *); | ||
| 75 | |||
| 76 | if (pa_size > PAGE_SIZE) { | ||
| 77 | array = vmalloc(pa_size); | ||
| 78 | if (array) | ||
| 79 | memset(array, 0, pa_size); | ||
| 80 | } else { | ||
| 81 | array = kzalloc(pa_size, GFP_KERNEL); | ||
| 82 | } | ||
| 83 | return array; | ||
| 84 | } | ||
| 85 | |||
| 86 | /* | ||
| 87 | * free an array of pointers of struct page | ||
| 88 | */ | ||
| 89 | static void relay_free_page_array(struct page **array) | ||
| 90 | { | ||
| 91 | if (is_vmalloc_addr(array)) | ||
| 92 | vfree(array); | ||
| 93 | else | ||
| 94 | kfree(array); | ||
| 95 | } | ||
| 96 | |||
| 68 | /** | 97 | /** |
| 69 | * relay_mmap_buf: - mmap channel buffer to process address space | 98 | * relay_mmap_buf: - mmap channel buffer to process address space |
| 70 | * @buf: relay channel buffer | 99 | * @buf: relay channel buffer |
| @@ -109,7 +138,7 @@ static void *relay_alloc_buf(struct rchan_buf *buf, size_t *size) | |||
| 109 | *size = PAGE_ALIGN(*size); | 138 | *size = PAGE_ALIGN(*size); |
| 110 | n_pages = *size >> PAGE_SHIFT; | 139 | n_pages = *size >> PAGE_SHIFT; |
| 111 | 140 | ||
| 112 | buf->page_array = kcalloc(n_pages, sizeof(struct page *), GFP_KERNEL); | 141 | buf->page_array = relay_alloc_page_array(n_pages); |
| 113 | if (!buf->page_array) | 142 | if (!buf->page_array) |
| 114 | return NULL; | 143 | return NULL; |
| 115 | 144 | ||
| @@ -130,7 +159,7 @@ static void *relay_alloc_buf(struct rchan_buf *buf, size_t *size) | |||
| 130 | depopulate: | 159 | depopulate: |
| 131 | for (j = 0; j < i; j++) | 160 | for (j = 0; j < i; j++) |
| 132 | __free_page(buf->page_array[j]); | 161 | __free_page(buf->page_array[j]); |
| 133 | kfree(buf->page_array); | 162 | relay_free_page_array(buf->page_array); |
| 134 | return NULL; | 163 | return NULL; |
| 135 | } | 164 | } |
| 136 | 165 | ||
| @@ -189,7 +218,7 @@ static void relay_destroy_buf(struct rchan_buf *buf) | |||
| 189 | vunmap(buf->start); | 218 | vunmap(buf->start); |
| 190 | for (i = 0; i < buf->page_count; i++) | 219 | for (i = 0; i < buf->page_count; i++) |
| 191 | __free_page(buf->page_array[i]); | 220 | __free_page(buf->page_array[i]); |
| 192 | kfree(buf->page_array); | 221 | relay_free_page_array(buf->page_array); |
| 193 | } | 222 | } |
| 194 | chan->buf[buf->cpu] = NULL; | 223 | chan->buf[buf->cpu] = NULL; |
| 195 | kfree(buf->padding); | 224 | kfree(buf->padding); |
| @@ -1162,7 +1191,7 @@ static ssize_t relay_file_splice_read(struct file *in, | |||
| 1162 | ret = 0; | 1191 | ret = 0; |
| 1163 | spliced = 0; | 1192 | spliced = 0; |
| 1164 | 1193 | ||
| 1165 | while (len) { | 1194 | while (len && !spliced) { |
| 1166 | ret = subbuf_splice_actor(in, ppos, pipe, len, flags, &nonpad_ret); | 1195 | ret = subbuf_splice_actor(in, ppos, pipe, len, flags, &nonpad_ret); |
| 1167 | if (ret < 0) | 1196 | if (ret < 0) |
| 1168 | break; | 1197 | break; |
