aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/lightnvm/pblk-core.c
diff options
context:
space:
mode:
authorJavier González <jg@lightnvm.io>2017-07-07 15:08:52 -0400
committerJens Axboe <axboe@kernel.dk>2017-07-07 15:17:34 -0400
commit3eaa11e2780dc38350c133bd998cac1df488d040 (patch)
tree72f51ca76c7ae028386bd614220faf97d56b1cfd /drivers/lightnvm/pblk-core.c
parent0e2ff11311d1d4c85dd9ad9ba4347775f628e94a (diff)
lightnvm: pblk: control I/O flow also on tear down
When removing a pblk instance, control the write I/O flow to the controller as we do in the fast path. Signed-off-by: Javier González <javier@cnexlabs.com> Signed-off-by: Matias Bjørling <matias@cnexlabs.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers/lightnvm/pblk-core.c')
-rw-r--r--drivers/lightnvm/pblk-core.c61
1 files changed, 48 insertions, 13 deletions
diff --git a/drivers/lightnvm/pblk-core.c b/drivers/lightnvm/pblk-core.c
index 11fe0c5b2a9c..81501644fb15 100644
--- a/drivers/lightnvm/pblk-core.c
+++ b/drivers/lightnvm/pblk-core.c
@@ -1670,13 +1670,10 @@ void pblk_line_run_ws(struct pblk *pblk, struct pblk_line *line, void *priv,
1670 queue_work(wq, &line_ws->ws); 1670 queue_work(wq, &line_ws->ws);
1671} 1671}
1672 1672
1673void pblk_down_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas, 1673static void __pblk_down_page(struct pblk *pblk, struct ppa_addr *ppa_list,
1674 unsigned long *lun_bitmap) 1674 int nr_ppas, int pos)
1675{ 1675{
1676 struct nvm_tgt_dev *dev = pblk->dev; 1676 struct pblk_lun *rlun = &pblk->luns[pos];
1677 struct nvm_geo *geo = &dev->geo;
1678 struct pblk_lun *rlun;
1679 int pos = pblk_ppa_to_pos(geo, ppa_list[0]);
1680 int ret; 1677 int ret;
1681 1678
1682 /* 1679 /*
@@ -1690,14 +1687,8 @@ void pblk_down_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas,
1690 WARN_ON(ppa_list[0].g.lun != ppa_list[i].g.lun || 1687 WARN_ON(ppa_list[0].g.lun != ppa_list[i].g.lun ||
1691 ppa_list[0].g.ch != ppa_list[i].g.ch); 1688 ppa_list[0].g.ch != ppa_list[i].g.ch);
1692#endif 1689#endif
1693 /* If the LUN has been locked for this same request, do no attempt to
1694 * lock it again
1695 */
1696 if (test_and_set_bit(pos, lun_bitmap))
1697 return;
1698 1690
1699 rlun = &pblk->luns[pos]; 1691 ret = down_timeout(&rlun->wr_sem, msecs_to_jiffies(30000));
1700 ret = down_timeout(&rlun->wr_sem, msecs_to_jiffies(5000));
1701 if (ret) { 1692 if (ret) {
1702 switch (ret) { 1693 switch (ret) {
1703 case -ETIME: 1694 case -ETIME:
@@ -1710,6 +1701,50 @@ void pblk_down_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas,
1710 } 1701 }
1711} 1702}
1712 1703
1704void pblk_down_page(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas)
1705{
1706 struct nvm_tgt_dev *dev = pblk->dev;
1707 struct nvm_geo *geo = &dev->geo;
1708 int pos = pblk_ppa_to_pos(geo, ppa_list[0]);
1709
1710 __pblk_down_page(pblk, ppa_list, nr_ppas, pos);
1711}
1712
1713void pblk_down_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas,
1714 unsigned long *lun_bitmap)
1715{
1716 struct nvm_tgt_dev *dev = pblk->dev;
1717 struct nvm_geo *geo = &dev->geo;
1718 int pos = pblk_ppa_to_pos(geo, ppa_list[0]);
1719
1720 /* If the LUN has been locked for this same request, do no attempt to
1721 * lock it again
1722 */
1723 if (test_and_set_bit(pos, lun_bitmap))
1724 return;
1725
1726 __pblk_down_page(pblk, ppa_list, nr_ppas, pos);
1727}
1728
1729void pblk_up_page(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas)
1730{
1731 struct nvm_tgt_dev *dev = pblk->dev;
1732 struct nvm_geo *geo = &dev->geo;
1733 struct pblk_lun *rlun;
1734 int pos = pblk_ppa_to_pos(geo, ppa_list[0]);
1735
1736#ifdef CONFIG_NVM_DEBUG
1737 int i;
1738
1739 for (i = 1; i < nr_ppas; i++)
1740 WARN_ON(ppa_list[0].g.lun != ppa_list[i].g.lun ||
1741 ppa_list[0].g.ch != ppa_list[i].g.ch);
1742#endif
1743
1744 rlun = &pblk->luns[pos];
1745 up(&rlun->wr_sem);
1746}
1747
1713void pblk_up_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas, 1748void pblk_up_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas,
1714 unsigned long *lun_bitmap) 1749 unsigned long *lun_bitmap)
1715{ 1750{