Lines Matching refs:rs
69 static void rds_recv_rcvbuf_delta(struct rds_sock *rs, struct sock *sk, in rds_recv_rcvbuf_delta() argument
78 rs->rs_rcv_bytes += delta; in rds_recv_rcvbuf_delta()
79 now_congested = rs->rs_rcv_bytes > rds_sk_rcvbuf(rs); in rds_recv_rcvbuf_delta()
83 rs, &rs->rs_bound_addr, in rds_recv_rcvbuf_delta()
84 ntohs(rs->rs_bound_port), rs->rs_rcv_bytes, in rds_recv_rcvbuf_delta()
85 rds_sk_rcvbuf(rs), now_congested, delta); in rds_recv_rcvbuf_delta()
88 if (!rs->rs_congested && now_congested) { in rds_recv_rcvbuf_delta()
89 rs->rs_congested = 1; in rds_recv_rcvbuf_delta()
96 else if (rs->rs_congested && (rs->rs_rcv_bytes < (rds_sk_rcvbuf(rs)/2))) { in rds_recv_rcvbuf_delta()
97 rs->rs_congested = 0; in rds_recv_rcvbuf_delta()
108 static void rds_recv_incoming_exthdrs(struct rds_incoming *inc, struct rds_sock *rs) in rds_recv_incoming_exthdrs() argument
126 rds_rdma_unuse(rs, be32_to_cpu(buffer.rdma.h_rdma_rkey), 0); in rds_recv_incoming_exthdrs()
160 struct rds_sock *rs = NULL; in rds_recv_incoming() local
211 rs = rds_find_bound(daddr, inc->i_hdr.h_dport); in rds_recv_incoming()
212 if (!rs) { in rds_recv_incoming()
218 rds_recv_incoming_exthdrs(inc, rs); in rds_recv_incoming()
221 sk = rds_rs_to_sk(rs); in rds_recv_incoming()
224 write_lock_irqsave(&rs->rs_recv_lock, flags); in rds_recv_incoming()
226 rdsdebug("adding inc %p to rs %p's recv queue\n", inc, rs); in rds_recv_incoming()
228 rds_recv_rcvbuf_delta(rs, sk, inc->i_conn->c_lcong, in rds_recv_incoming()
232 list_add_tail(&inc->i_item, &rs->rs_recv_queue); in rds_recv_incoming()
237 write_unlock_irqrestore(&rs->rs_recv_lock, flags); in rds_recv_incoming()
240 if (rs) in rds_recv_incoming()
241 rds_sock_put(rs); in rds_recv_incoming()
249 static int rds_next_incoming(struct rds_sock *rs, struct rds_incoming **inc) in rds_next_incoming() argument
254 read_lock_irqsave(&rs->rs_recv_lock, flags); in rds_next_incoming()
255 if (!list_empty(&rs->rs_recv_queue)) { in rds_next_incoming()
256 *inc = list_entry(rs->rs_recv_queue.next, in rds_next_incoming()
261 read_unlock_irqrestore(&rs->rs_recv_lock, flags); in rds_next_incoming()
267 static int rds_still_queued(struct rds_sock *rs, struct rds_incoming *inc, in rds_still_queued() argument
270 struct sock *sk = rds_rs_to_sk(rs); in rds_still_queued()
274 write_lock_irqsave(&rs->rs_recv_lock, flags); in rds_still_queued()
279 rds_recv_rcvbuf_delta(rs, sk, inc->i_conn->c_lcong, in rds_still_queued()
286 write_unlock_irqrestore(&rs->rs_recv_lock, flags); in rds_still_queued()
288 rdsdebug("inc %p rs %p still %d dropped %d\n", inc, rs, ret, drop); in rds_still_queued()
296 int rds_notify_queue_get(struct rds_sock *rs, struct msghdr *msghdr) in rds_notify_queue_get() argument
319 spin_lock_irqsave(&rs->rs_lock, flags); in rds_notify_queue_get()
320 while (!list_empty(&rs->rs_notify_queue) && count < max_messages) { in rds_notify_queue_get()
321 notifier = list_entry(rs->rs_notify_queue.next, in rds_notify_queue_get()
326 spin_unlock_irqrestore(&rs->rs_lock, flags); in rds_notify_queue_get()
352 spin_lock_irqsave(&rs->rs_lock, flags); in rds_notify_queue_get()
353 list_splice(©, &rs->rs_notify_queue); in rds_notify_queue_get()
354 spin_unlock_irqrestore(&rs->rs_lock, flags); in rds_notify_queue_get()
363 static int rds_notify_cong(struct rds_sock *rs, struct msghdr *msghdr) in rds_notify_cong() argument
365 uint64_t notify = rs->rs_cong_notify; in rds_notify_cong()
374 spin_lock_irqsave(&rs->rs_lock, flags); in rds_notify_cong()
375 rs->rs_cong_notify &= ~notify; in rds_notify_cong()
376 spin_unlock_irqrestore(&rs->rs_lock, flags); in rds_notify_cong()
402 struct rds_sock *rs = rds_sk_to_rs(sk); in rds_recvmsg() local
419 if (!list_empty(&rs->rs_notify_queue)) { in rds_recvmsg()
420 ret = rds_notify_queue_get(rs, msg); in rds_recvmsg()
424 if (rs->rs_cong_notify) { in rds_recvmsg()
425 ret = rds_notify_cong(rs, msg); in rds_recvmsg()
429 if (!rds_next_incoming(rs, &inc)) { in rds_recvmsg()
436 (!list_empty(&rs->rs_notify_queue) || in rds_recvmsg()
437 rs->rs_cong_notify || in rds_recvmsg()
438 rds_next_incoming(rs, &inc)), timeo); in rds_recvmsg()
463 if (!rds_still_queued(rs, inc, !(msg_flags & MSG_PEEK))) { in rds_recvmsg()
506 void rds_clear_recv_queue(struct rds_sock *rs) in rds_clear_recv_queue() argument
508 struct sock *sk = rds_rs_to_sk(rs); in rds_clear_recv_queue()
512 write_lock_irqsave(&rs->rs_recv_lock, flags); in rds_clear_recv_queue()
513 list_for_each_entry_safe(inc, tmp, &rs->rs_recv_queue, i_item) { in rds_clear_recv_queue()
514 rds_recv_rcvbuf_delta(rs, sk, inc->i_conn->c_lcong, in rds_clear_recv_queue()
520 write_unlock_irqrestore(&rs->rs_recv_lock, flags); in rds_clear_recv_queue()