From 91fac0455a90e9db349553c48713a9a290c04e5a Mon Sep 17 00:00:00 2001 From: "Michael S. Tsirkin" Date: Tue, 4 Jul 2006 10:20:42 +0300 Subject: [PATCH] IB/sdp: Fix memory leak in SDP --- drivers/infiniband/ulp/sdp/sdp_bcopy.c | 9 ++++++++- drivers/infiniband/ulp/sdp/sdp_main.c | 7 +++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/infiniband/ulp/sdp/sdp_bcopy.c b/drivers/infiniband/ulp/sdp/sdp_bcopy.c index 3ae96e7478d0..07e06dd70f82 100644 --- a/drivers/infiniband/ulp/sdp/sdp_bcopy.c +++ b/drivers/infiniband/ulp/sdp/sdp_bcopy.c @@ -285,9 +285,16 @@ static inline int sdp_sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb) static inline void update_send_head(struct sock *sk, struct sk_buff *skb) { + struct page *page; sk->sk_send_head = skb->next; - if (sk->sk_send_head == (struct sk_buff *)&sk->sk_write_queue) + if (sk->sk_send_head == (struct sk_buff *)&sk->sk_write_queue) { sk->sk_send_head = NULL; + page = sk->sk_sndmsg_page; + if (page) { + put_page(page); + sk->sk_sndmsg_page = NULL; + } + } } void sdp_post_sends(struct sdp_sock *ssk, int nonagle) diff --git a/drivers/infiniband/ulp/sdp/sdp_main.c b/drivers/infiniband/ulp/sdp/sdp_main.c index aa8621f91ad9..9f10810f06c4 100644 --- a/drivers/infiniband/ulp/sdp/sdp_main.c +++ b/drivers/infiniband/ulp/sdp/sdp_main.c @@ -128,6 +128,13 @@ void sdp_close_sk(struct sock *sk) sk->sk_send_head = NULL; skb_queue_purge(&sk->sk_write_queue); + /* + * If sendmsg cached page exists, toss it. + */ + if (sk->sk_sndmsg_page) { + __free_page(sk->sk_sndmsg_page); + sk->sk_sndmsg_page = NULL; + } id = ssk->id; if (ssk->id) { -- 2.50.1