aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorJavier González <javier@javigon.com>2018-10-09 07:11:42 -0400
committerJens Axboe <axboe@kernel.dk>2018-10-09 10:25:06 -0400
commitcb21665c8d13bb7e1f6e211442c53f4675f1569d (patch)
tree66f4205ee194150f918fb4588719a6b2bf7bac74 /drivers
parent2cf99bbd106f89fc72f778e8ad9d5538f1ef939b (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.c15
-rw-r--r--drivers/lightnvm/pblk-rb.c2
-rw-r--r--drivers/lightnvm/pblk-read.c4
-rw-r--r--drivers/lightnvm/pblk-write.c4
-rw-r--r--drivers/lightnvm/pblk.h13
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
987static inline int pblk_ppa_to_line(struct ppa_addr p) 987static 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
992static 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
992static inline int pblk_ppa_to_pos(struct nvm_geo *geo, struct ppa_addr p) 998static 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) {