void ccci_free_req(struct ccci_request *req) { unsigned long flags; CCCI_DBG_MSG(-1, BM, "%ps free req=%p, policy=%d, skb=%p, len=%d\n", __builtin_return_address(0), req, req->policy, req->skb, skb_size(req->skb)); if(req->skb) ccci_free_skb(req->skb, req->policy); spin_lock_irqsave(&req_pool_lock, flags); // 1. reset the request req->state = IDLE; req->skb = NULL; /* * do NOT reset req->entry here, always maitain it by list API (list_del). * for Tx requests, they are never in any queue, so no extra effort when delete them. * but for Rx request, we must make sure list_del is called once before we free them. */ if(req->entry.next != LIST_POISON1 || req->entry.prev != LIST_POISON2) { CCCI_ERR_MSG(-1, BM, "req %p entry not deleted yet, from %ps\n", req, __builtin_return_address(0)); list_del(&req->entry); } // 2. wake up pending allocation req_pool_cnt++; CCCI_DBG_MSG(-1, BM, "pool count+=%d\n", req_pool_cnt); spin_unlock_irqrestore(&req_pool_lock, flags); wake_up_all(&req_pool_wq); }
void ccci_free_req(struct ccci_request *req) { CCCI_DBG_MSG(-1, BM, "%ps free req=%p, policy=%d, skb=%p\n", __builtin_return_address(0), req, req->policy, req->skb); if(req->skb) ccci_free_skb(req->skb, req->policy); if(req->entry.next != LIST_POISON1 || req->entry.prev != LIST_POISON2) { CCCI_ERR_MSG(-1, BM, "req %p entry not deleted yet, from %ps\n", req, __builtin_return_address(0)); list_del(&req->entry); } ccci_req_enqueue(&req_pool, req); wake_up_all(&req_pool.req_wq); }