diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-23 11:47:02 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-10-23 11:47:02 -0700 | 
| commit | 5f05647dd81c11a6a165ccc8f0c1370b16f3bcb0 (patch) | |
| tree | 7851ef1c93aa1aba7ef327ca4b75fd35e6d10f29 /net/rds/loop.c | |
| parent | 02f36038c568111ad4fc433f6fa760ff5e38fab4 (diff) | |
| parent | ec37a48d1d16c30b655ac5280209edf52a6775d4 (diff) | |
| download | olio-linux-3.10-5f05647dd81c11a6a165ccc8f0c1370b16f3bcb0.tar.xz olio-linux-3.10-5f05647dd81c11a6a165ccc8f0c1370b16f3bcb0.zip  | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next-2.6: (1699 commits)
  bnx2/bnx2x: Unsupported Ethtool operations should return -EINVAL.
  vlan: Calling vlan_hwaccel_do_receive() is always valid.
  tproxy: use the interface primary IP address as a default value for --on-ip
  tproxy: added IPv6 support to the socket match
  cxgb3: function namespace cleanup
  tproxy: added IPv6 support to the TPROXY target
  tproxy: added IPv6 socket lookup function to nf_tproxy_core
  be2net: Changes to use only priority codes allowed by f/w
  tproxy: allow non-local binds of IPv6 sockets if IP_TRANSPARENT is enabled
  tproxy: added tproxy sockopt interface in the IPV6 layer
  tproxy: added udp6_lib_lookup function
  tproxy: added const specifiers to udp lookup functions
  tproxy: split off ipv6 defragmentation to a separate module
  l2tp: small cleanup
  nf_nat: restrict ICMP translation for embedded header
  can: mcp251x: fix generation of error frames
  can: mcp251x: fix endless loop in interrupt handler if CANINTF_MERRF is set
  can-raw: add msg_flags to distinguish local traffic
  9p: client code cleanup
  rds: make local functions/variables static
  ...
Fix up conflicts in net/core/dev.c, drivers/net/pcmcia/smc91c92_cs.c and
drivers/net/wireless/ath/ath9k/debug.c as per David
Diffstat (limited to 'net/rds/loop.c')
| -rw-r--r-- | net/rds/loop.c | 31 | 
1 files changed, 17 insertions, 14 deletions
diff --git a/net/rds/loop.c b/net/rds/loop.c index dd987937945..c390156b426 100644 --- a/net/rds/loop.c +++ b/net/rds/loop.c @@ -61,10 +61,17 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm,  			 unsigned int hdr_off, unsigned int sg,  			 unsigned int off)  { +	/* Do not send cong updates to loopback */ +	if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) { +		rds_cong_map_updated(conn->c_fcong, ~(u64) 0); +		return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; +	} +  	BUG_ON(hdr_off || sg || off);  	rds_inc_init(&rm->m_inc, conn, conn->c_laddr); -	rds_message_addref(rm); /* for the inc */ +	/* For the embedded inc. Matching put is in loop_inc_free() */ +	rds_message_addref(rm);  	rds_recv_incoming(conn, conn->c_laddr, conn->c_faddr, &rm->m_inc,  			  GFP_KERNEL, KM_USER0); @@ -77,16 +84,14 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm,  	return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len);  } -static int rds_loop_xmit_cong_map(struct rds_connection *conn, -				  struct rds_cong_map *map, -				  unsigned long offset) +/* + * See rds_loop_xmit(). Since our inc is embedded in the rm, we + * make sure the rm lives at least until the inc is done. + */ +static void rds_loop_inc_free(struct rds_incoming *inc)  { -	BUG_ON(offset); -	BUG_ON(map != conn->c_lcong); - -	rds_cong_map_updated(conn->c_fcong, ~(u64) 0); - -	return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES; +        struct rds_message *rm = container_of(inc, struct rds_message, m_inc); +        rds_message_put(rm);  }  /* we need to at least give the thread something to succeed */ @@ -112,7 +117,7 @@ static int rds_loop_conn_alloc(struct rds_connection *conn, gfp_t gfp)  	unsigned long flags;  	lc = kzalloc(sizeof(struct rds_loop_connection), GFP_KERNEL); -	if (lc == NULL) +	if (!lc)  		return -ENOMEM;  	INIT_LIST_HEAD(&lc->loop_node); @@ -169,14 +174,12 @@ void rds_loop_exit(void)   */  struct rds_transport rds_loop_transport = {  	.xmit			= rds_loop_xmit, -	.xmit_cong_map		= rds_loop_xmit_cong_map,  	.recv			= rds_loop_recv,  	.conn_alloc		= rds_loop_conn_alloc,  	.conn_free		= rds_loop_conn_free,  	.conn_connect		= rds_loop_conn_connect,  	.conn_shutdown		= rds_loop_conn_shutdown,  	.inc_copy_to_user	= rds_message_inc_copy_to_user, -	.inc_purge		= rds_message_inc_purge, -	.inc_free		= rds_message_inc_free, +	.inc_free		= rds_loop_inc_free,  	.t_name			= "loopback",  };  |