diff options
author | Matias Bjørling <m@bjorling.me> | 2015-11-02 11:12:27 -0500 |
---|---|---|
committer | Jens Axboe <axboe@fb.com> | 2015-11-03 11:53:24 -0500 |
commit | b7ceb7d50048d0dd4830f106f0fb7f5424031598 (patch) | |
tree | 63907b30b02b8ca1cb6c6ea108114a696a6ffff2 | |
parent | ca0640850e43f5f80c6029e2895b119b705f23bd (diff) |
lightnvm: refactor phys addrs type to u64
For cases where CONFIG_LBDAF is not set. The struct ppa_addr exceeds its
type on 32 bit architectures. ppa_addr requires a 64bit integer to hold
the generic ppa format. We therefore refactor it to u64 and
replaces the sector_t usages with u64 for physical addresses.
Signed-off-by: Matias Bjørling <m@bjorling.me>
Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r-- | drivers/lightnvm/rrpc.c | 17 | ||||
-rw-r--r-- | drivers/lightnvm/rrpc.h | 6 | ||||
-rw-r--r-- | include/linux/lightnvm.h | 28 |
3 files changed, 25 insertions, 26 deletions
diff --git a/drivers/lightnvm/rrpc.c b/drivers/lightnvm/rrpc.c index 22fcd629565d..64a888a5e9b3 100644 --- a/drivers/lightnvm/rrpc.c +++ b/drivers/lightnvm/rrpc.c | |||
@@ -116,15 +116,14 @@ static int block_is_full(struct rrpc *rrpc, struct rrpc_block *rblk) | |||
116 | return (rblk->next_page == rrpc->dev->pgs_per_blk); | 116 | return (rblk->next_page == rrpc->dev->pgs_per_blk); |
117 | } | 117 | } |
118 | 118 | ||
119 | static sector_t block_to_addr(struct rrpc *rrpc, struct rrpc_block *rblk) | 119 | static u64 block_to_addr(struct rrpc *rrpc, struct rrpc_block *rblk) |
120 | { | 120 | { |
121 | struct nvm_block *blk = rblk->parent; | 121 | struct nvm_block *blk = rblk->parent; |
122 | 122 | ||
123 | return blk->id * rrpc->dev->pgs_per_blk; | 123 | return blk->id * rrpc->dev->pgs_per_blk; |
124 | } | 124 | } |
125 | 125 | ||
126 | static struct ppa_addr rrpc_ppa_to_gaddr(struct nvm_dev *dev, | 126 | static struct ppa_addr rrpc_ppa_to_gaddr(struct nvm_dev *dev, u64 addr) |
127 | sector_t addr) | ||
128 | { | 127 | { |
129 | struct ppa_addr paddr; | 128 | struct ppa_addr paddr; |
130 | 129 | ||
@@ -231,7 +230,7 @@ static int rrpc_move_valid_pages(struct rrpc *rrpc, struct rrpc_block *rblk) | |||
231 | struct page *page; | 230 | struct page *page; |
232 | int slot; | 231 | int slot; |
233 | int nr_pgs_per_blk = rrpc->dev->pgs_per_blk; | 232 | int nr_pgs_per_blk = rrpc->dev->pgs_per_blk; |
234 | sector_t phys_addr; | 233 | u64 phys_addr; |
235 | DECLARE_COMPLETION_ONSTACK(wait); | 234 | DECLARE_COMPLETION_ONSTACK(wait); |
236 | 235 | ||
237 | if (bitmap_full(rblk->invalid_pages, nr_pgs_per_blk)) | 236 | if (bitmap_full(rblk->invalid_pages, nr_pgs_per_blk)) |
@@ -464,7 +463,7 @@ static struct rrpc_lun *rrpc_get_lun_rr(struct rrpc *rrpc, int is_gc) | |||
464 | } | 463 | } |
465 | 464 | ||
466 | static struct rrpc_addr *rrpc_update_map(struct rrpc *rrpc, sector_t laddr, | 465 | static struct rrpc_addr *rrpc_update_map(struct rrpc *rrpc, sector_t laddr, |
467 | struct rrpc_block *rblk, sector_t paddr) | 466 | struct rrpc_block *rblk, u64 paddr) |
468 | { | 467 | { |
469 | struct rrpc_addr *gp; | 468 | struct rrpc_addr *gp; |
470 | struct rrpc_rev_addr *rev; | 469 | struct rrpc_rev_addr *rev; |
@@ -486,9 +485,9 @@ static struct rrpc_addr *rrpc_update_map(struct rrpc *rrpc, sector_t laddr, | |||
486 | return gp; | 485 | return gp; |
487 | } | 486 | } |
488 | 487 | ||
489 | static sector_t rrpc_alloc_addr(struct rrpc *rrpc, struct rrpc_block *rblk) | 488 | static u64 rrpc_alloc_addr(struct rrpc *rrpc, struct rrpc_block *rblk) |
490 | { | 489 | { |
491 | sector_t addr = ADDR_EMPTY; | 490 | u64 addr = ADDR_EMPTY; |
492 | 491 | ||
493 | spin_lock(&rblk->lock); | 492 | spin_lock(&rblk->lock); |
494 | if (block_is_full(rrpc, rblk)) | 493 | if (block_is_full(rrpc, rblk)) |
@@ -516,7 +515,7 @@ static struct rrpc_addr *rrpc_map_page(struct rrpc *rrpc, sector_t laddr, | |||
516 | struct rrpc_lun *rlun; | 515 | struct rrpc_lun *rlun; |
517 | struct rrpc_block *rblk; | 516 | struct rrpc_block *rblk; |
518 | struct nvm_lun *lun; | 517 | struct nvm_lun *lun; |
519 | sector_t paddr; | 518 | u64 paddr; |
520 | 519 | ||
521 | rlun = rrpc_get_lun_rr(rrpc, is_gc); | 520 | rlun = rrpc_get_lun_rr(rrpc, is_gc); |
522 | lun = rlun->parent; | 521 | lun = rlun->parent; |
@@ -1144,7 +1143,7 @@ static void rrpc_block_map_update(struct rrpc *rrpc, struct rrpc_block *rblk) | |||
1144 | struct nvm_dev *dev = rrpc->dev; | 1143 | struct nvm_dev *dev = rrpc->dev; |
1145 | int offset; | 1144 | int offset; |
1146 | struct rrpc_addr *laddr; | 1145 | struct rrpc_addr *laddr; |
1147 | sector_t paddr, pladdr; | 1146 | u64 paddr, pladdr; |
1148 | 1147 | ||
1149 | for (offset = 0; offset < dev->pgs_per_blk; offset++) { | 1148 | for (offset = 0; offset < dev->pgs_per_blk; offset++) { |
1150 | paddr = block_to_addr(rrpc, rblk) + offset; | 1149 | paddr = block_to_addr(rrpc, rblk) + offset; |
diff --git a/drivers/lightnvm/rrpc.h b/drivers/lightnvm/rrpc.h index b5df08d7b8bf..a9696a06c38c 100644 --- a/drivers/lightnvm/rrpc.h +++ b/drivers/lightnvm/rrpc.h | |||
@@ -86,7 +86,7 @@ struct rrpc { | |||
86 | struct nvm_dev *dev; | 86 | struct nvm_dev *dev; |
87 | struct gendisk *disk; | 87 | struct gendisk *disk; |
88 | 88 | ||
89 | sector_t poffset; /* physical page offset */ | 89 | u64 poffset; /* physical page offset */ |
90 | int lun_offset; | 90 | int lun_offset; |
91 | 91 | ||
92 | int nr_luns; | 92 | int nr_luns; |
@@ -136,13 +136,13 @@ struct rrpc_block_gc { | |||
136 | 136 | ||
137 | /* Logical to physical mapping */ | 137 | /* Logical to physical mapping */ |
138 | struct rrpc_addr { | 138 | struct rrpc_addr { |
139 | sector_t addr; | 139 | u64 addr; |
140 | struct rrpc_block *rblk; | 140 | struct rrpc_block *rblk; |
141 | }; | 141 | }; |
142 | 142 | ||
143 | /* Physical to logical mapping */ | 143 | /* Physical to logical mapping */ |
144 | struct rrpc_rev_addr { | 144 | struct rrpc_rev_addr { |
145 | sector_t addr; | 145 | u64 addr; |
146 | }; | 146 | }; |
147 | 147 | ||
148 | static inline sector_t rrpc_get_laddr(struct bio *bio) | 148 | static inline sector_t rrpc_get_laddr(struct bio *bio) |
diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h index 122b176600fa..5ebd70d12f35 100644 --- a/include/linux/lightnvm.h +++ b/include/linux/lightnvm.h | |||
@@ -134,26 +134,26 @@ struct ppa_addr { | |||
134 | union { | 134 | union { |
135 | /* Channel-based PPA format in nand 4x2x2x2x8x10 */ | 135 | /* Channel-based PPA format in nand 4x2x2x2x8x10 */ |
136 | struct { | 136 | struct { |
137 | sector_t ch : 4; | 137 | u64 ch : 4; |
138 | sector_t sec : 2; /* 4 sectors per page */ | 138 | u64 sec : 2; /* 4 sectors per page */ |
139 | sector_t pl : 2; /* 4 planes per LUN */ | 139 | u64 pl : 2; /* 4 planes per LUN */ |
140 | sector_t lun : 2; /* 4 LUNs per channel */ | 140 | u64 lun : 2; /* 4 LUNs per channel */ |
141 | sector_t pg : 8; /* 256 pages per block */ | 141 | u64 pg : 8; /* 256 pages per block */ |
142 | sector_t blk : 10;/* 1024 blocks per plane */ | 142 | u64 blk : 10;/* 1024 blocks per plane */ |
143 | sector_t resved : 36; | 143 | u64 resved : 36; |
144 | } chnl; | 144 | } chnl; |
145 | 145 | ||
146 | /* Generic structure for all addresses */ | 146 | /* Generic structure for all addresses */ |
147 | struct { | 147 | struct { |
148 | sector_t sec : NVM_SEC_BITS; | 148 | u64 sec : NVM_SEC_BITS; |
149 | sector_t pl : NVM_PL_BITS; | 149 | u64 pl : NVM_PL_BITS; |
150 | sector_t pg : NVM_PG_BITS; | 150 | u64 pg : NVM_PG_BITS; |
151 | sector_t blk : NVM_BLK_BITS; | 151 | u64 blk : NVM_BLK_BITS; |
152 | sector_t lun : NVM_LUN_BITS; | 152 | u64 lun : NVM_LUN_BITS; |
153 | sector_t ch : NVM_CH_BITS; | 153 | u64 ch : NVM_CH_BITS; |
154 | } g; | 154 | } g; |
155 | 155 | ||
156 | sector_t ppa; | 156 | u64 ppa; |
157 | }; | 157 | }; |
158 | } __packed; | 158 | } __packed; |
159 | 159 | ||