Lines Matching refs:inc

44 void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn,
47 refcount_set(&inc->i_refcount, 1);
48 INIT_LIST_HEAD(&inc->i_item);
49 inc->i_conn = conn;
50 inc->i_saddr = *saddr;
51 inc->i_usercopy.rdma_cookie = 0;
52 inc->i_usercopy.rx_tstamp = ktime_set(0, 0);
54 memset(inc->i_rx_lat_trace, 0, sizeof(inc->i_rx_lat_trace));
58 void rds_inc_path_init(struct rds_incoming *inc, struct rds_conn_path *cp,
61 refcount_set(&inc->i_refcount, 1);
62 INIT_LIST_HEAD(&inc->i_item);
63 inc->i_conn = cp->cp_conn;
64 inc->i_conn_path = cp;
65 inc->i_saddr = *saddr;
66 inc->i_usercopy.rdma_cookie = 0;
67 inc->i_usercopy.rx_tstamp = ktime_set(0, 0);
71 static void rds_inc_addref(struct rds_incoming *inc)
73 rdsdebug("addref inc %p ref %d\n", inc, refcount_read(&inc->i_refcount));
74 refcount_inc(&inc->i_refcount);
77 void rds_inc_put(struct rds_incoming *inc)
79 rdsdebug("put inc %p ref %d\n", inc, refcount_read(&inc->i_refcount));
80 if (refcount_dec_and_test(&inc->i_refcount)) {
81 BUG_ON(!list_empty(&inc->i_item));
83 inc->i_conn->c_trans->inc_free(inc);
166 static void rds_recv_incoming_exthdrs(struct rds_incoming *inc, struct rds_sock *rs)
168 struct rds_header *hdr = &inc->i_hdr;
190 inc->i_usercopy.rdma_cookie = rds_rdma_make_cookie(
285 struct rds_incoming *inc, gfp_t gfp)
292 inc->i_conn = conn;
293 inc->i_rx_jiffies = jiffies;
295 cp = inc->i_conn_path;
299 rdsdebug("conn %p next %llu inc %p seq %llu len %u sport %u dport %u "
302 inc,
303 (unsigned long long)be64_to_cpu(inc->i_hdr.h_sequence),
304 be32_to_cpu(inc->i_hdr.h_len),
305 be16_to_cpu(inc->i_hdr.h_sport),
306 be16_to_cpu(inc->i_hdr.h_dport),
307 inc->i_hdr.h_flags,
308 inc->i_rx_jiffies);
330 if (be64_to_cpu(inc->i_hdr.h_sequence) < cp->cp_next_rx_seq &&
331 (inc->i_hdr.h_flags & RDS_FLAG_RETRANSMITTED)) {
335 cp->cp_next_rx_seq = be64_to_cpu(inc->i_hdr.h_sequence) + 1;
337 if (rds_sysctl_ping_enable && inc->i_hdr.h_dport == 0) {
338 if (inc->i_hdr.h_sport == 0) {
344 rds_send_pong(cp, inc->i_hdr.h_sport);
346 if (RDS_HS_PROBE(be16_to_cpu(inc->i_hdr.h_sport),
347 be16_to_cpu(inc->i_hdr.h_dport))) {
348 rds_recv_hs_exthdrs(&inc->i_hdr, cp->cp_conn);
354 if (be16_to_cpu(inc->i_hdr.h_dport) == RDS_FLAG_PROBE_PORT &&
355 inc->i_hdr.h_sport == 0) {
356 rds_recv_hs_exthdrs(&inc->i_hdr, cp->cp_conn);
363 rs = rds_find_bound(daddr, inc->i_hdr.h_dport, conn->c_bound_if);
370 rds_recv_incoming_exthdrs(inc, rs);
378 rdsdebug("adding inc %p to rs %p's recv queue\n", inc, rs);
380 rds_recv_rcvbuf_delta(rs, sk, inc->i_conn->c_lcong,
381 be32_to_cpu(inc->i_hdr.h_len),
382 inc->i_hdr.h_dport);
384 inc->i_usercopy.rx_tstamp = ktime_get_real();
385 rds_inc_addref(inc);
386 inc->i_rx_lat_trace[RDS_MSG_RX_END] = local_clock();
387 list_add_tail(&inc->i_item, &rs->rs_recv_queue);
404 static int rds_next_incoming(struct rds_sock *rs, struct rds_incoming **inc)
408 if (!*inc) {
411 *inc = list_entry(rs->rs_recv_queue.next,
414 rds_inc_addref(*inc);
419 return *inc != NULL;
422 static int rds_still_queued(struct rds_sock *rs, struct rds_incoming *inc,
431 if (!list_empty(&inc->i_item)) {
435 rds_recv_rcvbuf_delta(rs, sk, inc->i_conn->c_lcong,
436 -be32_to_cpu(inc->i_hdr.h_len),
437 inc->i_hdr.h_dport);
438 list_del_init(&inc->i_item);
439 to_drop = inc;
447 rdsdebug("inc %p rs %p still %d dropped %d\n", inc, rs, ret, drop);
544 static int rds_cmsg_recv(struct rds_incoming *inc, struct msghdr *msg,
549 if (inc->i_usercopy.rdma_cookie) {
551 sizeof(inc->i_usercopy.rdma_cookie),
552 &inc->i_usercopy.rdma_cookie);
557 if ((inc->i_usercopy.rx_tstamp != 0) &&
560 ns_to_kernel_old_timeval(inc->i_usercopy.rx_tstamp);
584 inc->i_rx_lat_trace[RDS_MSG_RX_CMSG] = local_clock();
589 t.rx_trace[i] = inc->i_rx_lat_trace[j + 1] -
590 inc->i_rx_lat_trace[j];
647 struct rds_incoming *inc = NULL;
671 if (!rds_next_incoming(rs, &inc)) {
682 rds_next_incoming(rs, &inc)), timeo);
683 rdsdebug("recvmsg woke inc %p timeo %ld\n", inc,
694 rdsdebug("copying inc %p from %pI6c:%u to user\n", inc,
695 &inc->i_conn->c_faddr,
696 ntohs(inc->i_hdr.h_sport));
697 ret = inc->i_conn->c_trans->inc_copy_to_user(inc, &msg->msg_iter);
706 if (!rds_still_queued(rs, inc, !(msg_flags & MSG_PEEK))) {
707 rds_inc_put(inc);
708 inc = NULL;
714 if (ret < be32_to_cpu(inc->i_hdr.h_len)) {
716 ret = be32_to_cpu(inc->i_hdr.h_len);
720 if (rds_cmsg_recv(inc, msg, rs)) {
729 if (ipv6_addr_v4mapped(&inc->i_saddr)) {
731 sin->sin_port = inc->i_hdr.h_sport;
733 inc->i_saddr.s6_addr32[3];
738 sin6->sin6_port = inc->i_hdr.h_sport;
739 sin6->sin6_addr = inc->i_saddr;
748 if (inc)
749 rds_inc_put(inc);
763 struct rds_incoming *inc, *tmp;
768 list_for_each_entry_safe(inc, tmp, &rs->rs_recv_queue, i_item) {
769 rds_recv_rcvbuf_delta(rs, sk, inc->i_conn->c_lcong,
770 -be32_to_cpu(inc->i_hdr.h_len),
771 inc->i_hdr.h_dport);
772 list_move(&inc->i_item, &to_drop);
776 list_for_each_entry_safe(inc, tmp, &to_drop, i_item) {
777 list_del_init(&inc->i_item);
778 rds_inc_put(inc);
783 * inc->i_saddr isn't used here because it is only set in the receive
786 void rds_inc_info_copy(struct rds_incoming *inc,
792 minfo.seq = be64_to_cpu(inc->i_hdr.h_sequence);
793 minfo.len = be32_to_cpu(inc->i_hdr.h_len);
794 minfo.tos = inc->i_conn->c_tos;
799 minfo.lport = inc->i_hdr.h_dport;
800 minfo.fport = inc->i_hdr.h_sport;
804 minfo.lport = inc->i_hdr.h_sport;
805 minfo.fport = inc->i_hdr.h_dport;
814 void rds6_inc_info_copy(struct rds_incoming *inc,
821 minfo6.seq = be64_to_cpu(inc->i_hdr.h_sequence);
822 minfo6.len = be32_to_cpu(inc->i_hdr.h_len);
823 minfo6.tos = inc->i_conn->c_tos;
828 minfo6.lport = inc->i_hdr.h_dport;
829 minfo6.fport = inc->i_hdr.h_sport;
833 minfo6.lport = inc->i_hdr.h_sport;
834 minfo6.fport = inc->i_hdr.h_dport;