From 121aeb5fea77458b834a9dc4b2badfebb0cb0c95 Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Tue, 25 Jul 2006 18:37:54 +0300 Subject: [PATCH] IB/sdp:Free unused pages. --- drivers/infiniband/ulp/sdp/sdp_bcopy.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index e71d4d148570..9e25c2c2e751 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -35,6 +35,7 @@ #include #include #include +#include #include "sdp.h" /* Like tcp_fin */ @@ -360,6 +361,7 @@ static void sdp_handle_wc(struct sdp_sock *ssk, struct ib_wc *wc) { struct sk_buff *skb; struct sdp_bsdh *h; + int i; if (wc->wr_id & SDP_OP_RECV) { skb = sdp_recv_completion(ssk, wc->wr_id); @@ -393,17 +395,22 @@ static void sdp_handle_wc(struct sdp_sock *ssk, struct ib_wc *wc) ssk->bufs = ntohl(h->mseq_ack) - ssk->tx_head + 1 + ntohs(h->bufs); + skb->truesize = sizeof(struct sdp_bsdh) + + PAGE_ALIGN(skb->data_len); + + for (i = PFN_ALIGN(skb->data_len) + 1; + i < SDP_MAX_SEND_SKB_FRAGS; ++i) + __free_page(skb_shinfo(skb)->frags[i].page); + if (likely(h->mid == SDP_MID_DATA) && likely(skb->data_len > 0)) { skb_pull(skb, sizeof(struct sdp_bsdh)); /* TODO: queue can fail? */ - /* TODO: free unused fragments */ sdp_sock_queue_rcv_skb(&ssk->isk.sk, skb); } else if (likely(h->mid == SDP_MID_DATA)) { __kfree_skb(skb); } else if (h->mid == SDP_MID_DISCONN) { skb_pull(skb, sizeof(struct sdp_bsdh)); - /* TODO: free unused fragments */ /* this will wake recvmsg */ sdp_sock_queue_rcv_skb(&ssk->isk.sk, skb); sdp_fin(&ssk->isk.sk); -- 2.50.1