Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Kirill Smelkov
linux
Commits
7c9c0ff6
Commit
7c9c0ff6
authored
21 years ago
by
Andi Kleen
Committed by
Stephen Hemminger
21 years ago
Browse files
Options
Download
Email Patches
Plain Diff
[NET]: Do lazy gettimeofday for network packets.
parent
eccf6f14
Changes
23
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
114 additions
and
88 deletions
+114
-88
include/net/neighbour.h
include/net/neighbour.h
+2
-0
include/net/sock.h
include/net/sock.h
+27
-4
net/appletalk/ddp.c
net/appletalk/ddp.c
+1
-7
net/atm/ioctl.c
net/atm/ioctl.c
+2
-6
net/ax25/af_ax25.c
net/ax25/af_ax25.c
+1
-6
net/core/dev.c
net/core/dev.c
+4
-4
net/core/neighbour.c
net/core/neighbour.c
+1
-1
net/core/sock.c
net/core/sock.c
+41
-1
net/econet/af_econet.c
net/econet/af_econet.c
+2
-4
net/ipv4/af_inet.c
net/ipv4/af_inet.c
+1
-5
net/ipv4/arp.c
net/ipv4/arp.c
+1
-1
net/ipv6/af_inet6.c
net/ipv6/af_inet6.c
+1
-7
net/ipv6/ndisc.c
net/ipv6/ndisc.c
+1
-1
net/ipx/af_ipx.c
net/ipx/af_ipx.c
+4
-10
net/irda/af_irda.c
net/irda/af_irda.c
+2
-8
net/netrom/af_netrom.c
net/netrom/af_netrom.c
+4
-10
net/packet/af_packet.c
net/packet/af_packet.c
+6
-7
net/rose/af_rose.c
net/rose/af_rose.c
+2
-6
net/rxrpc/transport.c
net/rxrpc/transport.c
+5
-0
net/sctp/input.c
net/sctp/input.c
+6
-0
No files found.
include/net/neighbour.h
View file @
7c9c0ff6
...
...
@@ -281,6 +281,8 @@ __neigh_lookup_errno(struct neigh_table *tbl, const void *pkey,
return
neigh_create
(
tbl
,
pkey
,
dev
);
}
#define LOCALLY_ENQUEUED -2
#endif
#endif
...
...
This diff is collapsed.
Click to expand it.
include/net/sock.h
View file @
7c9c0ff6
...
...
@@ -382,6 +382,7 @@ enum sock_flags {
SOCK_LINGER
,
SOCK_DESTROY
,
SOCK_BROADCAST
,
SOCK_TIMESTAMP
,
};
static
inline
void
sock_set_flag
(
struct
sock
*
sk
,
enum
sock_flags
flag
)
...
...
@@ -1023,12 +1024,34 @@ static inline int sock_intr_errno(long timeo)
static
__inline__
void
sock_recv_timestamp
(
struct
msghdr
*
msg
,
struct
sock
*
sk
,
struct
sk_buff
*
skb
)
{
if
(
sk
->
sk_rcvtstamp
)
put_cmsg
(
msg
,
SOL_SOCKET
,
SO_TIMESTAMP
,
sizeof
(
skb
->
stamp
),
&
skb
->
stamp
);
else
sk
->
sk_stamp
=
skb
->
stamp
;
struct
timeval
*
stamp
=
&
skb
->
stamp
;
if
(
sk
->
sk_rcvtstamp
)
{
/* Race occurred between timestamp enabling and packet
receiving. Fill in the current time for now. */
if
(
stamp
->
tv_sec
==
0
)
do_gettimeofday
(
stamp
);
put_cmsg
(
msg
,
SOL_SOCKET
,
SO_TIMESTAMP
,
sizeof
(
struct
timeval
),
stamp
);
}
else
sk
->
sk_stamp
=
*
stamp
;
}
extern
atomic_t
netstamp_needed
;
extern
void
sock_enable_timestamp
(
struct
sock
*
sk
);
extern
void
sock_disable_timestamp
(
struct
sock
*
sk
);
static
inline
void
net_timestamp
(
struct
timeval
*
stamp
)
{
if
(
atomic_read
(
&
netstamp_needed
))
do_gettimeofday
(
stamp
);
else
{
stamp
->
tv_sec
=
0
;
stamp
->
tv_usec
=
0
;
}
}
extern
int
sock_get_timestamp
(
struct
sock
*
,
struct
timeval
*
);
/*
* Enable debug/info messages
*/
...
...
This diff is collapsed.
Click to expand it.
net/appletalk/ddp.c
View file @
7c9c0ff6
...
...
@@ -1795,13 +1795,7 @@ static int atalk_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
break
;
}
case
SIOCGSTAMP
:
if
(
!
sk
)
break
;
rc
=
-
ENOENT
;
if
(
!
sk
->
sk_stamp
.
tv_sec
)
break
;
rc
=
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
rc
=
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
break
;
/* Routing */
case
SIOCADDRT
:
...
...
This diff is collapsed.
Click to expand it.
net/atm/ioctl.c
View file @
7c9c0ff6
...
...
@@ -76,12 +76,8 @@ int vcc_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
goto
done
;
}
case
SIOCGSTAMP
:
/* borrowed from IP */
if
(
!
vcc
->
sk
->
sk_stamp
.
tv_sec
)
{
error
=
-
ENOENT
;
goto
done
;
}
error
=
copy_to_user
((
void
*
)
arg
,
&
vcc
->
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
error
=
sock_get_timestamp
(
vcc
->
sk
,
(
struct
timeval
*
)
arg
);
goto
done
;
case
ATM_SETSC
:
printk
(
KERN_WARNING
"ATM_SETSC is obsolete
\n
"
);
...
...
This diff is collapsed.
Click to expand it.
net/ax25/af_ax25.c
View file @
7c9c0ff6
...
...
@@ -1694,12 +1694,7 @@ static int ax25_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
case
SIOCGSTAMP
:
if
(
sk
!=
NULL
)
{
if
(
!
sk
->
sk_stamp
.
tv_sec
)
{
res
=
-
ENOENT
;
break
;
}
res
=
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
res
=
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
break
;
}
res
=
-
EINVAL
;
...
...
This diff is collapsed.
Click to expand it.
net/core/dev.c
View file @
7c9c0ff6
...
...
@@ -1125,7 +1125,7 @@ int call_netdevice_notifiers(unsigned long val, void *v)
void
dev_queue_xmit_nit
(
struct
sk_buff
*
skb
,
struct
net_device
*
dev
)
{
struct
packet_type
*
ptype
;
do_g
ettime
ofday
(
&
skb
->
stamp
);
n
et
_
time
stamp
(
&
skb
->
stamp
);
rcu_read_lock
();
list_for_each_entry_rcu
(
ptype
,
&
ptype_all
,
list
)
{
...
...
@@ -1546,9 +1546,9 @@ int netif_rx(struct sk_buff *skb)
return
NET_RX_DROP
;
}
#endif
if
(
!
skb
->
stamp
.
tv_sec
)
do_g
ettime
ofday
(
&
skb
->
stamp
);
n
et
_
time
stamp
(
&
skb
->
stamp
);
/*
* The code is rearranged so that the path is the most
...
...
@@ -1710,7 +1710,7 @@ int netif_receive_skb(struct sk_buff *skb)
#endif
if
(
!
skb
->
stamp
.
tv_sec
)
do_g
ettime
ofday
(
&
skb
->
stamp
);
n
et
_
time
stamp
(
&
skb
->
stamp
);
skb_bond
(
skb
);
...
...
This diff is collapsed.
Click to expand it.
net/core/neighbour.c
View file @
7c9c0ff6
...
...
@@ -1094,7 +1094,7 @@ void pneigh_enqueue(struct neigh_table *tbl, struct neigh_parms *p,
kfree_skb
(
skb
);
return
;
}
skb
->
stamp
.
tv_sec
=
0
;
skb
->
stamp
.
tv_sec
=
LOCALLY_ENQUEUED
;
skb
->
stamp
.
tv_usec
=
now
+
sched_next
;
spin_lock
(
&
tbl
->
proxy_queue
.
lock
);
...
...
This diff is collapsed.
Click to expand it.
net/core/sock.c
View file @
7c9c0ff6
...
...
@@ -328,6 +328,8 @@ int sock_setsockopt(struct socket *sock, int level, int optname,
case
SO_TIMESTAMP
:
sk
->
sk_rcvtstamp
=
valbool
;
if
(
valbool
)
sock_enable_timestamp
(
sk
);
break
;
case
SO_RCVLOWAT
:
...
...
@@ -642,6 +644,8 @@ void sk_free(struct sock *sk)
sk
->
sk_filter
=
NULL
;
}
sock_disable_timestamp
(
sk
);
if
(
atomic_read
(
&
sk
->
sk_omem_alloc
))
printk
(
KERN_DEBUG
"%s: optmem leakage (%d bytes) detected.
\n
"
,
__FUNCTION__
,
atomic_read
(
&
sk
->
sk_omem_alloc
));
...
...
@@ -1135,6 +1139,9 @@ void sock_init_data(struct socket *sock, struct sock *sk)
sk
->
sk_sndtimeo
=
MAX_SCHEDULE_TIMEOUT
;
sk
->
sk_owner
=
NULL
;
sk
->
sk_stamp
.
tv_sec
=
-
1L
;
sk
->
sk_stamp
.
tv_usec
=
-
1L
;
atomic_set
(
&
sk
->
sk_refcnt
,
1
);
}
...
...
@@ -1160,9 +1167,42 @@ void fastcall release_sock(struct sock *sk)
wake_up
(
&
(
sk
->
sk_lock
.
wq
));
spin_unlock_bh
(
&
(
sk
->
sk_lock
.
slock
));
}
EXPORT_SYMBOL
(
release_sock
);
/* When > 0 there are consumers of rx skb time stamps */
atomic_t
netstamp_needed
=
ATOMIC_INIT
(
0
);
int
sock_get_timestamp
(
struct
sock
*
sk
,
struct
timeval
*
userstamp
)
{
if
(
!
sock_flag
(
sk
,
SOCK_TIMESTAMP
))
sock_enable_timestamp
(
sk
);
if
(
sk
->
sk_stamp
.
tv_sec
==
-
1
)
return
-
ENOENT
;
if
(
sk
->
sk_stamp
.
tv_sec
==
0
)
do_gettimeofday
(
&
sk
->
sk_stamp
);
return
copy_to_user
(
userstamp
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
}
EXPORT_SYMBOL
(
sock_get_timestamp
);
void
sock_enable_timestamp
(
struct
sock
*
sk
)
{
if
(
!
sock_flag
(
sk
,
SOCK_TIMESTAMP
))
{
sock_set_flag
(
sk
,
SOCK_TIMESTAMP
);
atomic_inc
(
&
netstamp_needed
);
}
}
EXPORT_SYMBOL
(
sock_enable_timestamp
);
void
sock_disable_timestamp
(
struct
sock
*
sk
)
{
if
(
sock_flag
(
sk
,
SOCK_TIMESTAMP
))
{
sock_reset_flag
(
sk
,
SOCK_TIMESTAMP
);
atomic_dec
(
&
netstamp_needed
);
}
}
EXPORT_SYMBOL
(
sock_disable_timestamp
);
EXPORT_SYMBOL
(
__lock_sock
);
EXPORT_SYMBOL
(
__release_sock
);
EXPORT_SYMBOL
(
sk_alloc
);
...
...
This diff is collapsed.
Click to expand it.
net/econet/af_econet.c
View file @
7c9c0ff6
...
...
@@ -665,10 +665,8 @@ static int econet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg
switch
(
cmd
)
{
case
SIOCGSTAMP
:
if
(
!
sk
->
sk_stamp
.
tv_sec
)
return
-
ENOENT
;
return
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
return
sock_get_timestamp
(
sk
,(
struct
timeval
*
)
arg
);
case
SIOCSIFADDR
:
case
SIOCGIFADDR
:
return
ec_dev_ioctl
(
sock
,
cmd
,
(
void
*
)
arg
);
...
...
This diff is collapsed.
Click to expand it.
net/ipv4/af_inet.c
View file @
7c9c0ff6
...
...
@@ -843,11 +843,7 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
switch
(
cmd
)
{
case
SIOCGSTAMP
:
if
(
!
sk
->
sk_stamp
.
tv_sec
)
err
=
-
ENOENT
;
else
if
(
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
)))
err
=
-
EFAULT
;
err
=
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
break
;
case
SIOCADDRT
:
case
SIOCDELRT
:
...
...
This diff is collapsed.
Click to expand it.
net/ipv4/arp.c
View file @
7c9c0ff6
...
...
@@ -860,7 +860,7 @@ int arp_process(struct sk_buff *skb)
if
(
n
)
neigh_release
(
n
);
if
(
skb
->
stamp
.
tv_sec
==
0
||
if
(
skb
->
stamp
.
tv_sec
==
LOCALLY_ENQUEUED
||
skb
->
pkt_type
==
PACKET_HOST
||
in_dev
->
arp_parms
->
proxy_delay
==
0
)
{
arp_send
(
ARPOP_REPLY
,
ETH_P_ARP
,
sip
,
dev
,
tip
,
sha
,
dev
->
dev_addr
,
sha
);
...
...
This diff is collapsed.
Click to expand it.
net/ipv6/af_inet6.c
View file @
7c9c0ff6
...
...
@@ -474,13 +474,7 @@ int inet6_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
switch
(
cmd
)
{
case
SIOCGSTAMP
:
if
(
!
sk
->
sk_stamp
.
tv_sec
)
return
-
ENOENT
;
err
=
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
));
if
(
err
)
return
-
EFAULT
;
return
0
;
return
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
case
SIOCADDRT
:
case
SIOCDELRT
:
...
...
This diff is collapsed.
Click to expand it.
net/ipv6/ndisc.c
View file @
7c9c0ff6
...
...
@@ -764,7 +764,7 @@ static void ndisc_recv_ns(struct sk_buff *skb)
if
(
ipv6_chk_acast_addr
(
dev
,
&
msg
->
target
)
||
(
idev
->
cnf
.
forwarding
&&
pneigh_lookup
(
&
nd_tbl
,
&
msg
->
target
,
dev
,
0
)))
{
if
(
skb
->
stamp
.
tv_sec
!=
0
&&
if
(
skb
->
stamp
.
tv_sec
!=
LOCALLY_ENQUEUED
&&
skb
->
pkt_type
!=
PACKET_HOST
&&
inc
!=
0
&&
idev
->
nd_parms
->
proxy_delay
!=
0
)
{
...
...
This diff is collapsed.
Click to expand it.
net/ipx/af_ipx.c
View file @
7c9c0ff6
...
...
@@ -1797,7 +1797,8 @@ static int ipx_recvmsg(struct kiocb *iocb, struct socket *sock,
copied
);
if
(
rc
)
goto
out_free
;
sk
->
sk_stamp
=
skb
->
stamp
;
if
(
skb
->
stamp
.
tv_sec
)
sk
->
sk_stamp
=
skb
->
stamp
;
msg
->
msg_namelen
=
sizeof
(
*
sipx
);
...
...
@@ -1870,15 +1871,8 @@ static int ipx_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
break
;
case
SIOCGSTAMP
:
rc
=
-
EINVAL
;
if
(
sk
)
{
rc
=
-
ENOENT
;
if
(
!
sk
->
sk_stamp
.
tv_sec
)
break
;
rc
=
-
EFAULT
;
if
(
!
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
)))
rc
=
0
;
}
if
(
sk
)
rc
=
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
break
;
case
SIOCGIFDSTADDR
:
case
SIOCSIFDSTADDR
:
...
...
This diff is collapsed.
Click to expand it.
net/irda/af_irda.c
View file @
7c9c0ff6
...
...
@@ -1796,14 +1796,8 @@ static int irda_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
}
case
SIOCGSTAMP
:
if
(
sk
!=
NULL
)
{
if
(
!
sk
->
sk_stamp
.
tv_sec
)
return
-
ENOENT
;
if
(
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
)))
return
-
EFAULT
;
return
0
;
}
if
(
sk
!=
NULL
)
return
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
return
-
EINVAL
;
case
SIOCGIFADDR
:
...
...
This diff is collapsed.
Click to expand it.
net/netrom/af_netrom.c
View file @
7c9c0ff6
...
...
@@ -1200,17 +1200,11 @@ static int nr_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
}
case
SIOCGSTAMP
:
if
(
sk
!=
NULL
)
{
if
(
!
sk
->
sk_stamp
.
tv_sec
)
{
release_sock
(
sk
);
return
-
ENOENT
;
}
ret
=
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
release_sock
(
sk
);
return
ret
;
}
ret
=
-
EINVAL
;
if
(
sk
!=
NULL
)
ret
=
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
release_sock
(
sk
);
return
-
EINVAL
;
return
ret
;
case
SIOCGIFADDR
:
case
SIOCSIFADDR
:
...
...
This diff is collapsed.
Click to expand it.
net/packet/af_packet.c
View file @
7c9c0ff6
...
...
@@ -625,6 +625,10 @@ static int tpacket_rcv(struct sk_buff *skb, struct net_device *dev, struct pack
h
->
tp_snaplen
=
snaplen
;
h
->
tp_mac
=
macoff
;
h
->
tp_net
=
netoff
;
if
(
skb
->
stamp
.
tv_sec
==
0
)
{
do_gettimeofday
(
&
skb
->
stamp
);
sock_enable_timestamp
(
sk
);
}
h
->
tp_sec
=
skb
->
stamp
.
tv_sec
;
h
->
tp_usec
=
skb
->
stamp
.
tv_usec
;
...
...
@@ -1461,13 +1465,8 @@ static int packet_ioctl(struct socket *sock, unsigned int cmd,
return
put_user
(
amount
,
(
int
*
)
arg
);
}
case
SIOCGSTAMP
:
if
(
!
sk
->
sk_stamp
.
tv_sec
)
return
-
ENOENT
;
if
(
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
)))
return
-
EFAULT
;
break
;
return
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
#ifdef CONFIG_INET
case
SIOCADDRT
:
case
SIOCDELRT
:
...
...
This diff is collapsed.
Click to expand it.
net/rose/af_rose.c
View file @
7c9c0ff6
...
...
@@ -1269,12 +1269,8 @@ static int rose_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
}
case
SIOCGSTAMP
:
if
(
sk
!=
NULL
)
{
if
(
!
sk
->
sk_stamp
.
tv_sec
)
return
-
ENOENT
;
return
copy_to_user
((
void
*
)
arg
,
&
sk
->
sk_stamp
,
sizeof
(
struct
timeval
))
?
-
EFAULT
:
0
;
}
if
(
sk
!=
NULL
)
return
sock_get_timestamp
(
sk
,
(
struct
timeval
*
)
arg
);
return
-
EINVAL
;
case
SIOCGIFADDR
:
...
...
This diff is collapsed.
Click to expand it.
net/rxrpc/transport.c
View file @
7c9c0ff6
...
...
@@ -341,6 +341,11 @@ static int rxrpc_incoming_msg(struct rxrpc_transport *trans,
msg
->
trans
=
trans
;
msg
->
state
=
RXRPC_MSG_RECEIVED
;
msg
->
stamp
=
pkt
->
stamp
;
if
(
msg
->
stamp
.
tv_sec
==
0
)
{
do_gettimeofday
(
&
msg
->
stamp
);
if
(
pkt
->
sk
)
sock_enable_timestamp
(
pkt
->
sk
);
}
msg
->
seq
=
ntohl
(
msg
->
hdr
.
seq
);
/* attach the packet */
...
...
This diff is collapsed.
Click to expand it.
net/sctp/input.c
View file @
7c9c0ff6
...
...
@@ -175,6 +175,12 @@ int sctp_rcv(struct sk_buff *skb)
rcvr
=
asoc
?
&
asoc
->
base
:
&
ep
->
base
;
sk
=
rcvr
->
sk
;
/* SCTP seems to always need a timestamp right now (FIXME) */
if
(
skb
->
stamp
.
tv_sec
==
0
)
{
do_gettimeofday
(
&
skb
->
stamp
);
sock_enable_timestamp
(
sk
);
}
if
(
!
xfrm_policy_check
(
sk
,
XFRM_POLICY_IN
,
skb
,
family
))
goto
discard_release
;
...
...
This diff is collapsed.
Click to expand it.
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment