阅读:3399回复:5
tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC))函数的讨论
在此函数中const struct inet_connection_sock *icsk = inet_csk(sk);
定义为const 是否意味着所有sk的*icsk是相同的? 在SMP下在此函数中可以如此使用,作者仅为了节省一些资源吗?其它地方如此使用会有问题. |
|
沙发#
发布于:2007-03-22 20:07
struct inet_connection_sock {
/* inet_sock has to be the first member! */ struct inet_sock icsk_inet; struct request_sock_queue icsk_accept_queue; struct inet_bind_bucket *icsk_bind_hash; unsigned long icsk_timeout; struct timer_list icsk_retransmit_timer; struct timer_list icsk_delack_timer; __u32 icsk_rto; __u32 icsk_pmtu_cookie; const struct tcp_congestion_ops *icsk_ca_ops; const struct inet_connection_sock_af_ops *icsk_af_ops; unsigned int (*icsk_sync_mss)(struct sock *sk, u32 pmtu); __u8 icsk_ca_state; __u8 icsk_retransmits; __u8 icsk_pending; __u8 icsk_backoff; __u8 icsk_syn_retries; __u8 icsk_probes_out; __u16 icsk_ext_hdr_len; struct { __u8 pending; /* ACK is pending */ __u8 quick; /* Scheduled number of quick acks */ __u8 pingpong; /* The session is interactive */ __u8 blocked; /* Delayed ACK was blocked by socket lock */ __u32 ato; /* Predicted tick of soft clock */ unsigned long timeout; /* Currently scheduled timeout */ __u32 lrcvtime; /* timestamp of last received data packet */ __u16 last_seg_size; /* Size of last incoming segment */ __u16 rcv_mss; /* MSS used for delayed ACK decisions */ } icsk_ack; struct { int enabled; /* Range of MTUs to search */ int search_high; int search_low; /* Information on the current probe. */ int probe_size; } icsk_mtup; u32 icsk_ca_priv[16]; #define ICSK_CA_PRIV_SIZE (16 * sizeof(u32)) }; 该结构中第一个数据是inet_sock。 struct inet_sock { /* sk and pinet6 has to be the first two members of inet_sock */ struct sock sk; #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) struct ipv6_pinfo *pinet6; #endif /* Socket demultiplex comparisons on incoming packets. */ __u32 daddr; __u32 rcv_saddr; __u16 dport; __u16 num; __u32 saddr; __s16 uc_ttl; __u16 cmsg_flags; struct ip_options *opt; __u16 sport; __u16 id; __u8 tos; __u8 mc_ttl; __u8 pmtudisc; __u8 recverr:1, is_icsk:1, freebind:1, hdrincl:1, mc_loop:1; int mc_index; __u32 mc_addr; struct ip_mc_socklist *mc_list; struct { unsigned int flags; unsigned int fragsize; struct ip_options *opt; struct rtable *rt; int length; /* Total length of all frames */ u32 addr; struct flowi fl; } cork; }; inet_sock第一个结构是sock。 那么此环境中sock起始地址也就是inet_connection_sock起始地址。 所以可以把sock转化为inet_connection_sock,而不是共享数据的原因。他们本来就是一个地址。 |
|
|
板凳#
发布于:2007-03-23 08:23
引用第1楼cyliu于2007-03-22 20:07发表的“”: 对不起,我想你没有看清楚我的问题. |
|
地板#
发布于:2007-03-23 09:41
引用第0楼zhaoyanghong于2007-03-22 17:33发表的“tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC))函数的问题”: 1 定义为const 是否意味着所有sk的*icsk是相同的? 没有明白你说的意思,参考我上面的解释,本来就是一个地址的引用问题,他们是相同,所以谈不上是否相同。不同的sk当然icsk是不同。 2 在SMP下在此函数中可以如此使用,作者仅为了节省一些资源吗? 为什么在smp下可以如此使用,而在单核下不可以使用,不明白这个和多核有什么关系。本来就是一个存储空间,谈不上为了节省一些资源的问题。不过是c语言的类型转换引起的误会. 3 其它地方如此使用会有问题。 会有什么问题,能否详细说明。 |
|
|
地下室#
发布于:2007-03-23 10:38
引用第3楼cyliu于2007-03-23 09:41发表的“”: 1,2的观点我同意 3 在SMP下 2个CPU均运行到此函数,若CPU1更改了*icsk的一个成员,设置为自己上下文的值,CPU2也更改了*icsk的相同成员的值, 发生使用冲突----当然可能内核中没有这样使用,*icsk其它成员均市是公用的. |
|
5楼#
发布于:2007-03-23 13:29
在smp下,有些数据时需要考虑同步问题。但是对于sock在该接口中并不需要,因为所用到的数据是一些调用接口,而这些接口伴随sock生命周期
|
|
|