* [PATCHv2 2/2]: net/ipv{4,6}: reduce code size by inlining
@ 2006-11-14 8:49 Gerrit Renker
2006-11-14 12:27 ` Andi Kleen
0 siblings, 1 reply; 4+ messages in thread
From: Gerrit Renker @ 2006-11-14 8:49 UTC (permalink / raw)
To: David Miller; +Cc: netdev
[UDP]: Reduce size of shared code
This patch reduces size of source code files by moving
some of the smaller functions shared by UDP and UDP-Lite
into the header file udp_impl.h, and in-lining these.
It is an optimisation and applies on top of the previous
UDP-Lite patch.
Signed-off-by: Gerrit Renker <gerrit@erg.abdn.ac.uk>
------------------------------------------------------------------------------
net/ipv4/udp.c | 74 ++-------------------------------------------------
net/ipv4/udp_impl.h | 75 +++++++++++++++++++++++++++++++++++++++++++++-------
net/ipv6/udp.c | 70 ++----------------------------------------------
net/ipv6/udp_impl.h | 72 +++++++++++++++++++++++++++++++++++++++++++------
4 files changed, 136 insertions(+), 155 deletions(-)
------------------------------------------------------------------------------
diff --git a/net/ipv4/udp_impl.h b/net/ipv4/udp_impl.h
index f6f4277..3d12aca 100644
--- a/net/ipv4/udp_impl.h
+++ b/net/ipv4/udp_impl.h
@@ -11,26 +11,81 @@ extern void __udp4_lib_err(struct sk_bu
extern int __udp_lib_get_port(struct sock *sk, unsigned short snum,
struct hlist_head udptable[], int *port_rover,
int (*)(const struct sock*,const struct sock*));
-extern int ipv4_rcv_saddr_equal(const struct sock *, const struct sock *);
+static inline int ipv4_rcv_saddr_equal(const struct sock *sk1, const struct sock *sk2)
+{
+ struct inet_sock *inet1 = inet_sk(sk1), *inet2 = inet_sk(sk2);
-extern int udp_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen);
-extern int udp_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen);
+ return ( !ipv6_only_sock(sk2) &&
+ (!inet1->rcv_saddr || !inet2->rcv_saddr ||
+ inet1->rcv_saddr == inet2->rcv_saddr ));
+}
+
+extern int do_udp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen);
+extern int do_udp_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen);
+
+static inline int udp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udp_setsockopt(sk, level, optname, optval, optlen);
+ return ip_setsockopt(sk, level, optname, optval, optlen);
+}
+
+static inline int udp_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udp_getsockopt(sk, level, optname, optval, optlen);
+ return ip_getsockopt(sk, level, optname, optval, optlen);
+}
#ifdef CONFIG_COMPAT
-extern int compat_udp_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen);
-extern int compat_udp_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen);
+static inline int compat_udp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udp_setsockopt(sk, level, optname, optval, optlen);
+ return compat_ip_setsockopt(sk, level, optname, optval, optlen);
+}
+static inline int compat_udp_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udp_getsockopt(sk, level, optname, optval, optlen);
+ return compat_ip_getsockopt(sk, level, optname, optval, optlen);
+}
#endif
+
extern int udp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg,
size_t len, int noblock, int flags, int *addr_len);
extern int udp_sendpage(struct sock *sk, struct page *page, int offset,
size_t size, int flags);
extern int udp_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
-extern int udp_destroy_sock(struct sock *sk);
+
+/*
+ * Throw away all pending data and cancel the corking. Socket is locked.
+ */
+static inline void udp_flush_pending_frames(struct sock *sk)
+{
+ struct udp_sock *up = udp_sk(sk);
+
+ if (up->pending) {
+ up->len = 0;
+ up->pending = 0;
+ ip_flush_pending_frames(sk);
+ }
+}
+
+static inline int udp_destroy_sock(struct sock *sk)
+{
+ lock_sock(sk);
+ udp_flush_pending_frames(sk);
+ release_sock(sk);
+ return 0;
+}
#ifdef CONFIG_PROC_FS
extern int udp4_seq_show(struct seq_file *seq, void *v);
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 227655c..930da4a 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -214,15 +214,6 @@ __inline__ int udp_get_port(struct sock
return __udp_lib_get_port(sk, snum, udp_hash, &udp_port_rover, scmp);
}
-inline int ipv4_rcv_saddr_equal(const struct sock *sk1, const struct sock *sk2)
-{
- struct inet_sock *inet1 = inet_sk(sk1), *inet2 = inet_sk(sk2);
-
- return ( !ipv6_only_sock(sk2) &&
- (!inet1->rcv_saddr || !inet2->rcv_saddr ||
- inet1->rcv_saddr == inet2->rcv_saddr ));
-}
-
static inline int udp_v4_get_port(struct sock *sk, unsigned short snum)
{
return udp_get_port(sk, snum, ipv4_rcv_saddr_equal);
@@ -391,20 +382,6 @@ __inline__ void udp_err(struct sk_buff *
return __udp4_lib_err(skb, info, udp_hash);
}
-/*
- * Throw away all pending data and cancel the corking. Socket is locked.
- */
-static void udp_flush_pending_frames(struct sock *sk)
-{
- struct udp_sock *up = udp_sk(sk);
-
- if (up->pending) {
- up->len = 0;
- up->pending = 0;
- ip_flush_pending_frames(sk);
- }
-}
-
/**
* udp4_hwcsum_outgoing - handle outgoing HW checksumming
* @sk: socket we are sending on
@@ -1278,19 +1255,11 @@ __inline__ int udp_rcv(struct sk_buff *s
return __udp4_lib_rcv(skb, udp_hash, 0);
}
-int udp_destroy_sock(struct sock *sk)
-{
- lock_sock(sk);
- udp_flush_pending_frames(sk);
- release_sock(sk);
- return 0;
-}
-
/*
* Socket option code for UDP
*/
-static int do_udp_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
+int do_udp_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
{
struct udp_sock *up = udp_sk(sk);
int val;
@@ -1361,26 +1330,8 @@ static int do_udp_setsockopt(struct sock
return err;
}
-int udp_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udp_setsockopt(sk, level, optname, optval, optlen);
- return ip_setsockopt(sk, level, optname, optval, optlen);
-}
-
-#ifdef CONFIG_COMPAT
-int compat_udp_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udp_setsockopt(sk, level, optname, optval, optlen);
- return compat_ip_setsockopt(sk, level, optname, optval, optlen);
-}
-#endif
-
-static int do_udp_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
+int do_udp_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
{
struct udp_sock *up = udp_sk(sk);
int val, len;
@@ -1423,23 +1374,6 @@ static int do_udp_getsockopt(struct sock
return 0;
}
-int udp_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udp_getsockopt(sk, level, optname, optval, optlen);
- return ip_getsockopt(sk, level, optname, optval, optlen);
-}
-
-#ifdef CONFIG_COMPAT
-int compat_udp_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udp_getsockopt(sk, level, optname, optval, optlen);
- return compat_ip_getsockopt(sk, level, optname, optval, optlen);
-}
-#endif
/**
* udp_poll - wait for a UDP event.
* @file - file struct
diff --git a/net/ipv6/udp_impl.h b/net/ipv6/udp_impl.h
index ec98788..4ac8fc1 100644
--- a/net/ipv6/udp_impl.h
+++ b/net/ipv6/udp_impl.h
@@ -4,29 +4,83 @@ #include <net/udp.h>
#include <net/udplite.h>
#include <net/protocol.h>
#include <net/addrconf.h>
+#include <net/transp_v6.h>
#include <net/inet_common.h>
extern int __udp6_lib_rcv(struct sk_buff **, struct hlist_head [], int );
extern void __udp6_lib_err(struct sk_buff *, struct inet6_skb_parm *,
int , int , int , __be32 , struct hlist_head []);
-extern int udpv6_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen);
-extern int udpv6_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen);
+extern int do_udpv6_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen);
+extern int do_udpv6_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen);
+
+static inline int udpv6_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udpv6_setsockopt(sk, level, optname, optval, optlen);
+ return ipv6_setsockopt(sk, level, optname, optval, optlen);
+}
+
+static inline int udpv6_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udpv6_getsockopt(sk, level, optname, optval, optlen);
+ return ipv6_getsockopt(sk, level, optname, optval, optlen);
+}
+
#ifdef CONFIG_COMPAT
-extern int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen);
-extern int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen);
+static inline int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udpv6_setsockopt(sk, level, optname, optval, optlen);
+ return compat_ipv6_setsockopt(sk, level, optname, optval, optlen);
+}
+
+static inline int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
+{
+ if (level == SOL_UDP || level == SOL_UDPLITE)
+ return do_udpv6_getsockopt(sk, level, optname, optval, optlen);
+ return compat_ipv6_getsockopt(sk, level, optname, optval, optlen);
+}
#endif
+
extern int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
struct msghdr *msg, size_t len);
extern int udpv6_recvmsg(struct kiocb *iocb, struct sock *sk,
struct msghdr *msg, size_t len,
int noblock, int flags, int *addr_len);
extern int udpv6_queue_rcv_skb(struct sock * sk, struct sk_buff *skb);
-extern int udpv6_destroy_sock(struct sock *sk);
+
+/*
+ * Throw away all pending data and cancel the corking. Socket is locked.
+ */
+static inline void udp_v6_flush_pending_frames(struct sock *sk)
+{
+ struct udp_sock *up = udp_sk(sk);
+
+ if (up->pending) {
+ up->len = 0;
+ up->pending = 0;
+ ip6_flush_pending_frames(sk);
+ }
+}
+
+static inline int udpv6_destroy_sock(struct sock *sk)
+{
+ lock_sock(sk);
+ udp_v6_flush_pending_frames(sk);
+ release_sock(sk);
+
+ inet6_destroy_sock(sk);
+
+ return 0;
+}
#ifdef CONFIG_PROC_FS
extern int udp6_seq_show(struct seq_file *seq, void *v);
diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
index c6161bb..23f1418 100644
--- a/net/ipv6/udp.c
+++ b/net/ipv6/udp.c
@@ -40,7 +40,6 @@ #include <asm/uaccess.h>
#include <net/ndisc.h>
#include <net/protocol.h>
-#include <net/transp_v6.h>
#include <net/ip6_route.h>
#include <net/raw.h>
#include <net/tcp_states.h>
@@ -488,20 +487,6 @@ static __inline__ int udpv6_rcv(struct s
}
/*
- * Throw away all pending data and cancel the corking. Socket is locked.
- */
-static void udp_v6_flush_pending_frames(struct sock *sk)
-{
- struct udp_sock *up = udp_sk(sk);
-
- if (up->pending) {
- up->len = 0;
- up->pending = 0;
- ip6_flush_pending_frames(sk);
- }
-}
-
-/*
* Sending
*/
@@ -830,22 +815,11 @@ do_confirm:
goto out;
}
-int udpv6_destroy_sock(struct sock *sk)
-{
- lock_sock(sk);
- udp_v6_flush_pending_frames(sk);
- release_sock(sk);
-
- inet6_destroy_sock(sk);
-
- return 0;
-}
-
/*
* Socket option code for UDP
*/
-static int do_udpv6_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
+int do_udpv6_setsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int optlen)
{
struct udp_sock *up = udp_sk(sk);
int val;
@@ -905,26 +879,8 @@ static int do_udpv6_setsockopt(struct so
return err;
}
-int udpv6_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udpv6_setsockopt(sk, level, optname, optval, optlen);
- return ipv6_setsockopt(sk, level, optname, optval, optlen);
-}
-
-#ifdef CONFIG_COMPAT
-int compat_udpv6_setsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udpv6_setsockopt(sk, level, optname, optval, optlen);
- return compat_ipv6_setsockopt(sk, level, optname, optval, optlen);
-}
-#endif
-
-static int do_udpv6_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
+int do_udpv6_getsockopt(struct sock *sk, int level, int optname,
+ char __user *optval, int __user *optlen)
{
struct udp_sock *up = udp_sk(sk);
int val, len;
@@ -965,24 +921,6 @@ static int do_udpv6_getsockopt(struct so
return 0;
}
-int udpv6_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udpv6_getsockopt(sk, level, optname, optval, optlen);
- return ipv6_getsockopt(sk, level, optname, optval, optlen);
-}
-
-#ifdef CONFIG_COMPAT
-int compat_udpv6_getsockopt(struct sock *sk, int level, int optname,
- char __user *optval, int __user *optlen)
-{
- if (level == SOL_UDP || level == SOL_UDPLITE)
- return do_udpv6_getsockopt(sk, level, optname, optval, optlen);
- return compat_ipv6_getsockopt(sk, level, optname, optval, optlen);
-}
-#endif
-
static struct inet6_protocol udpv6_protocol = {
.handler = udpv6_rcv,
.err_handler = udpv6_err,
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCHv2 2/2]: net/ipv{4,6}: reduce code size by inlining
2006-11-14 8:49 [PATCHv2 2/2]: net/ipv{4,6}: reduce code size by inlining Gerrit Renker
@ 2006-11-14 12:27 ` Andi Kleen
2006-11-14 12:50 ` Gerrit Renker
0 siblings, 1 reply; 4+ messages in thread
From: Andi Kleen @ 2006-11-14 12:27 UTC (permalink / raw)
To: Gerrit Renker; +Cc: David Miller, netdev
On Tuesday 14 November 2006 09:49, Gerrit Renker wrote:
> [UDP]: Reduce size of shared code
>
> This patch reduces size of source code files by moving
> some of the smaller functions shared by UDP and UDP-Lite
> into the header file udp_impl.h, and in-lining these.
>
> It is an optimisation and applies on top of the previous
> UDP-Lite patch.
Wouldn't it be better to just call them? They all don't
particularly time critical.
-Andi
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCHv2 2/2]: net/ipv{4,6}: reduce code size by inlining
2006-11-14 12:27 ` Andi Kleen
@ 2006-11-14 12:50 ` Gerrit Renker
2006-11-15 4:20 ` David Miller
0 siblings, 1 reply; 4+ messages in thread
From: Gerrit Renker @ 2006-11-14 12:50 UTC (permalink / raw)
To: Andi Kleen; +Cc: David Miller, netdev
Quoting Andi Kleen:
| On Tuesday 14 November 2006 09:49, Gerrit Renker wrote:
| > [UDP]: Reduce size of shared code
| >
| > This patch reduces size of source code files by moving
| > some of the smaller functions shared by UDP and UDP-Lite
| > into the header file udp_impl.h, and in-lining these.
| >
| > It is an optimisation and applies on top of the previous
| > UDP-Lite patch.
|
| Wouldn't it be better to just call them? They all don't
| particularly time critical.
This patch was sent as an optional add-on, it is not as important
as the other one. You are probably right - I also noted that the
gains (in terms of line numbers) are not as high as intended.
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCHv2 2/2]: net/ipv{4,6}: reduce code size by inlining
2006-11-14 12:50 ` Gerrit Renker
@ 2006-11-15 4:20 ` David Miller
0 siblings, 0 replies; 4+ messages in thread
From: David Miller @ 2006-11-15 4:20 UTC (permalink / raw)
To: gerrit; +Cc: ak, netdev
From: Gerrit Renker <gerrit@erg.abdn.ac.uk>
Date: Tue, 14 Nov 2006 12:50:33 +0000
> Quoting Andi Kleen:
> | On Tuesday 14 November 2006 09:49, Gerrit Renker wrote:
> | > [UDP]: Reduce size of shared code
> | >
> | > This patch reduces size of source code files by moving
> | > some of the smaller functions shared by UDP and UDP-Lite
> | > into the header file udp_impl.h, and in-lining these.
> | >
> | > It is an optimisation and applies on top of the previous
> | > UDP-Lite patch.
> |
> | Wouldn't it be better to just call them? They all don't
> | particularly time critical.
> This patch was sent as an optional add-on, it is not as important
> as the other one. You are probably right - I also noted that the
> gains (in terms of line numbers) are not as high as intended.
I'm not too sure on this one either, so I won't apply this one
for now.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2006-11-15 4:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-11-14 8:49 [PATCHv2 2/2]: net/ipv{4,6}: reduce code size by inlining Gerrit Renker
2006-11-14 12:27 ` Andi Kleen
2006-11-14 12:50 ` Gerrit Renker
2006-11-15 4:20 ` David Miller
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).