Signed-off-by: Alexander Atanasov <alexander.atana...@virtuozzo.com> --- drivers/md/dm-ploop-map.c | 39 ++++++++++++++++++++++++++++++------ drivers/md/dm-ploop-target.c | 23 +++++++++++++++++++++ drivers/md/dm-ploop.h | 2 ++ 3 files changed, 58 insertions(+), 6 deletions(-)
diff --git a/drivers/md/dm-ploop-map.c b/drivers/md/dm-ploop-map.c index 574ed9045c2d..4587b2c19df9 100644 --- a/drivers/md/dm-ploop-map.c +++ b/drivers/md/dm-ploop-map.c @@ -71,6 +71,7 @@ void ploop_index_wb_init(struct ploop_index_wb *piwb, struct ploop *ploop) piwb->flush_pio = NULL; } +static unsigned long pio_seqno; void ploop_init_pio(struct ploop *ploop, unsigned int bi_op, struct pio *pio) { pio->ploop = ploop; @@ -91,6 +92,7 @@ void ploop_init_pio(struct ploop *ploop, unsigned int bi_op, struct pio *pio) /* FIXME: assign real clu? */ pio->clu = UINT_MAX; pio->level = BAT_LEVEL_INVALID; + pio->seqno = pio_seqno++; } /* Check that rq end byte is not behind end of device */ @@ -216,13 +218,15 @@ static void ploop_do_pio_endio(struct pio *pio) void *endio_cb_data = pio->endio_cb_data; bool free_on_endio = pio->free_on_endio; + // if (free_on_endio) printk(KERN_ERR "pend:%ld rem:%d\n", pio->seqno, atomic_read(&pio->remaining)); if (!atomic_dec_and_test(&pio->remaining)) return; endio_cb(pio, endio_cb_data, pio->bi_status); - - if (free_on_endio) + if (free_on_endio) { + // printk(KERN_ERR "fpio:%ld\n", pio->seqno); ploop_free_pio(pio->ploop, pio); + } } void ploop_pio_endio(struct pio *pio) @@ -241,6 +245,7 @@ static void ploop_pio_chain_endio(struct pio *pio, void *parent_ptr, if (unlikely(bi_status)) parent->bi_status = bi_status; + // printk(KERN_ERR "chain endio:%ld\n", pio->seqno); ploop_do_pio_endio(parent); } @@ -252,6 +257,7 @@ static void ploop_pio_chain(struct pio *pio, struct pio *parent) pio->endio_cb_data = parent; pio->endio_cb = ploop_pio_chain_endio; atomic_inc(&parent->remaining); + // printk(KERN_ERR "chain:%ld rem:%d\n", pio->seqno, atomic_read(&parent->remaining)); } /* Clone of bio_advance_iter() */ @@ -345,6 +351,7 @@ ALLOW_ERROR_INJECTION(ploop_split_pio_to_list, ERRNO); static void ploop_schedule_work(struct ploop *ploop) { #ifndef USE_KTHREAD +#warning Need to flush delayed md pages queue_work(ploop->wq, &ploop->worker); #else wake_up_process(ploop->kt_worker->task); @@ -361,6 +368,7 @@ static void ploop_dispatch_pio(struct ploop *ploop, struct pio *pio) if (pio->queue_list_id == PLOOP_LIST_FLUSH) list = (struct llist_head *)&ploop->pios[PLOOP_LIST_PREPARE]; + // printk(KERN_ERR "disp: %ld q:%d", pio->seqno, pio->queue_list_id); llist_add((struct llist_node *)(&pio->list), list); } @@ -392,6 +400,7 @@ static bool ploop_delay_if_md_busy(struct ploop *ploop, struct md_page *md, if (piwb && (piwb->type != type || test_bit(MD_WRITEBACK, &md->status))) { llist_add((struct llist_node *)(&pio->list), &md->wait_llist); busy = true; + printk(KERN_ERR "p:%ld delay\n", pio->seqno); } read_unlock_irqrestore(&md->lock, flags); @@ -835,21 +844,29 @@ static void ploop_advance_local_after_bat_wb(struct ploop *ploop, wait_llist_pending = llist_del_all(&md->wait_llist); if (wait_llist_pending) { + printk(KERN_ERR "mdwb:mlist"); llist_for_each_safe(pos, t, wait_llist_pending) { pio = list_entry((struct list_head *)pos, typeof(*pio), list); list_add(&pio->list, &list); + printk(KERN_ERR "resume:%ld\n", pio->seqno); } } - if (!list_empty(&list)) + if (!list_empty(&list)) { + printk(KERN_ERR "mdwb:slist"); ploop_dispatch_pios(ploop, NULL, &list); + } } static void ploop_free_piwb(struct ploop_index_wb *piwb) { - kunmap(piwb->kmpage); + WARN_ON(!piwb); + if (!piwb) return; + if (piwb->kmpage) + kunmap(piwb->kmpage); ploop_free_pio(piwb->ploop, piwb->pio); - put_page(piwb->bat_page); + if (piwb->bat_page) + put_page(piwb->bat_page); kfree(piwb); } @@ -918,8 +935,13 @@ static void ploop_bat_write_complete(struct pio *pio, void *piwb_ptr, } if (flush_pio) { - if (atomic_dec_and_test(&flush_pio->md_inflight)) + if (atomic_dec_and_test(&flush_pio->md_inflight)) { + printk(KERN_ERR "fl rdy:%ld\n", flush_pio->seqno); ploop_dispatch_pios(ploop, flush_pio, NULL); + } else { + printk(KERN_ERR "fl %ld seqno:%ld\n", atomic_read(&flush_pio->md_inflight), flush_pio->seqno); + } + piwb->flush_pio = NULL; } @@ -1792,10 +1814,12 @@ static void ploop_process_one_discard_pio(struct ploop *ploop, struct pio *pio) ploop_md_make_dirty(ploop, md); ploop_md_up_prio(ploop, md); out: + // printk(KERN_ERR "disc:2:%ld\n", pio->seqno); return; err: if (bat_update_prepared) ploop_break_bat_update(ploop, md); + // printk(KERN_ERR "disc:3:%ld\n", pio->seqno); ploop_pio_endio(pio); } @@ -1857,6 +1881,7 @@ static void ploop_submit_metadata_writeback(struct ploop *ploop) clear_bit(MD_HIGHPRIO, &md->status); ploop_index_wb_submit(ploop, md->piwb); } else { + printk(KERN_ERR "abwbl\n"); llist_add((struct llist_node *)&md->wb_link, &ploop->wb_batch_llist); } } @@ -1869,6 +1894,7 @@ static void process_ploop_fsync_work(struct ploop *ploop, struct llist_node *llf int ret; struct llist_node *pos, *t; + // printk(KERN_ERR "ploop:vfs_sync\n"); file = ploop_top_delta(ploop)->file; /* All flushes are done as one */ ret = vfs_fsync(file, 0); @@ -2025,6 +2051,7 @@ static int ploop_prepare_flush(struct ploop *ploop, struct pio *pio) atomic_set(&flush_pio->md_inflight, md_inflight); write_unlock_irq(&ploop->bat_rwlock); + if (md_inflight) printk(KERN_ERR "md_inf:%d\n", md_inflight); return md_inflight; } diff --git a/drivers/md/dm-ploop-target.c b/drivers/md/dm-ploop-target.c index d2dfc4389050..eff445e2dd95 100644 --- a/drivers/md/dm-ploop-target.c +++ b/drivers/md/dm-ploop-target.c @@ -20,6 +20,8 @@ #include <linux/vmalloc.h> #include <linux/uio.h> #include <linux/error-injection.h> +#include <linux/llist.h> +#include <linux/hashtable.h> #include "dm-ploop.h" #define DM_MSG_PREFIX "ploop" @@ -159,10 +161,30 @@ static bool ploop_empty_htable(struct hlist_head head[]) return true; } +static void print_ploop_lists(struct ploop *ploop) +{ +#ifdef PLOOP_DEBUG + int i; + + for (i = 0; i < PLOOP_LIST_COUNT; i++) { + printk(KERN_ERR "list:%d %d\n", i, !!llist_empty(&ploop->pios[i])); + } + printk(KERN_ERR "lk_list: %d\n", !!list_empty(&ploop->cluster_lk_list)); + printk(KERN_ERR "susp: %d\n", !!llist_empty(&ploop->llsuspended_pios)); + printk(KERN_ERR "nospcs: %d\n", !!llist_empty(&ploop->enospc_pios)); + if (ploop->inflight_pios) + printk(KERN_ERR "inflht: %d\n", !!ploop_empty_htable(ploop->exclusive_pios)); + if (ploop->exclusive_pios) + printk(KERN_ERR "excls: %d\n", !!ploop_empty_htable(ploop->inflight_pios)); +#endif +} + + static void ploop_destroy(struct ploop *ploop) { int i; + print_ploop_lists(ploop); if (ploop->wq) { flush_workqueue(ploop->wq); destroy_workqueue(ploop->wq); @@ -189,6 +211,7 @@ static void ploop_destroy(struct ploop *ploop) // TODO: check if any pios left and end them with error kfree(ploop->kt_worker); } + print_ploop_lists(ploop); for (i = 0; i < 2; i++) percpu_ref_exit(&ploop->inflight_bios_ref[i]); diff --git a/drivers/md/dm-ploop.h b/drivers/md/dm-ploop.h index e369d223da91..b605d37196dc 100644 --- a/drivers/md/dm-ploop.h +++ b/drivers/md/dm-ploop.h @@ -305,6 +305,8 @@ struct pio { void *data; atomic_t md_inflight; + + unsigned long seqno; }; /* Delta COW private */ -- 2.43.0 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel