diff options
author | Javier González <javier@javigon.com> | 2018-10-09 07:11:42 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-10-09 10:25:06 -0400 |
commit | cb21665c8d13bb7e1f6e211442c53f4675f1569d (patch) | |
tree | 66f4205ee194150f918fb4588719a6b2bf7bac74 /drivers | |
parent | 2cf99bbd106f89fc72f778e8ad9d5538f1ef939b (diff) |
lightnvm: pblk: improve line helpers
The current helper to obtain a line from a ppa returns the line id,
which requires its users to explicitly retrieve the pointer to the line
with the id.
Make 2 different helpers: one returning the line id and one returning
the line directly.
Signed-off-by: Javier González <javier@cnexlabs.com>
Signed-off-by: Matias Bjørling <mb@lightnvm.io>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/lightnvm/pblk-core.c | 15 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-rb.c | 2 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-read.c | 4 | ||||
-rw-r--r-- | drivers/lightnvm/pblk-write.c | 4 | ||||
-rw-r--r-- | drivers/lightnvm/pblk.h | 13 |
5 files changed, 20 insertions, 18 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c index 5f99cf396072..36ac9eff8ebd 100644 --- a/drivers/lightnvm/pblk-core.c +++ b/drivers/lightnvm/pblk-core.c | |||
@@ -32,7 +32,7 @@ static void pblk_line_mark_bb(struct work_struct *work) | |||
32 | struct pblk_line *line; | 32 | struct pblk_line *line; |
33 | int pos; | 33 | int pos; |
34 | 34 | ||
35 | line = &pblk->lines[pblk_ppa_to_line(*ppa)]; | 35 | line = pblk_ppa_to_line(pblk, *ppa); |
36 | pos = pblk_ppa_to_pos(&dev->geo, *ppa); | 36 | pos = pblk_ppa_to_pos(&dev->geo, *ppa); |
37 | 37 | ||
38 | pblk_err(pblk, "failed to mark bb, line:%d, pos:%d\n", | 38 | pblk_err(pblk, "failed to mark bb, line:%d, pos:%d\n", |
@@ -80,7 +80,7 @@ static void __pblk_end_io_erase(struct pblk *pblk, struct nvm_rq *rqd) | |||
80 | struct pblk_line *line; | 80 | struct pblk_line *line; |
81 | int pos; | 81 | int pos; |
82 | 82 | ||
83 | line = &pblk->lines[pblk_ppa_to_line(rqd->ppa_addr)]; | 83 | line = pblk_ppa_to_line(pblk, rqd->ppa_addr); |
84 | pos = pblk_ppa_to_pos(geo, rqd->ppa_addr); | 84 | pos = pblk_ppa_to_pos(geo, rqd->ppa_addr); |
85 | chunk = &line->chks[pos]; | 85 | chunk = &line->chks[pos]; |
86 | 86 | ||
@@ -192,7 +192,6 @@ void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa) | |||
192 | { | 192 | { |
193 | struct pblk_line *line; | 193 | struct pblk_line *line; |
194 | u64 paddr; | 194 | u64 paddr; |
195 | int line_id; | ||
196 | 195 | ||
197 | #ifdef CONFIG_NVM_PBLK_DEBUG | 196 | #ifdef CONFIG_NVM_PBLK_DEBUG |
198 | /* Callers must ensure that the ppa points to a device address */ | 197 | /* Callers must ensure that the ppa points to a device address */ |
@@ -200,8 +199,7 @@ void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa) | |||
200 | BUG_ON(pblk_ppa_empty(ppa)); | 199 | BUG_ON(pblk_ppa_empty(ppa)); |
201 | #endif | 200 | #endif |
202 | 201 | ||
203 | line_id = pblk_ppa_to_line(ppa); | 202 | line = pblk_ppa_to_line(pblk, ppa); |
204 | line = &pblk->lines[line_id]; | ||
205 | paddr = pblk_dev_ppa_to_line_addr(pblk, ppa); | 203 | paddr = pblk_dev_ppa_to_line_addr(pblk, ppa); |
206 | 204 | ||
207 | __pblk_map_invalidate(pblk, line, paddr); | 205 | __pblk_map_invalidate(pblk, line, paddr); |
@@ -1430,7 +1428,7 @@ void pblk_ppa_to_line_put(struct pblk *pblk, struct ppa_addr ppa) | |||
1430 | { | 1428 | { |
1431 | struct pblk_line *line; | 1429 | struct pblk_line *line; |
1432 | 1430 | ||
1433 | line = &pblk->lines[pblk_ppa_to_line(ppa)]; | 1431 | line = pblk_ppa_to_line(pblk, ppa); |
1434 | kref_put(&line->ref, pblk_line_put_wq); | 1432 | kref_put(&line->ref, pblk_line_put_wq); |
1435 | } | 1433 | } |
1436 | 1434 | ||
@@ -1688,7 +1686,7 @@ int pblk_blk_erase_async(struct pblk *pblk, struct ppa_addr ppa) | |||
1688 | struct nvm_geo *geo = &dev->geo; | 1686 | struct nvm_geo *geo = &dev->geo; |
1689 | 1687 | ||
1690 | pblk_err(pblk, "could not async erase line:%d,blk:%d\n", | 1688 | pblk_err(pblk, "could not async erase line:%d,blk:%d\n", |
1691 | pblk_ppa_to_line(ppa), | 1689 | pblk_ppa_to_line_id(ppa), |
1692 | pblk_ppa_to_pos(geo, ppa)); | 1690 | pblk_ppa_to_pos(geo, ppa)); |
1693 | } | 1691 | } |
1694 | 1692 | ||
@@ -2059,8 +2057,7 @@ void pblk_lookup_l2p_seq(struct pblk *pblk, struct ppa_addr *ppas, | |||
2059 | 2057 | ||
2060 | /* If the L2P entry maps to a line, the reference is valid */ | 2058 | /* If the L2P entry maps to a line, the reference is valid */ |
2061 | if (!pblk_ppa_empty(ppa) && !pblk_addr_in_cache(ppa)) { | 2059 | if (!pblk_ppa_empty(ppa) && !pblk_addr_in_cache(ppa)) { |
2062 | int line_id = pblk_ppa_to_line(ppa); | 2060 | struct pblk_line *line = pblk_ppa_to_line(pblk, ppa); |
2063 | struct pblk_line *line = &pblk->lines[line_id]; | ||
2064 | 2061 | ||
2065 | kref_get(&line->ref); | 2062 | kref_get(&line->ref); |
2066 | } | 2063 | } |
diff --git a/drivers/lightnvm/pblk-rb.c b/drivers/lightnvm/pblk-rb.c index f6eec0212dfc..a7648e12f54f 100644 --- a/drivers/lightnvm/pblk-rb.c +++ b/drivers/lightnvm/pblk-rb.c | |||
@@ -225,7 +225,7 @@ static int __pblk_rb_update_l2p(struct pblk_rb *rb, unsigned int to_update) | |||
225 | pblk_update_map_dev(pblk, w_ctx->lba, w_ctx->ppa, | 225 | pblk_update_map_dev(pblk, w_ctx->lba, w_ctx->ppa, |
226 | entry->cacheline); | 226 | entry->cacheline); |
227 | 227 | ||
228 | line = &pblk->lines[pblk_ppa_to_line(w_ctx->ppa)]; | 228 | line = pblk_ppa_to_line(pblk, w_ctx->ppa); |
229 | kref_put(&line->ref, pblk_line_put); | 229 | kref_put(&line->ref, pblk_line_put); |
230 | clean_wctx(w_ctx); | 230 | clean_wctx(w_ctx); |
231 | rb->l2p_update = (rb->l2p_update + 1) & (rb->nr_entries - 1); | 231 | rb->l2p_update = (rb->l2p_update + 1) & (rb->nr_entries - 1); |
diff --git a/drivers/lightnvm/pblk-read.c b/drivers/lightnvm/pblk-read.c index ad1d7713bbda..49744caaa300 100644 --- a/drivers/lightnvm/pblk-read.c +++ b/drivers/lightnvm/pblk-read.c | |||
@@ -252,9 +252,9 @@ static void pblk_end_partial_read(struct nvm_rq *rqd) | |||
252 | i = 0; | 252 | i = 0; |
253 | hole = find_first_zero_bit(read_bitmap, nr_secs); | 253 | hole = find_first_zero_bit(read_bitmap, nr_secs); |
254 | do { | 254 | do { |
255 | int line_id = pblk_ppa_to_line(rqd->ppa_list[i]); | 255 | struct pblk_line *line; |
256 | struct pblk_line *line = &pblk->lines[line_id]; | ||
257 | 256 | ||
257 | line = pblk_ppa_to_line(pblk, rqd->ppa_list[i]); | ||
258 | kref_put(&line->ref, pblk_line_put); | 258 | kref_put(&line->ref, pblk_line_put); |
259 | 259 | ||
260 | meta_list[hole].lba = lba_list_media[i]; | 260 | meta_list[hole].lba = lba_list_media[i]; |
diff --git a/drivers/lightnvm/pblk-write.c b/drivers/lightnvm/pblk-write.c index df99c45778d4..c23b65aaa27b 100644 --- a/drivers/lightnvm/pblk-write.c +++ b/drivers/lightnvm/pblk-write.c | |||
@@ -113,7 +113,7 @@ static void pblk_map_remaining(struct pblk *pblk, struct ppa_addr *ppa) | |||
113 | u64 paddr; | 113 | u64 paddr; |
114 | int done = 0; | 114 | int done = 0; |
115 | 115 | ||
116 | line = &pblk->lines[pblk_ppa_to_line(*ppa)]; | 116 | line = pblk_ppa_to_line(pblk, *ppa); |
117 | spin_lock(&line->lock); | 117 | spin_lock(&line->lock); |
118 | 118 | ||
119 | while (!done) { | 119 | while (!done) { |
@@ -171,7 +171,7 @@ static void pblk_prepare_resubmit(struct pblk *pblk, unsigned int sentry, | |||
171 | /* Decrese the reference count to the line as we will | 171 | /* Decrese the reference count to the line as we will |
172 | * re-map these entries | 172 | * re-map these entries |
173 | */ | 173 | */ |
174 | line = &pblk->lines[pblk_ppa_to_line(w_ctx->ppa)]; | 174 | line = pblk_ppa_to_line(pblk, w_ctx->ppa); |
175 | kref_put(&line->ref, pblk_line_put); | 175 | kref_put(&line->ref, pblk_line_put); |
176 | 176 | ||
177 | pos = (pos + 1) & (rb->nr_entries - 1); | 177 | pos = (pos + 1) & (rb->nr_entries - 1); |
diff --git a/drivers/lightnvm/pblk.h b/drivers/lightnvm/pblk.h index f95fe75fef6e..af9477b7e803 100644 --- a/drivers/lightnvm/pblk.h +++ b/drivers/lightnvm/pblk.h | |||
@@ -984,11 +984,17 @@ static inline int pblk_pad_distance(struct pblk *pblk) | |||
984 | return geo->mw_cunits * geo->all_luns * geo->ws_opt; | 984 | return geo->mw_cunits * geo->all_luns * geo->ws_opt; |
985 | } | 985 | } |
986 | 986 | ||
987 | static inline int pblk_ppa_to_line(struct ppa_addr p) | 987 | static inline int pblk_ppa_to_line_id(struct ppa_addr p) |
988 | { | 988 | { |
989 | return p.a.blk; | 989 | return p.a.blk; |
990 | } | 990 | } |
991 | 991 | ||
992 | static inline struct pblk_line *pblk_ppa_to_line(struct pblk *pblk, | ||
993 | struct ppa_addr p) | ||
994 | { | ||
995 | return &pblk->lines[pblk_ppa_to_line_id(p)]; | ||
996 | } | ||
997 | |||
992 | static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p) | 998 | static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p) |
993 | { | 999 | { |
994 | return p.a.lun * geo->num_ch + p.a.ch; | 1000 | return p.a.lun * geo->num_ch + p.a.ch; |
@@ -1039,7 +1045,7 @@ static inline struct nvm_chk_meta *pblk_dev_ppa_to_chunk(struct pblk *pblk, | |||
1039 | { | 1045 | { |
1040 | struct nvm_tgt_dev *dev = pblk->dev; | 1046 | struct nvm_tgt_dev *dev = pblk->dev; |
1041 | struct nvm_geo *geo = &dev->geo; | 1047 | struct nvm_geo *geo = &dev->geo; |
1042 | struct pblk_line *line = &pblk->lines[pblk_ppa_to_line(p)]; | 1048 | struct pblk_line *line = pblk_ppa_to_line(pblk, p); |
1043 | int pos = pblk_ppa_to_pos(geo, p); | 1049 | int pos = pblk_ppa_to_pos(geo, p); |
1044 | 1050 | ||
1045 | return &line->chks[pos]; | 1051 | return &line->chks[pos]; |
@@ -1371,8 +1377,7 @@ static inline int pblk_check_io(struct pblk *pblk, struct nvm_rq *rqd) | |||
1371 | int i; | 1377 | int i; |
1372 | 1378 | ||
1373 | for (i = 0; i < rqd->nr_ppas; i++) { | 1379 | for (i = 0; i < rqd->nr_ppas; i++) { |
1374 | ppa = ppa_list[i]; | 1380 | line = pblk_ppa_to_line(pblk, ppa_list[i]); |
1375 | line = &pblk->lines[pblk_ppa_to_line(ppa)]; | ||
1376 | 1381 | ||
1377 | spin_lock(&line->lock); | 1382 | spin_lock(&line->lock); |
1378 | if (line->state != PBLK_LINESTATE_OPEN) { | 1383 | if (line->state != PBLK_LINESTATE_OPEN) { |