Commit a5ae4300 authored by Kent Overstreet's avatar Kent Overstreet

bcache: Zero less memory

Another minor performance optimization
Signed-off-by: default avatarKent Overstreet <kmo@daterainc.com>
parent d56d000a
...@@ -347,14 +347,6 @@ do { \ ...@@ -347,14 +347,6 @@ do { \
do_closure_init(_cl, parent, running); \ do_closure_init(_cl, parent, running); \
} while (0) } while (0)
/**
* __closure_init() - Initialize a closure, skipping the memset()
*
* May be used instead of closure_init() when memory has already been zeroed.
*/
#define __closure_init(cl, parent) \
closure_init_type(cl, parent, true)
/** /**
* closure_init() - Initialize a closure, setting the refcount to 1 * closure_init() - Initialize a closure, setting the refcount to 1
* @cl: closure to initialize * @cl: closure to initialize
...@@ -362,10 +354,7 @@ do { \ ...@@ -362,10 +354,7 @@ do { \
* lifetime; may be NULL. * lifetime; may be NULL.
*/ */
#define closure_init(cl, parent) \ #define closure_init(cl, parent) \
do { \ closure_init_type(cl, parent, true)
memset((cl), 0, sizeof(*(cl))); \
__closure_init(cl, parent); \
} while (0)
static inline void closure_init_stack(struct closure *cl) static inline void closure_init_stack(struct closure *cl)
{ {
......
...@@ -597,14 +597,12 @@ struct search { ...@@ -597,14 +597,12 @@ struct search {
/* Stack frame for bio_complete */ /* Stack frame for bio_complete */
struct closure cl; struct closure cl;
struct bcache_device *d;
struct bbio bio; struct bbio bio;
struct bio *orig_bio; struct bio *orig_bio;
struct bio *cache_miss; struct bio *cache_miss;
struct bcache_device *d;
unsigned insert_bio_sectors; unsigned insert_bio_sectors;
unsigned recoverable:1; unsigned recoverable:1;
unsigned write:1; unsigned write:1;
unsigned read_dirty_data:1; unsigned read_dirty_data:1;
...@@ -712,10 +710,13 @@ static void cache_lookup(struct closure *cl) ...@@ -712,10 +710,13 @@ static void cache_lookup(struct closure *cl)
{ {
struct search *s = container_of(cl, struct search, iop.cl); struct search *s = container_of(cl, struct search, iop.cl);
struct bio *bio = &s->bio.bio; struct bio *bio = &s->bio.bio;
int ret;
int ret = bch_btree_map_keys(&s->op, s->iop.c, bch_btree_op_init(&s->op, -1);
&KEY(s->iop.inode, bio->bi_iter.bi_sector, 0),
cache_lookup_fn, MAP_END_KEY); ret = bch_btree_map_keys(&s->op, s->iop.c,
&KEY(s->iop.inode, bio->bi_iter.bi_sector, 0),
cache_lookup_fn, MAP_END_KEY);
if (ret == -EAGAIN) if (ret == -EAGAIN)
continue_at(cl, cache_lookup, bcache_wq); continue_at(cl, cache_lookup, bcache_wq);
...@@ -756,12 +757,12 @@ static void bio_complete(struct search *s) ...@@ -756,12 +757,12 @@ static void bio_complete(struct search *s)
} }
} }
static void do_bio_hook(struct search *s) static void do_bio_hook(struct search *s, struct bio *orig_bio)
{ {
struct bio *bio = &s->bio.bio; struct bio *bio = &s->bio.bio;
bio_init(bio); bio_init(bio);
__bio_clone_fast(bio, s->orig_bio); __bio_clone_fast(bio, orig_bio);
bio->bi_end_io = request_endio; bio->bi_end_io = request_endio;
bio->bi_private = &s->cl; bio->bi_private = &s->cl;
...@@ -780,26 +781,32 @@ static void search_free(struct closure *cl) ...@@ -780,26 +781,32 @@ static void search_free(struct closure *cl)
mempool_free(s, s->d->c->search); mempool_free(s, s->d->c->search);
} }
static struct search *search_alloc(struct bio *bio, struct bcache_device *d) static inline struct search *search_alloc(struct bio *bio,
struct bcache_device *d)
{ {
struct search *s; struct search *s;
s = mempool_alloc(d->c->search, GFP_NOIO); s = mempool_alloc(d->c->search, GFP_NOIO);
memset(s, 0, offsetof(struct search, iop.insert_keys));
__closure_init(&s->cl, NULL); closure_init(&s->cl, NULL);
do_bio_hook(s, bio);
s->iop.inode = d->id;
s->iop.c = d->c;
s->d = d;
s->op.lock = -1;
s->iop.write_point = hash_long((unsigned long) current, 16);
s->orig_bio = bio; s->orig_bio = bio;
s->write = (bio->bi_rw & REQ_WRITE) != 0; s->cache_miss = NULL;
s->iop.flush_journal = (bio->bi_rw & (REQ_FLUSH|REQ_FUA)) != 0; s->d = d;
s->recoverable = 1; s->recoverable = 1;
s->write = (bio->bi_rw & REQ_WRITE) != 0;
s->read_dirty_data = 0;
s->start_time = jiffies; s->start_time = jiffies;
do_bio_hook(s);
s->iop.c = d->c;
s->iop.bio = NULL;
s->iop.inode = d->id;
s->iop.write_point = hash_long((unsigned long) current, 16);
s->iop.write_prio = 0;
s->iop.error = 0;
s->iop.flags = 0;
s->iop.flush_journal = (bio->bi_rw & (REQ_FLUSH|REQ_FUA)) != 0;
return s; return s;
} }
...@@ -845,7 +852,7 @@ static void cached_dev_read_error(struct closure *cl) ...@@ -845,7 +852,7 @@ static void cached_dev_read_error(struct closure *cl)
trace_bcache_read_retry(s->orig_bio); trace_bcache_read_retry(s->orig_bio);
s->iop.error = 0; s->iop.error = 0;
do_bio_hook(s); do_bio_hook(s, s->orig_bio);
/* XXX: invalidate cache */ /* XXX: invalidate cache */
......
...@@ -13,17 +13,22 @@ struct data_insert_op { ...@@ -13,17 +13,22 @@ struct data_insert_op {
uint16_t write_prio; uint16_t write_prio;
short error; short error;
unsigned bypass:1; union {
unsigned writeback:1; uint16_t flags;
unsigned flush_journal:1;
unsigned csum:1;
unsigned replace:1; struct {
unsigned replace_collision:1; unsigned bypass:1;
unsigned writeback:1;
unsigned flush_journal:1;
unsigned csum:1;
unsigned insert_data_done:1; unsigned replace:1;
unsigned replace_collision:1;
unsigned insert_data_done:1;
};
};
/* Anything past this point won't get zeroed in search_alloc() */
struct keylist insert_keys; struct keylist insert_keys;
BKEY_PADDED(replace_key); BKEY_PADDED(replace_key);
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment