Re: [PATCH][net-next] packet: switch kvzalloc to allocate memory

2018-08-10 Thread David Miller
From: Li RongQing 
Date: Fri, 10 Aug 2018 18:00:00 +0800

> @@ -4275,7 +4259,7 @@ static int packet_set_ring(struct sock *sk, union 
> tpacket_req_u *req_u,
>  
>   err = -ENOMEM;
>   order = get_order(req->tp_block_size);
> - pg_vec = alloc_pg_vec(req, order);
> + pg_vec = alloc_pg_vec(req);
>   if (unlikely(!pg_vec))
>   goto out;
>   switch (po->tp_version) {

Variable 'order' is now unused.


[PATCH][net-next] packet: switch kvzalloc to allocate memory

2018-08-10 Thread Li RongQing
Use modern kvzalloc()/kvfree() instead of custom allocations.
And remove order argument for free_pg_vec and alloc_pg_vec,
this argument is useless to kvfree, or can get from req.

Signed-off-by: Zhang Yu 
Signed-off-by: Li RongQing 
---
 net/packet/af_packet.c | 40 
 1 file changed, 12 insertions(+), 28 deletions(-)

diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
index 75c92a87e7b2..f28fcaba4f36 100644
--- a/net/packet/af_packet.c
+++ b/net/packet/af_packet.c
@@ -4137,52 +4137,36 @@ static const struct vm_operations_struct 
packet_mmap_ops = {
.close  =   packet_mm_close,
 };
 
-static void free_pg_vec(struct pgv *pg_vec, unsigned int order,
-   unsigned int len)
+static void free_pg_vec(struct pgv *pg_vec, unsigned int len)
 {
int i;
 
for (i = 0; i < len; i++) {
if (likely(pg_vec[i].buffer)) {
-   if (is_vmalloc_addr(pg_vec[i].buffer))
-   vfree(pg_vec[i].buffer);
-   else
-   free_pages((unsigned long)pg_vec[i].buffer,
-  order);
+   kvfree(pg_vec[i].buffer);
pg_vec[i].buffer = NULL;
}
}
kfree(pg_vec);
 }
 
-static char *alloc_one_pg_vec_page(unsigned long order)
+static char *alloc_one_pg_vec_page(unsigned long size)
 {
char *buffer;
-   gfp_t gfp_flags = GFP_KERNEL | __GFP_COMP |
- __GFP_ZERO | __GFP_NOWARN | __GFP_NORETRY;
 
-   buffer = (char *) __get_free_pages(gfp_flags, order);
+   buffer = kvzalloc(size, GFP_KERNEL);
if (buffer)
return buffer;
 
-   /* __get_free_pages failed, fall back to vmalloc */
-   buffer = vzalloc(array_size((1 << order), PAGE_SIZE));
-   if (buffer)
-   return buffer;
+   buffer = kvzalloc(size, GFP_KERNEL | __GFP_RETRY_MAYFAIL);
 
-   /* vmalloc failed, lets dig into swap here */
-   gfp_flags &= ~__GFP_NORETRY;
-   buffer = (char *) __get_free_pages(gfp_flags, order);
-   if (buffer)
-   return buffer;
-
-   /* complete and utter failure */
-   return NULL;
+   return buffer;
 }
 
-static struct pgv *alloc_pg_vec(struct tpacket_req *req, int order)
+static struct pgv *alloc_pg_vec(struct tpacket_req *req)
 {
unsigned int block_nr = req->tp_block_nr;
+   unsigned long size = req->tp_block_size;
struct pgv *pg_vec;
int i;
 
@@ -4191,7 +4175,7 @@ static struct pgv *alloc_pg_vec(struct tpacket_req *req, 
int order)
goto out;
 
for (i = 0; i < block_nr; i++) {
-   pg_vec[i].buffer = alloc_one_pg_vec_page(order);
+   pg_vec[i].buffer = alloc_one_pg_vec_page(size);
if (unlikely(!pg_vec[i].buffer))
goto out_free_pgvec;
}
@@ -4200,7 +4184,7 @@ static struct pgv *alloc_pg_vec(struct tpacket_req *req, 
int order)
return pg_vec;
 
 out_free_pgvec:
-   free_pg_vec(pg_vec, order, block_nr);
+   free_pg_vec(pg_vec, block_nr);
pg_vec = NULL;
goto out;
 }
@@ -4275,7 +4259,7 @@ static int packet_set_ring(struct sock *sk, union 
tpacket_req_u *req_u,
 
err = -ENOMEM;
order = get_order(req->tp_block_size);
-   pg_vec = alloc_pg_vec(req, order);
+   pg_vec = alloc_pg_vec(req);
if (unlikely(!pg_vec))
goto out;
switch (po->tp_version) {
@@ -4355,7 +4339,7 @@ static int packet_set_ring(struct sock *sk, union 
tpacket_req_u *req_u,
}
 
if (pg_vec)
-   free_pg_vec(pg_vec, order, req->tp_block_nr);
+   free_pg_vec(pg_vec, req->tp_block_nr);
 out:
return err;
 }
-- 
2.16.2