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)
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) {