net: esp: fix bad handling of pages from page_pool
[linux-2.6-microblaze.git] / net / ipv4 / esp4.c
index 4dd9e50..d33d124 100644 (file)
@@ -95,7 +95,7 @@ static inline struct scatterlist *esp_req_sg(struct crypto_aead *aead,
                             __alignof__(struct scatterlist));
 }
 
-static void esp_ssg_unref(struct xfrm_state *x, void *tmp)
+static void esp_ssg_unref(struct xfrm_state *x, void *tmp, struct sk_buff *skb)
 {
        struct crypto_aead *aead = x->data;
        int extralen = 0;
@@ -114,7 +114,7 @@ static void esp_ssg_unref(struct xfrm_state *x, void *tmp)
         */
        if (req->src != req->dst)
                for (sg = sg_next(req->src); sg; sg = sg_next(sg))
-                       put_page(sg_page(sg));
+                       skb_page_unref(skb, sg_page(sg), false);
 }
 
 #ifdef CONFIG_INET_ESPINTCP
@@ -260,7 +260,7 @@ static void esp_output_done(void *data, int err)
        }
 
        tmp = ESP_SKB_CB(skb)->tmp;
-       esp_ssg_unref(x, tmp);
+       esp_ssg_unref(x, tmp, skb);
        kfree(tmp);
 
        if (xo && (xo->flags & XFRM_DEV_RESUME)) {
@@ -639,7 +639,7 @@ int esp_output_tail(struct xfrm_state *x, struct sk_buff *skb, struct esp_info *
        }
 
        if (sg != dsg)
-               esp_ssg_unref(x, tmp);
+               esp_ssg_unref(x, tmp, skb);
 
        if (!err && x->encap && x->encap->encap_type == TCP_ENCAP_ESPINTCP)
                err = esp_output_tail_tcp(x, skb);