git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
vmscan: fix it to take care of nodemask
[safe/jmp/linux-2.6]
/
mm
/
bounce.c
diff --git
a/mm/bounce.c
b/mm/bounce.c
index
179fe38
..
e590272
100644
(file)
--- a/
mm/bounce.c
+++ b/
mm/bounce.c
@@
-14,6
+14,7
@@
#include <linux/hash.h>
#include <linux/highmem.h>
#include <linux/blktrace_api.h>
#include <linux/hash.h>
#include <linux/highmem.h>
#include <linux/blktrace_api.h>
+#include <trace/block.h>
#include <asm/tlbflush.h>
#define POOL_SIZE 64
#include <asm/tlbflush.h>
#define POOL_SIZE 64
@@
-21,6
+22,8
@@
static mempool_t *page_pool, *isa_page_pool;
static mempool_t *page_pool, *isa_page_pool;
+DEFINE_TRACE(block_bio_bounce);
+
#ifdef CONFIG_HIGHMEM
static __init int init_emergency_pool(void)
{
#ifdef CONFIG_HIGHMEM
static __init int init_emergency_pool(void)
{
@@
-140,26
+143,19
@@
static void bounce_end_io(struct bio *bio, mempool_t *pool, int err)
mempool_free(bvec->bv_page, pool);
}
mempool_free(bvec->bv_page, pool);
}
- bio_endio(bio_orig,
bio_orig->bi_size,
err);
+ bio_endio(bio_orig, err);
bio_put(bio);
}
bio_put(bio);
}
-static
int bounce_end_io_write(struct bio *bio, unsigned int bytes_done
, int err)
+static
void bounce_end_io_write(struct bio *bio
, int err)
{
{
- if (bio->bi_size)
- return 1;
-
bounce_end_io(bio, page_pool, err);
bounce_end_io(bio, page_pool, err);
- return 0;
}
}
-static
int bounce_end_io_write_isa(struct bio *bio, unsigned int bytes_done
, int err)
+static
void bounce_end_io_write_isa(struct bio *bio
, int err)
{
{
- if (bio->bi_size)
- return 1;
bounce_end_io(bio, isa_page_pool, err);
bounce_end_io(bio, isa_page_pool, err);
- return 0;
}
static void __bounce_end_io_read(struct bio *bio, mempool_t *pool, int err)
}
static void __bounce_end_io_read(struct bio *bio, mempool_t *pool, int err)
@@
-172,22
+168,14
@@
static void __bounce_end_io_read(struct bio *bio, mempool_t *pool, int err)
bounce_end_io(bio, pool, err);
}
bounce_end_io(bio, pool, err);
}
-static
int bounce_end_io_read(struct bio *bio, unsigned int bytes_done
, int err)
+static
void bounce_end_io_read(struct bio *bio
, int err)
{
{
- if (bio->bi_size)
- return 1;
-
__bounce_end_io_read(bio, page_pool, err);
__bounce_end_io_read(bio, page_pool, err);
- return 0;
}
}
-static
int bounce_end_io_read_isa(struct bio *bio, unsigned int bytes_done
, int err)
+static
void bounce_end_io_read_isa(struct bio *bio
, int err)
{
{
- if (bio->bi_size)
- return 1;
-
__bounce_end_io_read(bio, isa_page_pool, err);
__bounce_end_io_read(bio, isa_page_pool, err);
- return 0;
}
static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
}
static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
@@
-210,8
+198,13
@@
static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
/*
* irk, bounce it
*/
/*
* irk, bounce it
*/
- if (!bio)
- bio = bio_alloc(GFP_NOIO, (*bio_orig)->bi_vcnt);
+ if (!bio) {
+ unsigned int cnt = (*bio_orig)->bi_vcnt;
+
+ bio = bio_alloc(GFP_NOIO, cnt);
+ memset(bio->bi_io_vec, 0, cnt * sizeof(struct bio_vec));
+ }
+
to = bio->bi_io_vec + i;
to = bio->bi_io_vec + i;
@@
-237,7
+230,7
@@
static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig,
if (!bio)
return;
if (!bio)
return;
-
blk_add_trace_bio(q, *bio_orig, BLK_TA_BOUNCE
);
+
trace_block_bio_bounce(q, *bio_orig
);
/*
* at least one page was bounced, fill in possible non-highmem
/*
* at least one page was bounced, fill in possible non-highmem
@@
-280,6
+273,12
@@
void blk_queue_bounce(struct request_queue *q, struct bio **bio_orig)
mempool_t *pool;
/*
mempool_t *pool;
/*
+ * Data-less bio, nothing to bounce
+ */
+ if (!bio_has_data(*bio_orig))
+ return;
+
+ /*
* for non-isa bounce case, just check if the bounce pfn is equal
* to or bigger than the highest pfn in the system -- in that case,
* don't waste time iterating over bio segments
* for non-isa bounce case, just check if the bounce pfn is equal
* to or bigger than the highest pfn in the system -- in that case,
* don't waste time iterating over bio segments