Merge "msm: ipa: Fix to free up all pending EOB pages"
此提交包含在:
@@ -3938,21 +3938,25 @@ static struct sk_buff *handle_page_completion(struct gsi_chan_xfer_notify
|
|||||||
sys->ep->client == IPA_CLIENT_APPS_LAN_CONS) {
|
sys->ep->client == IPA_CLIENT_APPS_LAN_CONS) {
|
||||||
rx_skb = alloc_skb(0, GFP_ATOMIC);
|
rx_skb = alloc_skb(0, GFP_ATOMIC);
|
||||||
if (unlikely(!rx_skb)) {
|
if (unlikely(!rx_skb)) {
|
||||||
IPAERR("skb alloc failure\n");
|
IPAERR("skb alloc failure, free all pending pages\n");
|
||||||
list_del_init(&rx_pkt->link);
|
list_for_each_entry_safe(rx_pkt, tmp, head, link) {
|
||||||
if (!rx_page.is_tmp_alloc) {
|
rx_page = rx_pkt->page_data;
|
||||||
init_page_count(rx_page.page);
|
size = rx_pkt->data_len;
|
||||||
spin_lock_bh(&rx_pkt->sys->spinlock);
|
list_del_init(&rx_pkt->link);
|
||||||
/* Add the element to head. */
|
if (!rx_page.is_tmp_alloc) {
|
||||||
list_add(&rx_pkt->link,
|
init_page_count(rx_page.page);
|
||||||
&rx_pkt->sys->page_recycle_repl->page_repl_head);
|
spin_lock_bh(&rx_pkt->sys->spinlock);
|
||||||
spin_unlock_bh(&rx_pkt->sys->spinlock);
|
/* Add the element to head. */
|
||||||
} else {
|
list_add(&rx_pkt->link,
|
||||||
dma_unmap_page(ipa3_ctx->pdev, rx_page.dma_addr,
|
&rx_pkt->sys->page_recycle_repl->page_repl_head);
|
||||||
rx_pkt->len, DMA_FROM_DEVICE);
|
spin_unlock_bh(&rx_pkt->sys->spinlock);
|
||||||
__free_pages(rx_pkt->page_data.page, sys->page_order);
|
} else {
|
||||||
|
dma_unmap_page(ipa3_ctx->pdev, rx_page.dma_addr,
|
||||||
|
rx_pkt->len, DMA_FROM_DEVICE);
|
||||||
|
__free_pages(rx_pkt->page_data.page, sys->page_order);
|
||||||
|
}
|
||||||
|
rx_pkt->sys->free_rx_wrapper(rx_pkt);
|
||||||
}
|
}
|
||||||
rx_pkt->sys->free_rx_wrapper(rx_pkt);
|
|
||||||
IPA_STATS_INC_CNT(ipa3_ctx->stats.rx_page_drop_cnt);
|
IPA_STATS_INC_CNT(ipa3_ctx->stats.rx_page_drop_cnt);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
新增問題並參考
封鎖使用者