summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2016-08-16 20:28:19 -0800
committerKent Overstreet <kent.overstreet@gmail.com>2016-08-16 20:28:19 -0800
commit1daffe5649834c0fbf3a9ed15cafd0c1ec679a6a (patch)
treee23fa89401614177c1470139da4f2ed3450a3931
parent8478a659ceb2219a6a55251a0db87f54fd82bebf (diff)
bcache: fifo improvements
-rw-r--r--drivers/md/bcache/fifo.h51
-rw-r--r--drivers/md/bcache/journal.c14
-rw-r--r--drivers/md/bcache/journal.h2
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);
}