Lines Matching refs:kc

71 static void wake(struct dm_kcopyd_client *kc)
73 queue_work(kc->kcopyd_wq, &kc->kcopyd_work);
106 static void kcopyd_put_pages(struct dm_kcopyd_client *kc, struct page_list *pl)
113 if (kc->nr_free_pages >= kc->nr_reserved_pages)
116 pl->next = kc->pages;
117 kc->pages = pl;
118 kc->nr_free_pages++;
125 static int kcopyd_get_pages(struct dm_kcopyd_client *kc,
136 pl = kc->pages;
139 kc->pages = pl->next;
140 kc->nr_free_pages--;
150 kcopyd_put_pages(kc, *pages);
171 static int client_reserve_pages(struct dm_kcopyd_client *kc, unsigned nr_pages)
187 kc->nr_reserved_pages += nr_pages;
188 kcopyd_put_pages(kc, pl);
193 static void client_free_pages(struct dm_kcopyd_client *kc)
195 BUG_ON(kc->nr_free_pages != kc->nr_reserved_pages);
196 drop_pages(kc->pages);
197 kc->pages = NULL;
198 kc->nr_free_pages = kc->nr_reserved_pages = 0;
207 struct dm_kcopyd_client *kc;
276 struct dm_kcopyd_client *kc)
281 spin_lock_irqsave(&kc->job_lock, flags);
287 spin_unlock_irqrestore(&kc->job_lock, flags);
295 struct dm_kcopyd_client *kc = job->kc;
297 spin_lock_irqsave(&kc->job_lock, flags);
299 spin_unlock_irqrestore(&kc->job_lock, flags);
306 struct dm_kcopyd_client *kc = job->kc;
308 spin_lock_irqsave(&kc->job_lock, flags);
310 spin_unlock_irqrestore(&kc->job_lock, flags);
328 struct dm_kcopyd_client *kc = job->kc;
331 kcopyd_put_pages(kc, job->pages);
337 mempool_free(job, kc->job_pool);
340 if (atomic_dec_and_test(&kc->nr_jobs))
341 wake_up(&kc->destroyq);
349 struct dm_kcopyd_client *kc = job->kc;
358 push(&kc->complete_jobs, job);
359 wake(kc);
365 push(&kc->complete_jobs, job);
369 push(&kc->io_jobs, job);
372 wake(kc);
389 .client = job->kc->io_client,
405 r = kcopyd_get_pages(job->kc, nr_pages, &job->pages);
408 push(&job->kc->io_jobs, job);
423 static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc,
429 while ((job = pop(jobs, kc))) {
439 push(&kc->complete_jobs, job);
463 struct dm_kcopyd_client *kc = container_of(work,
475 process_jobs(&kc->complete_jobs, kc, run_complete_job);
476 process_jobs(&kc->pages_jobs, kc, run_pages_job);
477 process_jobs(&kc->io_jobs, kc, run_io_job);
488 struct dm_kcopyd_client *kc = job->kc;
489 atomic_inc(&kc->nr_jobs);
491 push(&kc->complete_jobs, job);
493 push(&kc->io_jobs, job);
495 push(&kc->pages_jobs, job);
496 wake(kc);
507 struct dm_kcopyd_client *kc = job->kc;
562 push(&kc->complete_jobs, job);
563 wake(kc);
574 atomic_inc(&master_job->kc->nr_jobs);
583 int dm_kcopyd_copy(struct dm_kcopyd_client *kc, struct dm_io_region *from,
593 job = mempool_alloc(kc->job_pool, GFP_NOIO);
598 job->kc = kc;
633 int dm_kcopyd_zero(struct dm_kcopyd_client *kc,
637 return dm_kcopyd_copy(kc, NULL, num_dests, dests, flags, fn, context);
641 void *dm_kcopyd_prepare_callback(struct dm_kcopyd_client *kc,
646 job = mempool_alloc(kc->job_pool, GFP_NOIO);
649 job->kc = kc;
654 atomic_inc(&kc->nr_jobs);
663 struct dm_kcopyd_client *kc = job->kc;
668 push(&kc->complete_jobs, job);
669 wake(kc);
691 struct dm_kcopyd_client *kc;
693 kc = kmalloc(sizeof(*kc), GFP_KERNEL);
694 if (!kc)
697 spin_lock_init(&kc->job_lock);
698 INIT_LIST_HEAD(&kc->complete_jobs);
699 INIT_LIST_HEAD(&kc->io_jobs);
700 INIT_LIST_HEAD(&kc->pages_jobs);
702 kc->job_pool = mempool_create_slab_pool(MIN_JOBS, _job_cache);
703 if (!kc->job_pool)
706 INIT_WORK(&kc->kcopyd_work, do_work);
707 kc->kcopyd_wq = alloc_workqueue("kcopyd",
709 if (!kc->kcopyd_wq)
712 kc->pages = NULL;
713 kc->nr_reserved_pages = kc->nr_free_pages = 0;
714 r = client_reserve_pages(kc, RESERVE_PAGES);
718 kc->io_client = dm_io_client_create();
719 if (IS_ERR(kc->io_client)) {
720 r = PTR_ERR(kc->io_client);
724 init_waitqueue_head(&kc->destroyq);
725 atomic_set(&kc->nr_jobs, 0);
727 return kc;
730 client_free_pages(kc);
732 destroy_workqueue(kc->kcopyd_wq);
734 mempool_destroy(kc->job_pool);
736 kfree(kc);
742 void dm_kcopyd_client_destroy(struct dm_kcopyd_client *kc)
745 wait_event(kc->destroyq, !atomic_read(&kc->nr_jobs));
747 BUG_ON(!list_empty(&kc->complete_jobs));
748 BUG_ON(!list_empty(&kc->io_jobs));
749 BUG_ON(!list_empty(&kc->pages_jobs));
750 destroy_workqueue(kc->kcopyd_wq);
751 dm_io_client_destroy(kc->io_client);
752 client_free_pages(kc);
753 mempool_destroy(kc->job_pool);
754 kfree(kc);