Example #1
0
static struct threadrw_write_task *threadrw_buf_alloc_in(int num,
		int block_size,
		ssize_t (*write)(struct file *,
			struct stream_buf_s *,
			const char __user *, size_t, int))
{
	int task_buffer_size = sizeof(struct threadrw_write_task) +
				sizeof(struct threadrw_buf) * (num - 1) + 4;
	struct threadrw_write_task *task = vmalloc(task_buffer_size);
	int ret;

	if (!task)
		return NULL;
	memset(task, 0, task_buffer_size);

	spin_lock_init(&task->lock);
	INIT_DELAYED_WORK(&task->write_work, do_write_work);
	init_waitqueue_head(&task->wq);
	ret = kfifo_alloc(&task->datafifo, num, GFP_KERNEL);
	if (ret)
		goto err1;
	ret = kfifo_alloc(&task->freefifo, num, GFP_KERNEL);
	if (ret)
		goto err2;
	task->write = write;
	task->file = NULL;
	task->buffer_size = 0;
	ret = init_task_buffers(task, num, block_size);
	if (ret < 0)
		goto err3;
	threadrw_wq_get();	/*start thread. */
	return task;

err3:
	kfifo_free(&task->freefifo);
err2:
	kfifo_free(&task->datafifo);
err1:
	vfree(task);
	pr_err("alloc threadrw failed num:%d,block:%d\n", num, block_size);
	return NULL;
}
int LdaExecutorInit::run(int32_t _num_iters) {
    int suc;
    int64_t accum_time = 0;
    int64_t last_time = timer_st();
    int64_t run_time;
    if(exemode == ExeInitRun || exemode == ExeInitOnly) {
        try {
            extern_data_loader = new BufferManager(KNumExternDataBuffs*buffsize, buffsize, diskio);
        } catch(...) {
            return -1;
        }

        suc = task_buffer_mgr->init(internbase + ".task");
        if(suc < 0) return -1;

        suc = extern_data_loader->init_sequen_extern(extern_data_paths);
        if(suc < 0) return -1;

        suc = data_buffer_mgr->init(internbase + ".data");
        if(suc < 0) return -1;

        std::cout << "start initializing task buffers curr_time = " << accum_time << std::endl;
        last_time = timer_st();
        suc = init_task_buffers();
        assert(suc == 0);
        if(suc < 0) return -1;

        run_time = timer_ed(last_time);
        accum_time += run_time;
        std::cout << "done initializing task buffers curr_time = " << accum_time << std::endl;

        std::cout << "start initializing data buffers curr_time = " << accum_time << std::endl;
        last_time = timer_st();

        suc = init_data_buffers();
        assert(suc == 0);

        run_time = timer_ed(last_time);
        accum_time += run_time;
        std::cout << "done initializing data buffers curr_time = " << accum_time << std::endl;

        if(suc < 0) return -1;

        save_status();

        if(exemode == ExeInitOnly) {
            int32_t i;
            for(i = 0; i < num_my_init_data_buffs; ++i) {
                suc = data_buffer_mgr->putback(my_init_data_buffs[i], BufPolicyWriteBack);
                assert(suc == 0);
            }

            for(i = 0; i < num_my_task_buffs; ++i) {
                task_buffer_mgr->putback(my_task_buffs[i], BufPolicyWriteBack);
                assert(suc == 0);
            }

            delete extern_data_loader;
            extern_data_loader = NULL;
            data_buffer_mgr->stop();
            task_buffer_mgr->stop();
            return 0;
        }

        delete extern_data_loader;
        extern_data_loader = NULL;
        data_buffer_mgr->stop();
        task_buffer_mgr->stop();
    }

    int32_t num_task_iters = _num_iters;
    if(num_my_task_buffs == num_total_task_buffs)
        --num_task_iters;

    if(_num_iters > 0) {
        suc = task_buffer_mgr->init_sequen(internbase + ".task", num_my_task_buffs, _num_iters,
                                           num_total_task_buffs);
        assert(suc == 0);
        std::cout << "task_buffer_mgr init_sequen done" << std::endl;
    }

    int32_t num_data_iters = (num_total_task_buffs + num_task_buffs - 1)/num_task_buffs;
    suc = data_buffer_mgr->init_sequen(internbase + ".data", num_my_init_data_buffs,
                                       num_data_iters*_num_iters, num_total_data_buffs);
    assert(suc == 0);

    std::cout << "start executing tasks curr_time = " << accum_time << std::endl;

    int32_t iter;
    for(iter = 0; iter < _num_iters; ++iter) {
        last_time = timer_st();

        suc = execute_all_tasks(iter);
        if(suc < 0) return -1;

        run_time = timer_ed(last_time);
        accum_time += run_time;
        std::cout << "executed iteration = " << iter << " curr_time = " << accum_time << std::endl;
    }

    data_buffer_mgr->stop();
    task_buffer_mgr->stop();


    return 0;
}