函数tcp_try_rmem_schedule在TCP的接收路径中调用,比如tcp_data_queue函数和tcp_data_queue_ofo函数,以及用于TCP套接口REPAIR模式的tcp_send_rcvq函数。如下为tcp_data_queue函数,如果接收队列sk_receive_queue为空,使用sk_forced_mem_schedule函数强制分配缓存额度,否则,使用tcp_try_rmem_schedule函数进行正常...
sk_forward_alloc:发送队列中可以直接使用的空间大小,是指已经分配了但尚未使用的空间。 sk_wmem_queued:发送队列所占空间,仅用于STREAM类型协议,替代sk_wmem_alloc。最大不能超过发送缓冲区大小。 接口: sk_wmem_schedule()发送队列内存申请。从协议内存限额中分配,分配的空间在sk_forward_alloc中。 sk_rmem_sched...
atomic_t rmem_alloc; int len; struct sk_buff *head; struct sk_buff *tail; } sk_backlog; ///这个只针对接收数据,发送数据对应的是sk_rmem_alloc, //阅读函数__sk_mem_schedule可以了解proto的内存情况判断方法 //表示接收队列中所有skb的总长度,在sock_queue_rcv_skb函数的skb_set_owner_r中增加 ...
最终在函数__sk_add_backlog将数据包添加到backlog链表后,为链表的长度增加skb的truesize值。 static inline bool sk_rcvqueues_full(const struct sock *sk, unsigned int limit) { unsigned int qsize = sk->sk_backlog.len + atomic_read(&sk->sk_rmem_alloc); return qsize > limit; } static inl...
volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的序列号 */
atomic_t rmem_alloc;intlen;structsk_buff *head;structsk_buff *tail; } sk_backlog;///这个只针对接收数据,发送数据对应的是sk_rmem_alloc,//阅读函数__sk_mem_schedule可以了解proto的内存情况判断方法//表示接收队列中所有skb的总长度,在sock_queue_rcv_skb函数的skb_set_owner_r中增加#definesk_rmem...
struct sk_msg *msg; if (atomic_read(&sk->sk_rmem_alloc) > sk->sk_rcvbuf) return NULL; if (!sk_rmem_schedule(sk, skb, skb->truesize)) return NULL; msg = kzalloc(sizeof(*msg), __GFP_NOWARN | GFP_ATOMIC); if (unlikely(!msg)) return NULL; sk_msg_init(msg)...
volatileunsignedlongwmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatileunsignedlongrmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证可靠数据传输而使用的*** */ unsignedlongwrite_seq;// ...
* 大部分功能是为TCP准备的 */ struct sock { struct options *opt;//IP选项缓冲于此处 volatile unsigned long wmem_alloc;//发送缓冲队列中存放的数据的大小,这两个与后面的rcvbuf和sndbuf一起使用 volatile unsigned long rmem_alloc;//接收缓冲队列中存放的数据的大小 /* 下面三个seq用于TCP协议中为保证...
rmem_alloc和rcvbuf,wmem_alloc 和sndbuf用于不同的目的。当我们收到一个数据包后,需要统计这个socket总共消耗的内存,这是通过skb_set_owner_r()来做的。 static inline void skb_set_owner_r(struct sk_buff *skb, struct sock *sk) { skb->sk = sk; skb->destructor = sock_rfree; atomic_add(skb-...