lightnvm: generalize rrpc ppa calculations
[cascardo/linux.git] / drivers / lightnvm / rrpc.h
index a9696a0..0577c4d 100644 (file)
@@ -54,7 +54,9 @@ struct rrpc_rq {
 
 struct rrpc_block {
        struct nvm_block *parent;
+       struct rrpc_lun *rlun;
        struct list_head prio;
+       struct list_head list;
 
 #define MAX_INVALID_PAGES_STORAGE 8
        /* Bitmap for invalid page intries */
@@ -73,7 +75,16 @@ struct rrpc_lun {
        struct nvm_lun *parent;
        struct rrpc_block *cur, *gc_cur;
        struct rrpc_block *blocks;      /* Reference to block allocation */
-       struct list_head prio_list;             /* Blocks that may be GC'ed */
+
+       struct list_head prio_list;     /* Blocks that may be GC'ed */
+       struct list_head open_list;     /* In-use open blocks. These are blocks
+                                        * that can be both written to and read
+                                        * from
+                                        */
+       struct list_head closed_list;   /* In-use closed blocks. These are
+                                        * blocks that can _only_ be read from
+                                        */
+
        struct work_struct ws_gc;
 
        spinlock_t lock;
@@ -93,7 +104,7 @@ struct rrpc {
        struct rrpc_lun *luns;
 
        /* calculated values */
-       unsigned long long nr_pages;
+       unsigned long long nr_sects;
        unsigned long total_blocks;
 
        /* Write strategy variables. Move these into each for structure for each
@@ -145,6 +156,15 @@ struct rrpc_rev_addr {
        u64 addr;
 };
 
+static inline struct rrpc_block *rrpc_get_rblk(struct rrpc_lun *rlun,
+                                                               int blk_id)
+{
+       struct rrpc *rrpc = rlun->rrpc;
+       int lun_blk = blk_id % rrpc->dev->blks_per_lun;
+
+       return &rlun->blocks[lun_blk];
+}
+
 static inline sector_t rrpc_get_laddr(struct bio *bio)
 {
        return bio->bi_iter.bi_sector / NR_PHY_IN_LOG;
@@ -194,7 +214,7 @@ static inline int rrpc_lock_laddr(struct rrpc *rrpc, sector_t laddr,
                                 unsigned pages,
                                 struct rrpc_inflight_rq *r)
 {
-       BUG_ON((laddr + pages) > rrpc->nr_pages);
+       BUG_ON((laddr + pages) > rrpc->nr_sects);
 
        return __rrpc_lock_laddr(rrpc, laddr, pages, r);
 }
@@ -231,7 +251,7 @@ static inline void rrpc_unlock_rq(struct rrpc *rrpc, struct nvm_rq *rqd)
        struct rrpc_inflight_rq *r = rrpc_get_inflight_rq(rqd);
        uint8_t pages = rqd->nr_pages;
 
-       BUG_ON((r->l_start + pages) > rrpc->nr_pages);
+       BUG_ON((r->l_start + pages) > rrpc->nr_sects);
 
        rrpc_unlock_laddr(rrpc, r);
 }