diff options
| author | Javier González <jg@lightnvm.io> | 2017-07-07 15:08:52 -0400 |
|---|---|---|
| committer | Jens Axboe <axboe@kernel.dk> | 2017-07-07 15:17:34 -0400 |
| commit | 3eaa11e2780dc38350c133bd998cac1df488d040 (patch) | |
| tree | 72f51ca76c7ae028386bd614220faf97d56b1cfd /drivers/lightnvm/pblk-core.c | |
| parent | 0e2ff11311d1d4c85dd9ad9ba4347775f628e94a (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.c | 61 |
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 | ||
| 1673 | void pblk_down_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas, | 1673 | static 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 | ||
| 1704 | void 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 | |||
| 1713 | void 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 | |||
| 1729 | void 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 | |||
| 1713 | void pblk_up_rq(struct pblk *pblk, struct ppa_addr *ppa_list, int nr_ppas, | 1748 | void 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 | { |
