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); }
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; }