Revert "IB/fmr_pool: ib_fmr_pool_flush() should flush all dirty FMRs"
This reverts commit a3cd7d9070
.
The original commit breaks iSER reliably, making it complain:
iser: iser_reg_page_vec:ib_fmr_pool_map_phys failed: -11
The FMR cleanup thread runs ib_fmr_batch_release() as dirty entries
build up. This commit causes clean but used FMR entries also to be
purged. During that process, another thread can see that there are no
free FMRs and fail, even though there should always have been enough
available.
Signed-off-by: Pete Wyckoff <pw@osc.edu>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
parent
84ba284cd7
commit
35fb5340e3
|
@ -139,7 +139,7 @@ static inline struct ib_pool_fmr *ib_fmr_cache_lookup(struct ib_fmr_pool *pool,
|
||||||
static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
|
static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
struct ib_pool_fmr *fmr, *next;
|
struct ib_pool_fmr *fmr;
|
||||||
LIST_HEAD(unmap_list);
|
LIST_HEAD(unmap_list);
|
||||||
LIST_HEAD(fmr_list);
|
LIST_HEAD(fmr_list);
|
||||||
|
|
||||||
|
@ -158,20 +158,6 @@ static void ib_fmr_batch_release(struct ib_fmr_pool *pool)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* The free_list may hold FMRs that have been put there
|
|
||||||
* because they haven't reached the max_remap count.
|
|
||||||
* Invalidate their mapping as well.
|
|
||||||
*/
|
|
||||||
list_for_each_entry_safe(fmr, next, &pool->free_list, list) {
|
|
||||||
if (fmr->remap_count == 0)
|
|
||||||
continue;
|
|
||||||
hlist_del_init(&fmr->cache_node);
|
|
||||||
fmr->remap_count = 0;
|
|
||||||
list_add_tail(&fmr->fmr->list, &fmr_list);
|
|
||||||
list_move(&fmr->list, &unmap_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
list_splice(&pool->dirty_list, &unmap_list);
|
list_splice(&pool->dirty_list, &unmap_list);
|
||||||
INIT_LIST_HEAD(&pool->dirty_list);
|
INIT_LIST_HEAD(&pool->dirty_list);
|
||||||
pool->dirty_len = 0;
|
pool->dirty_len = 0;
|
||||||
|
@ -384,6 +370,11 @@ void ib_destroy_fmr_pool(struct ib_fmr_pool *pool)
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) {
|
list_for_each_entry_safe(fmr, tmp, &pool->free_list, list) {
|
||||||
|
if (fmr->remap_count) {
|
||||||
|
INIT_LIST_HEAD(&fmr_list);
|
||||||
|
list_add_tail(&fmr->fmr->list, &fmr_list);
|
||||||
|
ib_unmap_fmr(&fmr_list);
|
||||||
|
}
|
||||||
ib_dealloc_fmr(fmr->fmr);
|
ib_dealloc_fmr(fmr->fmr);
|
||||||
list_del(&fmr->list);
|
list_del(&fmr->list);
|
||||||
kfree(fmr);
|
kfree(fmr);
|
||||||
|
|
Loading…
Reference in New Issue