tcp_recv.c (2d8ad8719591fa803b0d589ed057fa46f49b7155) | tcp_recv.c (6114eab535ab49239e0a6ce08eb9243664aef993) |
---|---|
1/* 2 * Copyright (c) 2006 Oracle. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 155 unchanged lines hidden (view full) --- 164 } 165 166 rds_cong_map_updated(map, ~(u64) 0); 167} 168 169struct rds_tcp_desc_arg { 170 struct rds_connection *conn; 171 gfp_t gfp; | 1/* 2 * Copyright (c) 2006 Oracle. All rights reserved. 3 * 4 * This software is available to you under a choice of one of two 5 * licenses. You may choose to be licensed under the terms of the GNU 6 * General Public License (GPL) Version 2, available from the file 7 * COPYING in the main directory of this source tree, or the 8 * OpenIB.org BSD license below: --- 155 unchanged lines hidden (view full) --- 164 } 165 166 rds_cong_map_updated(map, ~(u64) 0); 167} 168 169struct rds_tcp_desc_arg { 170 struct rds_connection *conn; 171 gfp_t gfp; |
172 enum km_type km; | |
173}; 174 175static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, 176 unsigned int offset, size_t len) 177{ 178 struct rds_tcp_desc_arg *arg = desc->arg.data; 179 struct rds_connection *conn = arg->conn; 180 struct rds_tcp_connection *tc = conn->c_transport_data; --- 69 unchanged lines hidden (view full) --- 250 } 251 252 if (tc->t_tinc_hdr_rem == 0 && tc->t_tinc_data_rem == 0) { 253 if (tinc->ti_inc.i_hdr.h_flags == RDS_FLAG_CONG_BITMAP) 254 rds_tcp_cong_recv(conn, tinc); 255 else 256 rds_recv_incoming(conn, conn->c_faddr, 257 conn->c_laddr, &tinc->ti_inc, | 172}; 173 174static int rds_tcp_data_recv(read_descriptor_t *desc, struct sk_buff *skb, 175 unsigned int offset, size_t len) 176{ 177 struct rds_tcp_desc_arg *arg = desc->arg.data; 178 struct rds_connection *conn = arg->conn; 179 struct rds_tcp_connection *tc = conn->c_transport_data; --- 69 unchanged lines hidden (view full) --- 249 } 250 251 if (tc->t_tinc_hdr_rem == 0 && tc->t_tinc_data_rem == 0) { 252 if (tinc->ti_inc.i_hdr.h_flags == RDS_FLAG_CONG_BITMAP) 253 rds_tcp_cong_recv(conn, tinc); 254 else 255 rds_recv_incoming(conn, conn->c_faddr, 256 conn->c_laddr, &tinc->ti_inc, |
258 arg->gfp, arg->km); | 257 arg->gfp); |
259 260 tc->t_tinc_hdr_rem = sizeof(struct rds_header); 261 tc->t_tinc_data_rem = 0; 262 tc->t_tinc = NULL; 263 rds_inc_put(&tinc->ti_inc); 264 tinc = NULL; 265 } 266 } 267out: 268 rdsdebug("returning len %zu left %zu skb len %d rx queue depth %d\n", 269 len, left, skb->len, 270 skb_queue_len(&tc->t_sock->sk->sk_receive_queue)); 271 return len - left; 272} 273 274/* the caller has to hold the sock lock */ | 258 259 tc->t_tinc_hdr_rem = sizeof(struct rds_header); 260 tc->t_tinc_data_rem = 0; 261 tc->t_tinc = NULL; 262 rds_inc_put(&tinc->ti_inc); 263 tinc = NULL; 264 } 265 } 266out: 267 rdsdebug("returning len %zu left %zu skb len %d rx queue depth %d\n", 268 len, left, skb->len, 269 skb_queue_len(&tc->t_sock->sk->sk_receive_queue)); 270 return len - left; 271} 272 273/* the caller has to hold the sock lock */ |
275static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp, 276 enum km_type km) | 274static int rds_tcp_read_sock(struct rds_connection *conn, gfp_t gfp) |
277{ 278 struct rds_tcp_connection *tc = conn->c_transport_data; 279 struct socket *sock = tc->t_sock; 280 read_descriptor_t desc; 281 struct rds_tcp_desc_arg arg; 282 283 /* It's like glib in the kernel! */ 284 arg.conn = conn; 285 arg.gfp = gfp; | 275{ 276 struct rds_tcp_connection *tc = conn->c_transport_data; 277 struct socket *sock = tc->t_sock; 278 read_descriptor_t desc; 279 struct rds_tcp_desc_arg arg; 280 281 /* It's like glib in the kernel! */ 282 arg.conn = conn; 283 arg.gfp = gfp; |
286 arg.km = km; | |
287 desc.arg.data = &arg; 288 desc.error = 0; 289 desc.count = 1; /* give more than one skb per call */ 290 291 tcp_read_sock(sock->sk, &desc, rds_tcp_data_recv); 292 rdsdebug("tcp_read_sock for tc %p gfp 0x%x returned %d\n", tc, gfp, 293 desc.error); 294 --- 11 unchanged lines hidden (view full) --- 306{ 307 struct rds_tcp_connection *tc = conn->c_transport_data; 308 struct socket *sock = tc->t_sock; 309 int ret = 0; 310 311 rdsdebug("recv worker conn %p tc %p sock %p\n", conn, tc, sock); 312 313 lock_sock(sock->sk); | 284 desc.arg.data = &arg; 285 desc.error = 0; 286 desc.count = 1; /* give more than one skb per call */ 287 288 tcp_read_sock(sock->sk, &desc, rds_tcp_data_recv); 289 rdsdebug("tcp_read_sock for tc %p gfp 0x%x returned %d\n", tc, gfp, 290 desc.error); 291 --- 11 unchanged lines hidden (view full) --- 303{ 304 struct rds_tcp_connection *tc = conn->c_transport_data; 305 struct socket *sock = tc->t_sock; 306 int ret = 0; 307 308 rdsdebug("recv worker conn %p tc %p sock %p\n", conn, tc, sock); 309 310 lock_sock(sock->sk); |
314 ret = rds_tcp_read_sock(conn, GFP_KERNEL, KM_USER0); | 311 ret = rds_tcp_read_sock(conn, GFP_KERNEL); |
315 release_sock(sock->sk); 316 317 return ret; 318} 319 320void rds_tcp_data_ready(struct sock *sk, int bytes) 321{ 322 void (*ready)(struct sock *sk, int bytes); --- 8 unchanged lines hidden (view full) --- 331 ready = sk->sk_data_ready; 332 goto out; 333 } 334 335 tc = conn->c_transport_data; 336 ready = tc->t_orig_data_ready; 337 rds_tcp_stats_inc(s_tcp_data_ready_calls); 338 | 312 release_sock(sock->sk); 313 314 return ret; 315} 316 317void rds_tcp_data_ready(struct sock *sk, int bytes) 318{ 319 void (*ready)(struct sock *sk, int bytes); --- 8 unchanged lines hidden (view full) --- 328 ready = sk->sk_data_ready; 329 goto out; 330 } 331 332 tc = conn->c_transport_data; 333 ready = tc->t_orig_data_ready; 334 rds_tcp_stats_inc(s_tcp_data_ready_calls); 335 |
339 if (rds_tcp_read_sock(conn, GFP_ATOMIC, KM_SOFTIRQ0) == -ENOMEM) | 336 if (rds_tcp_read_sock(conn, GFP_ATOMIC) == -ENOMEM) |
340 queue_delayed_work(rds_wq, &conn->c_recv_w, 0); 341out: 342 read_unlock_bh(&sk->sk_callback_lock); 343 ready(sk, bytes); 344} 345 346int rds_tcp_recv_init(void) 347{ --- 12 unchanged lines hidden --- | 337 queue_delayed_work(rds_wq, &conn->c_recv_w, 0); 338out: 339 read_unlock_bh(&sk->sk_callback_lock); 340 ready(sk, bytes); 341} 342 343int rds_tcp_recv_init(void) 344{ --- 12 unchanged lines hidden --- |