[NET]: deinline 200+ byte inlines in sock.h
Sizes in bytes (allyesconfig, i386) and files where those inlines are used: 238 sock_queue_rcv_skb 2.6.16/net/x25/x25_in.o 238 sock_queue_rcv_skb 2.6.16/net/rose/rose_in.o 238 sock_queue_rcv_skb 2.6.16/net/packet/af_packet.o 238 sock_queue_rcv_skb 2.6.16/net/netrom/nr_in.o 238 sock_queue_rcv_skb 2.6.16/net/llc/llc_sap.o 238 sock_queue_rcv_skb 2.6.16/net/llc/llc_conn.o 238 sock_queue_rcv_skb 2.6.16/net/irda/af_irda.o 238 sock_queue_rcv_skb 2.6.16/net/ipx/af_ipx.o 238 sock_queue_rcv_skb 2.6.16/net/ipv6/udp.o 238 sock_queue_rcv_skb 2.6.16/net/ipv6/raw.o 238 sock_queue_rcv_skb 2.6.16/net/ipv4/udp.o 238 sock_queue_rcv_skb 2.6.16/net/ipv4/raw.o 238 sock_queue_rcv_skb 2.6.16/net/ipv4/ipmr.o 238 sock_queue_rcv_skb 2.6.16/net/econet/econet.o 238 sock_queue_rcv_skb 2.6.16/net/econet/af_econet.o 238 sock_queue_rcv_skb 2.6.16/net/bluetooth/sco.o 238 sock_queue_rcv_skb 2.6.16/net/bluetooth/l2cap.o 238 sock_queue_rcv_skb 2.6.16/net/bluetooth/hci_sock.o 238 sock_queue_rcv_skb 2.6.16/net/ax25/ax25_in.o 238 sock_queue_rcv_skb 2.6.16/net/ax25/af_ax25.o 238 sock_queue_rcv_skb 2.6.16/net/appletalk/ddp.o 238 sock_queue_rcv_skb 2.6.16/drivers/net/pppoe.o 276 sk_receive_skb 2.6.16/net/decnet/dn_nsp_in.o 276 sk_receive_skb 2.6.16/net/dccp/ipv6.o 276 sk_receive_skb 2.6.16/net/dccp/ipv4.o 276 sk_receive_skb 2.6.16/net/dccp/dccp_ipv6.o 276 sk_receive_skb 2.6.16/drivers/net/pppoe.o 209 sk_dst_check 2.6.16/net/ipv6/ip6_output.o 209 sk_dst_check 2.6.16/net/ipv4/udp.o 209 sk_dst_check 2.6.16/net/decnet/dn_nsp_out.o Large inlines with multiple callers: Size Uses Wasted Name and definition ===== ==== ====== ================================================ 238 21 4360 sock_queue_rcv_skb include/net/sock.h 109 10 801 sock_recv_timestamp include/net/sock.h 276 4 768 sk_receive_skb include/net/sock.h 94 8 518 __sk_dst_check include/net/sock.h 209 3 378 sk_dst_check include/net/sock.h 131 4 333 sk_setup_caps include/net/sock.h 152 2 132 sk_stream_alloc_pskb include/net/sock.h 125 2 105 sk_stream_writequeue_purge include/net/sock.h Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
1d1818316f
commit
f0088a50e7
@@ -938,28 +938,7 @@ static inline void sock_put(struct sock *sk)
|
|||||||
sk_free(sk);
|
sk_free(sk);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
|
extern int sk_receive_skb(struct sock *sk, struct sk_buff *skb);
|
||||||
{
|
|
||||||
int rc = NET_RX_SUCCESS;
|
|
||||||
|
|
||||||
if (sk_filter(sk, skb, 0))
|
|
||||||
goto discard_and_relse;
|
|
||||||
|
|
||||||
skb->dev = NULL;
|
|
||||||
|
|
||||||
bh_lock_sock(sk);
|
|
||||||
if (!sock_owned_by_user(sk))
|
|
||||||
rc = sk->sk_backlog_rcv(sk, skb);
|
|
||||||
else
|
|
||||||
sk_add_backlog(sk, skb);
|
|
||||||
bh_unlock_sock(sk);
|
|
||||||
out:
|
|
||||||
sock_put(sk);
|
|
||||||
return rc;
|
|
||||||
discard_and_relse:
|
|
||||||
kfree_skb(skb);
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Detach socket from process context.
|
/* Detach socket from process context.
|
||||||
* Announce socket dead, detach it from wait queue and inode.
|
* Announce socket dead, detach it from wait queue and inode.
|
||||||
@@ -1044,33 +1023,9 @@ sk_dst_reset(struct sock *sk)
|
|||||||
write_unlock(&sk->sk_dst_lock);
|
write_unlock(&sk->sk_dst_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct dst_entry *
|
extern struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie);
|
||||||
__sk_dst_check(struct sock *sk, u32 cookie)
|
|
||||||
{
|
|
||||||
struct dst_entry *dst = sk->sk_dst_cache;
|
|
||||||
|
|
||||||
if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
|
extern struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie);
|
||||||
sk->sk_dst_cache = NULL;
|
|
||||||
dst_release(dst);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline struct dst_entry *
|
|
||||||
sk_dst_check(struct sock *sk, u32 cookie)
|
|
||||||
{
|
|
||||||
struct dst_entry *dst = sk_dst_get(sk);
|
|
||||||
|
|
||||||
if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
|
|
||||||
sk_dst_reset(sk);
|
|
||||||
dst_release(dst);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return dst;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
|
static inline void sk_setup_caps(struct sock *sk, struct dst_entry *dst)
|
||||||
{
|
{
|
||||||
@@ -1140,45 +1095,7 @@ extern void sk_reset_timer(struct sock *sk, struct timer_list* timer,
|
|||||||
|
|
||||||
extern void sk_stop_timer(struct sock *sk, struct timer_list* timer);
|
extern void sk_stop_timer(struct sock *sk, struct timer_list* timer);
|
||||||
|
|
||||||
static inline int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
extern int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb);
|
||||||
{
|
|
||||||
int err = 0;
|
|
||||||
int skb_len;
|
|
||||||
|
|
||||||
/* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
|
|
||||||
number of warnings when compiling with -W --ANK
|
|
||||||
*/
|
|
||||||
if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
|
|
||||||
(unsigned)sk->sk_rcvbuf) {
|
|
||||||
err = -ENOMEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* It would be deadlock, if sock_queue_rcv_skb is used
|
|
||||||
with socket lock! We assume that users of this
|
|
||||||
function are lock free.
|
|
||||||
*/
|
|
||||||
err = sk_filter(sk, skb, 1);
|
|
||||||
if (err)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
skb->dev = NULL;
|
|
||||||
skb_set_owner_r(skb, sk);
|
|
||||||
|
|
||||||
/* Cache the SKB length before we tack it onto the receive
|
|
||||||
* queue. Once it is added it no longer belongs to us and
|
|
||||||
* may be freed by other threads of control pulling packets
|
|
||||||
* from the queue.
|
|
||||||
*/
|
|
||||||
skb_len = skb->len;
|
|
||||||
|
|
||||||
skb_queue_tail(&sk->sk_receive_queue, skb);
|
|
||||||
|
|
||||||
if (!sock_flag(sk, SOCK_DEAD))
|
|
||||||
sk->sk_data_ready(sk, skb_len);
|
|
||||||
out:
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb)
|
static inline int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -187,6 +187,99 @@ static void sock_disable_timestamp(struct sock *sk)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int sock_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
int err = 0;
|
||||||
|
int skb_len;
|
||||||
|
|
||||||
|
/* Cast skb->rcvbuf to unsigned... It's pointless, but reduces
|
||||||
|
number of warnings when compiling with -W --ANK
|
||||||
|
*/
|
||||||
|
if (atomic_read(&sk->sk_rmem_alloc) + skb->truesize >=
|
||||||
|
(unsigned)sk->sk_rcvbuf) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* It would be deadlock, if sock_queue_rcv_skb is used
|
||||||
|
with socket lock! We assume that users of this
|
||||||
|
function are lock free.
|
||||||
|
*/
|
||||||
|
err = sk_filter(sk, skb, 1);
|
||||||
|
if (err)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
skb->dev = NULL;
|
||||||
|
skb_set_owner_r(skb, sk);
|
||||||
|
|
||||||
|
/* Cache the SKB length before we tack it onto the receive
|
||||||
|
* queue. Once it is added it no longer belongs to us and
|
||||||
|
* may be freed by other threads of control pulling packets
|
||||||
|
* from the queue.
|
||||||
|
*/
|
||||||
|
skb_len = skb->len;
|
||||||
|
|
||||||
|
skb_queue_tail(&sk->sk_receive_queue, skb);
|
||||||
|
|
||||||
|
if (!sock_flag(sk, SOCK_DEAD))
|
||||||
|
sk->sk_data_ready(sk, skb_len);
|
||||||
|
out:
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(sock_queue_rcv_skb);
|
||||||
|
|
||||||
|
int sk_receive_skb(struct sock *sk, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
int rc = NET_RX_SUCCESS;
|
||||||
|
|
||||||
|
if (sk_filter(sk, skb, 0))
|
||||||
|
goto discard_and_relse;
|
||||||
|
|
||||||
|
skb->dev = NULL;
|
||||||
|
|
||||||
|
bh_lock_sock(sk);
|
||||||
|
if (!sock_owned_by_user(sk))
|
||||||
|
rc = sk->sk_backlog_rcv(sk, skb);
|
||||||
|
else
|
||||||
|
sk_add_backlog(sk, skb);
|
||||||
|
bh_unlock_sock(sk);
|
||||||
|
out:
|
||||||
|
sock_put(sk);
|
||||||
|
return rc;
|
||||||
|
discard_and_relse:
|
||||||
|
kfree_skb(skb);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(sk_receive_skb);
|
||||||
|
|
||||||
|
struct dst_entry *__sk_dst_check(struct sock *sk, u32 cookie)
|
||||||
|
{
|
||||||
|
struct dst_entry *dst = sk->sk_dst_cache;
|
||||||
|
|
||||||
|
if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
|
||||||
|
sk->sk_dst_cache = NULL;
|
||||||
|
dst_release(dst);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(__sk_dst_check);
|
||||||
|
|
||||||
|
struct dst_entry *sk_dst_check(struct sock *sk, u32 cookie)
|
||||||
|
{
|
||||||
|
struct dst_entry *dst = sk_dst_get(sk);
|
||||||
|
|
||||||
|
if (dst && dst->obsolete && dst->ops->check(dst, cookie) == NULL) {
|
||||||
|
sk_dst_reset(sk);
|
||||||
|
dst_release(dst);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dst;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(sk_dst_check);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is meant for all protocols to use and covers goings on
|
* This is meant for all protocols to use and covers goings on
|
||||||
* at the socket level. Everything here is generic.
|
* at the socket level. Everything here is generic.
|
||||||
|
|||||||
Reference in New Issue
Block a user