diff options
author | Arnaldo Carvalho de Melo <acme@ghostprotocols.net> | 2005-06-19 01:46:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-06-19 01:46:52 -0400 |
commit | 2e6599cb899ba4b133f42cbf9d2b1883d2dc583a (patch) | |
tree | b5d4fcca4d2a515fc3d3d20cefaaeebd8dbf661f /net/core | |
parent | 1944972d3bb651474a5021c9da8d0166ae19f1eb (diff) |
[NET] Generalise TCP's struct open_request minisock infrastructure
Kept this first changeset minimal, without changing existing names to
ease peer review.
Basicaly tcp_openreq_alloc now receives the or_calltable, that in turn
has two new members:
->slab, that replaces tcp_openreq_cachep
->obj_size, to inform the size of the openreq descendant for
a specific protocol
The protocol specific fields in struct open_request were moved to a
class hierarchy, with the things that are common to all connection
oriented PF_INET protocols in struct inet_request_sock, the TCP ones
in tcp_request_sock, that is an inet_request_sock, that is an
open_request.
I.e. this uses the same approach used for the struct sock class
hierarchy, with sk_prot indicating if the protocol wants to use the
open_request infrastructure by filling in sk_prot->rsk_prot with an
or_calltable.
Results? Performance is improved and TCP v4 now uses only 64 bytes per
open request minisock, down from 96 without this patch :-)
Next changeset will rename some of the structs, fields and functions
mentioned above, struct or_calltable is way unclear, better name it
struct request_sock_ops, s/struct open_request/struct request_sock/g,
etc.
Signed-off-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core')
-rw-r--r-- | net/core/sock.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/net/core/sock.c b/net/core/sock.c index 96e00b08698f..a6ec3ada7f9e 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
@@ -118,6 +118,7 @@ | |||
118 | #include <linux/netdevice.h> | 118 | #include <linux/netdevice.h> |
119 | #include <net/protocol.h> | 119 | #include <net/protocol.h> |
120 | #include <linux/skbuff.h> | 120 | #include <linux/skbuff.h> |
121 | #include <net/request_sock.h> | ||
121 | #include <net/sock.h> | 122 | #include <net/sock.h> |
122 | #include <net/xfrm.h> | 123 | #include <net/xfrm.h> |
123 | #include <linux/ipsec.h> | 124 | #include <linux/ipsec.h> |
@@ -1363,6 +1364,7 @@ static LIST_HEAD(proto_list); | |||
1363 | 1364 | ||
1364 | int proto_register(struct proto *prot, int alloc_slab) | 1365 | int proto_register(struct proto *prot, int alloc_slab) |
1365 | { | 1366 | { |
1367 | char *request_sock_slab_name; | ||
1366 | int rc = -ENOBUFS; | 1368 | int rc = -ENOBUFS; |
1367 | 1369 | ||
1368 | if (alloc_slab) { | 1370 | if (alloc_slab) { |
@@ -1374,6 +1376,25 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
1374 | prot->name); | 1376 | prot->name); |
1375 | goto out; | 1377 | goto out; |
1376 | } | 1378 | } |
1379 | |||
1380 | if (prot->rsk_prot != NULL) { | ||
1381 | static const char mask[] = "request_sock_%s"; | ||
1382 | |||
1383 | request_sock_slab_name = kmalloc(strlen(prot->name) + sizeof(mask) - 1, GFP_KERNEL); | ||
1384 | if (request_sock_slab_name == NULL) | ||
1385 | goto out_free_sock_slab; | ||
1386 | |||
1387 | sprintf(request_sock_slab_name, mask, prot->name); | ||
1388 | prot->rsk_prot->slab = kmem_cache_create(request_sock_slab_name, | ||
1389 | prot->rsk_prot->obj_size, 0, | ||
1390 | SLAB_HWCACHE_ALIGN, NULL, NULL); | ||
1391 | |||
1392 | if (prot->rsk_prot->slab == NULL) { | ||
1393 | printk(KERN_CRIT "%s: Can't create request sock SLAB cache!\n", | ||
1394 | prot->name); | ||
1395 | goto out_free_request_sock_slab_name; | ||
1396 | } | ||
1397 | } | ||
1377 | } | 1398 | } |
1378 | 1399 | ||
1379 | write_lock(&proto_list_lock); | 1400 | write_lock(&proto_list_lock); |
@@ -1382,6 +1403,12 @@ int proto_register(struct proto *prot, int alloc_slab) | |||
1382 | rc = 0; | 1403 | rc = 0; |
1383 | out: | 1404 | out: |
1384 | return rc; | 1405 | return rc; |
1406 | out_free_request_sock_slab_name: | ||
1407 | kfree(request_sock_slab_name); | ||
1408 | out_free_sock_slab: | ||
1409 | kmem_cache_destroy(prot->slab); | ||
1410 | prot->slab = NULL; | ||
1411 | goto out; | ||
1385 | } | 1412 | } |
1386 | 1413 | ||
1387 | EXPORT_SYMBOL(proto_register); | 1414 | EXPORT_SYMBOL(proto_register); |
@@ -1395,6 +1422,14 @@ void proto_unregister(struct proto *prot) | |||
1395 | prot->slab = NULL; | 1422 | prot->slab = NULL; |
1396 | } | 1423 | } |
1397 | 1424 | ||
1425 | if (prot->rsk_prot != NULL && prot->rsk_prot->slab != NULL) { | ||
1426 | const char *name = kmem_cache_name(prot->rsk_prot->slab); | ||
1427 | |||
1428 | kmem_cache_destroy(prot->rsk_prot->slab); | ||
1429 | kfree(name); | ||
1430 | prot->rsk_prot->slab = NULL; | ||
1431 | } | ||
1432 | |||
1398 | list_del(&prot->node); | 1433 | list_del(&prot->node); |
1399 | write_unlock(&proto_list_lock); | 1434 | write_unlock(&proto_list_lock); |
1400 | } | 1435 | } |