Lines Matching refs:pblk

126 	struct pblk *pblk;
133 struct pblk *pblk;
271 * pblk->max_write_pgs size, which in NVMe is
327 #define PBLK_MAGIC 0x70626c6b /*pblk*/
343 __le32 identifier; /* pblk identifier */
433 struct pblk *pblk;
592 struct pblk {
610 int state; /* pblk line state */
622 /* pblk provisioning values. Used by rate limiter */
702 struct pblk *pblk;
711 #define pblk_err(pblk, fmt, ...) \
712 pr_err("pblk %s: " fmt, pblk->disk->disk_name, ##__VA_ARGS__)
713 #define pblk_info(pblk, fmt, ...) \
714 pr_info("pblk %s: " fmt, pblk->disk->disk_name, ##__VA_ARGS__)
715 #define pblk_warn(pblk, fmt, ...) \
716 pr_warn("pblk %s: " fmt, pblk->disk->disk_name, ##__VA_ARGS__)
717 #define pblk_debug(pblk, fmt, ...) \
718 pr_debug("pblk %s: " fmt, pblk->disk->disk_name, ##__VA_ARGS__)
721 * pblk ring buffer operations
762 * pblk core
764 struct nvm_rq *pblk_alloc_rqd(struct pblk *pblk, int type);
765 void pblk_free_rqd(struct pblk *pblk, struct nvm_rq *rqd, int type);
766 int pblk_alloc_rqd_meta(struct pblk *pblk, struct nvm_rq *rqd);
767 void pblk_free_rqd_meta(struct pblk *pblk, struct nvm_rq *rqd);
768 void pblk_set_sec_per_write(struct pblk *pblk, int sec_per_write);
769 int pblk_setup_w_rec_rq(struct pblk *pblk, struct nvm_rq *rqd,
771 void pblk_discard(struct pblk *pblk, struct bio *bio);
772 struct nvm_chk_meta *pblk_get_chunk_meta(struct pblk *pblk);
773 struct nvm_chk_meta *pblk_chunk_get_off(struct pblk *pblk,
776 void pblk_log_write_err(struct pblk *pblk, struct nvm_rq *rqd);
777 void pblk_log_read_err(struct pblk *pblk, struct nvm_rq *rqd);
778 int pblk_submit_io(struct pblk *pblk, struct nvm_rq *rqd, void *buf);
779 int pblk_submit_io_sync(struct pblk *pblk, struct nvm_rq *rqd, void *buf);
780 int pblk_submit_meta_io(struct pblk *pblk, struct pblk_line *meta_line);
781 void pblk_check_chunk_state_update(struct pblk *pblk, struct nvm_rq *rqd);
782 struct pblk_line *pblk_line_get(struct pblk *pblk);
783 struct pblk_line *pblk_line_get_first_data(struct pblk *pblk);
784 struct pblk_line *pblk_line_replace_data(struct pblk *pblk);
785 void pblk_ppa_to_line_put(struct pblk *pblk, struct ppa_addr ppa);
786 void pblk_rq_to_line_put(struct pblk *pblk, struct nvm_rq *rqd);
787 int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line);
788 void pblk_line_recov_close(struct pblk *pblk, struct pblk_line *line);
789 struct pblk_line *pblk_line_get_data(struct pblk *pblk);
790 struct pblk_line *pblk_line_get_erase(struct pblk *pblk);
791 int pblk_line_erase(struct pblk *pblk, struct pblk_line *line);
794 void pblk_line_close_meta(struct pblk *pblk, struct pblk_line *line);
795 void pblk_line_close(struct pblk *pblk, struct pblk_line *line);
797 void pblk_pipeline_stop(struct pblk *pblk);
798 void __pblk_pipeline_stop(struct pblk *pblk);
799 void __pblk_pipeline_flush(struct pblk *pblk);
800 void pblk_gen_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
803 u64 pblk_line_smeta_start(struct pblk *pblk, struct pblk_line *line);
804 int pblk_line_smeta_read(struct pblk *pblk, struct pblk_line *line);
805 int pblk_line_emeta_read(struct pblk *pblk, struct pblk_line *line,
807 int pblk_blk_erase_async(struct pblk *pblk, struct ppa_addr erase_ppa);
810 struct list_head *pblk_line_gc_list(struct pblk *pblk, struct pblk_line *line);
811 u64 pblk_lookup_page(struct pblk *pblk, struct pblk_line *line);
812 void pblk_dealloc_page(struct pblk *pblk, struct pblk_line *line, int nr_secs);
813 u64 pblk_alloc_page(struct pblk *pblk, struct pblk_line *line, int nr_secs);
814 u64 __pblk_alloc_page(struct pblk *pblk, struct pblk_line *line, int nr_secs);
815 int pblk_calc_secs(struct pblk *pblk, unsigned long secs_avail,
817 void pblk_down_rq(struct pblk *pblk, struct ppa_addr ppa,
819 void pblk_down_chunk(struct pblk *pblk, struct ppa_addr ppa);
820 void pblk_up_chunk(struct pblk *pblk, struct ppa_addr ppa);
821 void pblk_up_rq(struct pblk *pblk, unsigned long *lun_bitmap);
822 int pblk_bio_add_pages(struct pblk *pblk, struct bio *bio, gfp_t flags,
824 void pblk_bio_free_pages(struct pblk *pblk, struct bio *bio, int off,
826 void pblk_map_invalidate(struct pblk *pblk, struct ppa_addr ppa);
827 void __pblk_map_invalidate(struct pblk *pblk, struct pblk_line *line,
829 void pblk_update_map(struct pblk *pblk, sector_t lba, struct ppa_addr ppa);
830 void pblk_update_map_cache(struct pblk *pblk, sector_t lba,
832 void pblk_update_map_dev(struct pblk *pblk, sector_t lba,
834 int pblk_update_map_gc(struct pblk *pblk, sector_t lba, struct ppa_addr ppa,
836 void pblk_lookup_l2p_rand(struct pblk *pblk, struct ppa_addr *ppas,
838 int pblk_lookup_l2p_seq(struct pblk *pblk, struct ppa_addr *ppas,
840 void *pblk_get_meta_for_writes(struct pblk *pblk, struct nvm_rq *rqd);
841 void pblk_get_packed_meta(struct pblk *pblk, struct nvm_rq *rqd);
844 * pblk user I/O write path
846 void pblk_write_to_cache(struct pblk *pblk, struct bio *bio,
848 int pblk_write_gc_to_cache(struct pblk *pblk, struct pblk_gc_rq *gc_rq);
851 * pblk map
853 int pblk_map_erase_rq(struct pblk *pblk, struct nvm_rq *rqd,
856 int pblk_map_rq(struct pblk *pblk, struct nvm_rq *rqd, unsigned int sentry,
861 * pblk write thread
865 void pblk_write_should_kick(struct pblk *pblk);
866 void pblk_write_kick(struct pblk *pblk);
869 * pblk read path
872 void pblk_submit_read(struct pblk *pblk, struct bio *bio);
873 int pblk_submit_read_gc(struct pblk *pblk, struct pblk_gc_rq *gc_rq);
875 * pblk recovery
877 struct pblk_line *pblk_recov_l2p(struct pblk *pblk);
878 int pblk_recov_pad(struct pblk *pblk);
879 int pblk_recov_check_emeta(struct pblk *pblk, struct line_emeta *emeta);
882 * pblk gc
888 int pblk_gc_init(struct pblk *pblk);
889 void pblk_gc_exit(struct pblk *pblk, bool graceful);
890 void pblk_gc_should_start(struct pblk *pblk);
891 void pblk_gc_should_stop(struct pblk *pblk);
892 void pblk_gc_should_kick(struct pblk *pblk);
893 void pblk_gc_free_full_lines(struct pblk *pblk);
894 void pblk_gc_sysfs_state_show(struct pblk *pblk, int *gc_enabled,
896 int pblk_gc_sysfs_force(struct pblk *pblk, int force);
897 void pblk_put_line_back(struct pblk *pblk, struct pblk_line *line);
900 * pblk rate limiter
924 * pblk sysfs
945 static inline void *emeta_to_lbas(struct pblk *pblk, struct line_emeta *emeta)
947 return ((void *)emeta + pblk->lm.emeta_len[1]);
950 static inline void *emeta_to_vsc(struct pblk *pblk, struct line_emeta *emeta)
952 return (emeta_to_lbas(pblk, emeta) + pblk->lm.emeta_len[2]);
965 static inline struct pblk_line *pblk_ppa_to_line(struct pblk *pblk,
968 return &pblk->lines[pblk_ppa_to_line_id(p)];
976 static inline struct ppa_addr addr_to_gen_ppa(struct pblk *pblk, u64 paddr,
979 struct nvm_tgt_dev *dev = pblk->dev;
984 struct nvm_addrf_12 *ppaf = (struct nvm_addrf_12 *)&pblk->addrf;
994 struct pblk_addrf *uaddrf = &pblk->uaddrf;
1016 static inline struct nvm_chk_meta *pblk_dev_ppa_to_chunk(struct pblk *pblk,
1019 struct nvm_tgt_dev *dev = pblk->dev;
1021 struct pblk_line *line = pblk_ppa_to_line(pblk, p);
1027 static inline u64 pblk_dev_ppa_to_chunk_addr(struct pblk *pblk,
1030 struct nvm_tgt_dev *dev = pblk->dev;
1032 return dev_to_chunk_addr(dev->parent, &pblk->addrf, p);
1035 static inline u64 pblk_dev_ppa_to_line_addr(struct pblk *pblk,
1038 struct nvm_tgt_dev *dev = pblk->dev;
1043 struct nvm_addrf_12 *ppaf = (struct nvm_addrf_12 *)&pblk->addrf;
1051 struct pblk_addrf *uaddrf = &pblk->uaddrf;
1066 static inline struct ppa_addr pblk_ppa32_to_ppa64(struct pblk *pblk, u32 ppa32)
1068 struct nvm_tgt_dev *dev = pblk->dev;
1070 return nvm_ppa32_to_ppa64(dev->parent, &pblk->addrf, ppa32);
1073 static inline u32 pblk_ppa64_to_ppa32(struct pblk *pblk, struct ppa_addr ppa64)
1075 struct nvm_tgt_dev *dev = pblk->dev;
1077 return nvm_ppa64_to_ppa32(dev->parent, &pblk->addrf, ppa64);
1080 static inline struct ppa_addr pblk_trans_map_get(struct pblk *pblk,
1085 if (pblk->addrf_len < 32) {
1086 u32 *map = (u32 *)pblk->trans_map;
1088 ppa = pblk_ppa32_to_ppa64(pblk, map[lba]);
1090 struct ppa_addr *map = (struct ppa_addr *)pblk->trans_map;
1098 static inline void pblk_trans_map_set(struct pblk *pblk, sector_t lba,
1101 if (pblk->addrf_len < 32) {
1102 u32 *map = (u32 *)pblk->trans_map;
1104 map[lba] = pblk_ppa64_to_ppa32(pblk, ppa);
1106 u64 *map = (u64 *)pblk->trans_map;
1147 static inline u32 pblk_calc_meta_header_crc(struct pblk *pblk,
1158 static inline u32 pblk_calc_smeta_crc(struct pblk *pblk,
1161 struct pblk_line_meta *lm = &pblk->lm;
1172 static inline u32 pblk_calc_emeta_crc(struct pblk *pblk,
1175 struct pblk_line_meta *lm = &pblk->lm;
1186 static inline int pblk_io_aligned(struct pblk *pblk, int nr_secs)
1188 return !(nr_secs % pblk->min_write_pgs);
1192 static inline void print_ppa(struct pblk *pblk, struct ppa_addr *p,
1195 struct nvm_geo *geo = &pblk->dev->geo;
1198 pblk_err(pblk, "ppa: (%s: %x) cache line: %llu\n",
1201 pblk_err(pblk, "ppa: (%s: %x):ch:%d,lun:%d,blk:%d,pg:%d,pl:%d,sec:%d\n",
1206 pblk_err(pblk, "ppa: (%s: %x):ch:%d,lun:%d,chk:%d,sec:%d\n",
1212 static inline void pblk_print_failed_rqd(struct pblk *pblk, struct nvm_rq *rqd,
1218 print_ppa(pblk, &rqd->ppa_addr, "rqd", error);
1224 print_ppa(pblk, &rqd->ppa_list[bit], "rqd", error);
1227 pblk_err(pblk, "error:%d, ppa_status:%llx\n", error, rqd->ppa_status);
1265 static inline int pblk_check_io(struct pblk *pblk, struct nvm_rq *rqd)
1267 struct nvm_tgt_dev *dev = pblk->dev;
1280 line = pblk_ppa_to_line(pblk, ppa_list[i]);
1284 pblk_err(pblk, "bad ppa: line:%d,state:%d\n",
1298 static inline int pblk_boundary_paddr_checks(struct pblk *pblk, u64 paddr)
1300 struct pblk_line_meta *lm = &pblk->lm;
1323 static inline char *pblk_disk_name(struct pblk *pblk)
1325 struct gendisk *disk = pblk->disk;
1330 static inline unsigned int pblk_get_min_chks(struct pblk *pblk)
1332 struct pblk_line_meta *lm = &pblk->lm;
1337 return DIV_ROUND_UP(100, pblk->op) * lm->blk_per_line;
1340 static inline struct pblk_sec_meta *pblk_get_meta(struct pblk *pblk,
1344 max_t(int, sizeof(struct pblk_sec_meta), pblk->oob_meta_size)
1348 static inline int pblk_dma_meta_size(struct pblk *pblk)
1350 return max_t(int, sizeof(struct pblk_sec_meta), pblk->oob_meta_size)
1354 static inline int pblk_is_oob_meta_supported(struct pblk *pblk)
1356 return pblk->oob_meta_size >= sizeof(struct pblk_sec_meta);