diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2016-08-16 20:28:19 -0800 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2016-08-16 20:28:19 -0800 |
commit | 1daffe5649834c0fbf3a9ed15cafd0c1ec679a6a (patch) | |
tree | e23fa89401614177c1470139da4f2ed3450a3931 | |
parent | 8478a659ceb2219a6a55251a0db87f54fd82bebf (diff) |
bcache: fifo improvements
-rw-r--r-- | drivers/md/bcache/fifo.h | 51 | ||||
-rw-r--r-- | drivers/md/bcache/journal.c | 14 | ||||
-rw-r--r-- | drivers/md/bcache/journal.h | 2 |
3 files changed, 27 insertions, 40 deletions
diff --git a/drivers/md/bcache/fifo.h b/drivers/md/bcache/fifo.h index 8bd6168aea06..32a17c92b698 100644 --- a/drivers/md/bcache/fifo.h +++ b/drivers/md/bcache/fifo.h @@ -18,7 +18,7 @@ if ((fifo)->size) { \ size_t _allocated_size, _bytes; \ \ - _allocated_size = roundup_pow_of_two((fifo)->size + 1); \ + _allocated_size = roundup_pow_of_two((fifo)->size); \ _bytes = _allocated_size * sizeof(*(fifo)->data); \ \ (fifo)->mask = _allocated_size - 1; \ @@ -56,77 +56,64 @@ do { \ fifo_push(dest, _t); \ } while (0) -#define fifo_used(fifo) (((fifo)->back - (fifo)->front) & (fifo)->mask) +#define fifo_used(fifo) (((fifo)->back - (fifo)->front)) #define fifo_free(fifo) ((fifo)->size - fifo_used(fifo)) -#define fifo_empty(fifo) (!fifo_used(fifo)) -#define fifo_full(fifo) (!fifo_free(fifo)) +#define fifo_empty(fifo) ((fifo)->front == (fifo)->back) +#define fifo_full(fifo) (fifo_used(fifo) == (fifo)->size) -#define fifo_front(fifo) ((fifo)->data[(fifo)->front]) -#define fifo_back(fifo) \ - ((fifo)->data[((fifo)->back - 1) & (fifo)->mask]) +#define fifo_peek_front(fifo) ((fifo)->data[(fifo)->front & (fifo)->mask]) +#define fifo_peek_back(fifo) ((fifo)->data[((fifo)->back - 1) & (fifo)->mask]) -#define fifo_entry_idx(fifo, p) (((p) - &fifo_front(fifo)) & (fifo)->mask) +#define fifo_entry_idx(fifo, p) (((p) - &fifo_peek_front(fifo)) & (fifo)->mask) #define fifo_push_back(fifo, i) \ ({ \ bool _r = !fifo_full((fifo)); \ - if (_r) { \ - (fifo)->data[(fifo)->back++] = (i); \ - (fifo)->back &= (fifo)->mask; \ - } \ + if (_r) \ + (fifo)->data[(fifo)->back++ & (fifo)->mask] = (i); \ _r; \ }) #define fifo_pop_front(fifo, i) \ ({ \ bool _r = !fifo_empty((fifo)); \ - if (_r) { \ - (i) = (fifo)->data[(fifo)->front++]; \ - (fifo)->front &= (fifo)->mask; \ - } \ + if (_r) \ + (i) = (fifo)->data[(fifo)->front++ & (fifo)->mask]; \ _r; \ }) #define fifo_push_front(fifo, i) \ ({ \ bool _r = !fifo_full((fifo)); \ - if (_r) { \ - --(fifo)->front; \ - (fifo)->front &= (fifo)->mask; \ - (fifo)->data[(fifo)->front] = (i); \ - } \ + if (_r) \ + (fifo)->data[--(fifo)->front & (fifo)->mask] = (i); \ _r; \ }) #define fifo_pop_back(fifo, i) \ ({ \ bool _r = !fifo_empty((fifo)); \ - if (_r) { \ - --(fifo)->back; \ - (fifo)->back &= (fifo)->mask; \ - (i) = (fifo)->data[(fifo)->back] \ - } \ + if (_r) \ + (i) = (fifo)->data[--(fifo)->back & (fifo)->mask] \ _r; \ }) #define fifo_push(fifo, i) fifo_push_back(fifo, (i)) #define fifo_pop(fifo, i) fifo_pop_front(fifo, (i)) - -#define fifo_peek_front(fifo) ((fifo)->data[(fifo)->front]) #define fifo_peek(fifo) fifo_peek_front(fifo) #define fifo_for_each_entry(_entry, _fifo, _iter) \ for (_iter = (_fifo)->front; \ ((_iter != (_fifo)->back) && \ - (_entry = (_fifo)->data[(_iter)], true)); \ - _iter = ((_iter) + 1) & (_fifo)->mask) + (_entry = (_fifo)->data[(_iter) & (_fifo)->mask], true)); \ + _iter++) #define fifo_for_each_entry_ptr(_ptr, _fifo, _iter) \ for (_iter = (_fifo)->front; \ ((_iter != (_fifo)->back) && \ - (_ptr = &(_fifo)->data[(_iter)], true)); \ - _iter = ((_iter) + 1) & (_fifo)->mask) + (_ptr = &(_fifo)->data[(_iter) & (_fifo)->mask], true)); \ + _iter++) #endif /* _BCACHE_FIFO_H */ diff --git a/drivers/md/bcache/journal.c b/drivers/md/bcache/journal.c index 164e68879cb9..c900f4c131f1 100644 --- a/drivers/md/bcache/journal.c +++ b/drivers/md/bcache/journal.c @@ -911,7 +911,7 @@ static void __bch_journal_next_entry(struct journal *j) * incremented for last_seq() to be calculated correctly */ BUG_ON(!fifo_push(&j->pin, pin_list)); - p = &fifo_back(&j->pin); + p = &fifo_peek_back(&j->pin); INIT_LIST_HEAD(&p->list); atomic_set(&p->count, 1); @@ -970,7 +970,7 @@ static enum { buf->data->u64s = cpu_to_le32(old.cur_entry_offset); buf->data->last_seq = cpu_to_le64(last_seq(j)); - atomic_dec_bug(&fifo_back(&j->pin).count); + atomic_dec_bug(&fifo_peek_back(&j->pin).count); __bch_journal_next_entry(j); spin_unlock(&j->lock); @@ -1181,7 +1181,7 @@ void bch_journal_start(struct cache_set *c) struct journal_entry_pin_list pin_list, *p; BUG_ON(!fifo_push(&j->pin, pin_list)); - p = &fifo_back(&j->pin); + p = &fifo_peek_back(&j->pin); INIT_LIST_HEAD(&p->list); atomic_set(&p->count, 0); @@ -1206,7 +1206,7 @@ void bch_journal_start(struct cache_set *c) JOURNAL_ENTRY_JOURNAL_SEQ_BLACKLISTED, 0, 0); - __journal_pin_add(j, &fifo_back(&j->pin), &bl->pin, + __journal_pin_add(j, &fifo_peek_back(&j->pin), &bl->pin, journal_seq_blacklist_flush); bl->written = true; } @@ -1370,8 +1370,8 @@ static void journal_reclaim_fast(struct journal *j) * Unpin journal entries whose reference counts reached zero, meaning * all btree nodes got written out */ - while (!atomic_read(&fifo_front(&j->pin).count)) { - BUG_ON(!list_empty(&fifo_front(&j->pin).list)); + while (!atomic_read(&fifo_peek_front(&j->pin).count)) { + BUG_ON(!list_empty(&fifo_peek_front(&j->pin).list)); BUG_ON(!fifo_pop(&j->pin, temp)); } } @@ -1384,7 +1384,7 @@ journal_get_next_pin(struct journal *j, u64 seq_to_flush) unsigned iter; /* so we don't iterate over empty fifo entries below: */ - if (!atomic_read(&fifo_front(&j->pin).count)) { + if (!atomic_read(&fifo_peek_front(&j->pin).count)) { spin_lock(&j->lock); journal_reclaim_fast(j); spin_unlock(&j->lock); diff --git a/drivers/md/bcache/journal.h b/drivers/md/bcache/journal.h index c2bb4ab708f1..7fc789a9382a 100644 --- a/drivers/md/bcache/journal.h +++ b/drivers/md/bcache/journal.h @@ -236,7 +236,7 @@ static inline void bch_journal_set_replay_done(struct journal *j) { spin_lock(&j->lock); set_bit(JOURNAL_REPLAY_DONE, &j->flags); - j->cur_pin_list = &fifo_back(&j->pin); + j->cur_pin_list = &fifo_peek_back(&j->pin); spin_unlock(&j->lock); } |