static void ccci_req_enqueue(struct ccci_req_queue *queue, struct ccci_request *req)
{
    unsigned long flags;

    spin_lock_irqsave(&queue->req_lock, flags);
    ccci_request_struct_init(req);
    list_add_tail(&req->entry, &queue->req_list);
    queue->count++;
    spin_unlock_irqrestore(&queue->req_lock, flags);
}
static void ccci_req_queue_init(struct ccci_req_queue *queue)
{
    int i;
    queue->max_len = BM_POOL_SIZE + 2000;
    INIT_LIST_HEAD(&queue->req_list);
    for(i=0; i<queue->max_len; i++) {
        struct ccci_request *req = kmalloc(sizeof(struct ccci_request), GFP_KERNEL);
        ccci_request_struct_init(req);
        list_add_tail(&req->entry, &queue->req_list);
    }
    queue->count = queue->max_len;
    spin_lock_init(&queue->req_lock);
    init_waitqueue_head(&queue->req_wq);
}
Example #3
0
int ccci_subsys_bm_init(void)
{
	int i;
	struct sk_buff *skb = NULL;

	CCCI_INF_MSG(-1, BM, "MTU=%d/%d, pool size %d/%d/%d\n", CCCI_MTU, CCMNI_MTU, 
		SKB_POOL_SIZE_4K, SKB_POOL_SIZE_1_5K, SKB_POOL_SIZE_16);
	// init ccci_request
	for(i=0; i<BM_POOL_SIZE; i++) {
		ccci_request_struct_init(&req_pool[i]);
	}
	// init skb pool
	skb_queue_head_init(&skb_pool_4K.skb_list);
	skb_pool_4K.max_len = SKB_POOL_SIZE_4K;
	for(i=0; i<SKB_POOL_SIZE_4K; i++) {
		skb = dev_alloc_skb(SKB_4K);
		skb_queue_tail(&skb_pool_4K.skb_list, skb);
	}
	skb_queue_head_init(&skb_pool_1_5K.skb_list);
	skb_pool_1_5K.max_len = SKB_POOL_SIZE_1_5K;
	skb = NULL;
	for(i=0; i<SKB_POOL_SIZE_1_5K; i++) {
		skb = dev_alloc_skb(SKB_1_5K);
		skb_queue_tail(&skb_pool_1_5K.skb_list, skb);
	}
	skb_queue_head_init(&skb_pool_16.skb_list);
	skb_pool_16.max_len = SKB_POOL_SIZE_16;
	skb = NULL;
	for(i=0; i<SKB_POOL_SIZE_16; i++) {
		skb = dev_alloc_skb(SKB_16);
		skb_queue_tail(&skb_pool_16.skb_list, skb);
	}
	// init pool reload work
	pool_reload_work_queue = alloc_workqueue("pool_reload_work", WQ_UNBOUND | WQ_MEM_RECLAIM | WQ_HIGHPRI, 1);
	INIT_WORK(&skb_pool_4K.reload_work, __4K_reload_work);
	INIT_WORK(&skb_pool_1_5K.reload_work, __1_5K_reload_work);
	INIT_WORK(&skb_pool_16.reload_work, __16_reload_work);
	
#ifdef CCCI_STATISTIC
	init_timer(&ccci_bm_stat_timer);
	ccci_bm_stat_timer.function = ccci_bm_stat_timer_func;
	mod_timer(&ccci_bm_stat_timer, jiffies+10*HZ);
#endif
	spin_lock_init(&req_pool_lock);
	init_waitqueue_head(&req_pool_wq);
	return 0;
}
int ccci_subsys_bm_init(void)
{
	int i;
	struct sk_buff *skb = NULL;

	CCCI_DBG_MSG(-1, BM, "req_pool=%p\n", req_pool);
	// init ccci_request
	for(i=0; i<BM_POOL_SIZE; i++) {
		ccci_request_struct_init(&req_pool[i]);
	}
	// init skb pool
	skb_queue_head_init(&skb_pool_4K);
	for(i=0; i<SKB_POOL_SIZE_4K; i++) {
		skb = dev_alloc_skb(SKB_4K);
		skb_queue_tail(&skb_pool_4K, skb);
	}
	skb_queue_head_init(&skb_pool_1_5K);
	skb = NULL;
	for(i=0; i<SKB_POOL_SIZE_1_5K; i++) {
		skb = dev_alloc_skb(SKB_1_5K);
		skb_queue_tail(&skb_pool_1_5K, skb);
	}
	skb_queue_head_init(&skb_pool_16);
	skb = NULL;
	for(i=0; i<SKB_POOL_SIZE_16; i++) {
		skb = dev_alloc_skb(SKB_16);
		skb_queue_tail(&skb_pool_16, skb);
	}
	// init pool reload work
	pool_reload_work_queue = create_singlethread_workqueue("pool_reload_work");
	INIT_WORK(&_4K_reload_work, __4K_reload_work);
	INIT_WORK(&_1_5K_reload_work, __1_5K_reload_work);
	INIT_WORK(&_16_reload_work, __16_reload_work);
	
	spin_lock_init(&req_pool_lock);
	init_waitqueue_head(&req_pool_wq);
	return 0;
}