Skip to content

Commit 71e4128

Browse files
lrq-maxdavem330
authored andcommitted
packet: switch kvzalloc to allocate memory
The patches includes following change: *Use modern kvzalloc()/kvfree() instead of custom allocations. *Remove order argument for alloc_pg_vec, it can get from req. *Remove order argument for free_pg_vec, free_pg_vec now uses kvfree which does not need order argument. *Remove pg_vec_order from struct packet_ring_buffer, no longer need to save/restore 'order' *Remove variable 'order' for packet_set_ring, it is now unused Signed-off-by: Zhang Yu <[email protected]> Signed-off-by: Li RongQing <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 0192e7d commit 71e4128

File tree

2 files changed

+13
-32
lines changed

2 files changed

+13
-32
lines changed

net/packet/af_packet.c

Lines changed: 13 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4137,52 +4137,36 @@ static const struct vm_operations_struct packet_mmap_ops = {
41374137
.close = packet_mm_close,
41384138
};
41394139

4140-
static void free_pg_vec(struct pgv *pg_vec, unsigned int order,
4141-
unsigned int len)
4140+
static void free_pg_vec(struct pgv *pg_vec, unsigned int len)
41424141
{
41434142
int i;
41444143

41454144
for (i = 0; i < len; i++) {
41464145
if (likely(pg_vec[i].buffer)) {
4147-
if (is_vmalloc_addr(pg_vec[i].buffer))
4148-
vfree(pg_vec[i].buffer);
4149-
else
4150-
free_pages((unsigned long)pg_vec[i].buffer,
4151-
order);
4146+
kvfree(pg_vec[i].buffer);
41524147
pg_vec[i].buffer = NULL;
41534148
}
41544149
}
41554150
kfree(pg_vec);
41564151
}
41574152

4158-
static char *alloc_one_pg_vec_page(unsigned long order)
4153+
static char *alloc_one_pg_vec_page(unsigned long size)
41594154
{
41604155
char *buffer;
4161-
gfp_t gfp_flags = GFP_KERNEL | __GFP_COMP |
4162-
__GFP_ZERO | __GFP_NOWARN | __GFP_NORETRY;
41634156

4164-
buffer = (char *) __get_free_pages(gfp_flags, order);
4157+
buffer = kvzalloc(size, GFP_KERNEL);
41654158
if (buffer)
41664159
return buffer;
41674160

4168-
/* __get_free_pages failed, fall back to vmalloc */
4169-
buffer = vzalloc(array_size((1 << order), PAGE_SIZE));
4170-
if (buffer)
4171-
return buffer;
4161+
buffer = kvzalloc(size, GFP_KERNEL | __GFP_RETRY_MAYFAIL);
41724162

4173-
/* vmalloc failed, lets dig into swap here */
4174-
gfp_flags &= ~__GFP_NORETRY;
4175-
buffer = (char *) __get_free_pages(gfp_flags, order);
4176-
if (buffer)
4177-
return buffer;
4178-
4179-
/* complete and utter failure */
4180-
return NULL;
4163+
return buffer;
41814164
}
41824165

4183-
static struct pgv *alloc_pg_vec(struct tpacket_req *req, int order)
4166+
static struct pgv *alloc_pg_vec(struct tpacket_req *req)
41844167
{
41854168
unsigned int block_nr = req->tp_block_nr;
4169+
unsigned long size = req->tp_block_size;
41864170
struct pgv *pg_vec;
41874171
int i;
41884172

@@ -4191,7 +4175,7 @@ static struct pgv *alloc_pg_vec(struct tpacket_req *req, int order)
41914175
goto out;
41924176

41934177
for (i = 0; i < block_nr; i++) {
4194-
pg_vec[i].buffer = alloc_one_pg_vec_page(order);
4178+
pg_vec[i].buffer = alloc_one_pg_vec_page(size);
41954179
if (unlikely(!pg_vec[i].buffer))
41964180
goto out_free_pgvec;
41974181
}
@@ -4200,7 +4184,7 @@ static struct pgv *alloc_pg_vec(struct tpacket_req *req, int order)
42004184
return pg_vec;
42014185

42024186
out_free_pgvec:
4203-
free_pg_vec(pg_vec, order, block_nr);
4187+
free_pg_vec(pg_vec, block_nr);
42044188
pg_vec = NULL;
42054189
goto out;
42064190
}
@@ -4210,9 +4194,9 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
42104194
{
42114195
struct pgv *pg_vec = NULL;
42124196
struct packet_sock *po = pkt_sk(sk);
4213-
int was_running, order = 0;
42144197
struct packet_ring_buffer *rb;
42154198
struct sk_buff_head *rb_queue;
4199+
int was_running;
42164200
__be16 num;
42174201
int err = -EINVAL;
42184202
/* Added to avoid minimal code churn */
@@ -4274,8 +4258,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
42744258
goto out;
42754259

42764260
err = -ENOMEM;
4277-
order = get_order(req->tp_block_size);
4278-
pg_vec = alloc_pg_vec(req, order);
4261+
pg_vec = alloc_pg_vec(req);
42794262
if (unlikely(!pg_vec))
42804263
goto out;
42814264
switch (po->tp_version) {
@@ -4329,7 +4312,6 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
43294312
rb->frame_size = req->tp_frame_size;
43304313
spin_unlock_bh(&rb_queue->lock);
43314314

4332-
swap(rb->pg_vec_order, order);
43334315
swap(rb->pg_vec_len, req->tp_block_nr);
43344316

43354317
rb->pg_vec_pages = req->tp_block_size/PAGE_SIZE;
@@ -4355,7 +4337,7 @@ static int packet_set_ring(struct sock *sk, union tpacket_req_u *req_u,
43554337
}
43564338

43574339
if (pg_vec)
4358-
free_pg_vec(pg_vec, order, req->tp_block_nr);
4340+
free_pg_vec(pg_vec, req->tp_block_nr);
43594341
out:
43604342
return err;
43614343
}

net/packet/internal.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ struct packet_ring_buffer {
6464
unsigned int frame_size;
6565
unsigned int frame_max;
6666

67-
unsigned int pg_vec_order;
6867
unsigned int pg_vec_pages;
6968
unsigned int pg_vec_len;
7069

0 commit comments

Comments
 (0)