aboutsummaryrefslogtreecommitdiffstats
path: root/net/rds/loop.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/rds/loop.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (diff)
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts: litmus/sched_cedf.c
Diffstat (limited to 'net/rds/loop.c')
-rw-r--r--net/rds/loop.c44
1 files changed, 28 insertions, 16 deletions
diff --git a/net/rds/loop.c b/net/rds/loop.c
index dd9879379457..bca6761a3ca2 100644
--- a/net/rds/loop.c
+++ b/net/rds/loop.c
@@ -61,10 +61,22 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm,
61 unsigned int hdr_off, unsigned int sg, 61 unsigned int hdr_off, unsigned int sg,
62 unsigned int off) 62 unsigned int off)
63{ 63{
64 struct scatterlist *sgp = &rm->data.op_sg[sg];
65 int ret = sizeof(struct rds_header) +
66 be32_to_cpu(rm->m_inc.i_hdr.h_len);
67
68 /* Do not send cong updates to loopback */
69 if (rm->m_inc.i_hdr.h_flags & RDS_FLAG_CONG_BITMAP) {
70 rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
71 ret = min_t(int, ret, sgp->length - conn->c_xmit_data_off);
72 goto out;
73 }
74
64 BUG_ON(hdr_off || sg || off); 75 BUG_ON(hdr_off || sg || off);
65 76
66 rds_inc_init(&rm->m_inc, conn, conn->c_laddr); 77 rds_inc_init(&rm->m_inc, conn, conn->c_laddr);
67 rds_message_addref(rm); /* for the inc */ 78 /* For the embedded inc. Matching put is in loop_inc_free() */
79 rds_message_addref(rm);
68 80
69 rds_recv_incoming(conn, conn->c_laddr, conn->c_faddr, &rm->m_inc, 81 rds_recv_incoming(conn, conn->c_laddr, conn->c_faddr, &rm->m_inc,
70 GFP_KERNEL, KM_USER0); 82 GFP_KERNEL, KM_USER0);
@@ -73,20 +85,18 @@ static int rds_loop_xmit(struct rds_connection *conn, struct rds_message *rm,
73 NULL); 85 NULL);
74 86
75 rds_inc_put(&rm->m_inc); 87 rds_inc_put(&rm->m_inc);
76 88out:
77 return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len); 89 return ret;
78} 90}
79 91
80static int rds_loop_xmit_cong_map(struct rds_connection *conn, 92/*
81 struct rds_cong_map *map, 93 * See rds_loop_xmit(). Since our inc is embedded in the rm, we
82 unsigned long offset) 94 * make sure the rm lives at least until the inc is done.
95 */
96static void rds_loop_inc_free(struct rds_incoming *inc)
83{ 97{
84 BUG_ON(offset); 98 struct rds_message *rm = container_of(inc, struct rds_message, m_inc);
85 BUG_ON(map != conn->c_lcong); 99 rds_message_put(rm);
86
87 rds_cong_map_updated(conn->c_fcong, ~(u64) 0);
88
89 return sizeof(struct rds_header) + RDS_CONG_MAP_BYTES;
90} 100}
91 101
92/* we need to at least give the thread something to succeed */ 102/* we need to at least give the thread something to succeed */
@@ -112,7 +122,7 @@ static int rds_loop_conn_alloc(struct rds_connection *conn, gfp_t gfp)
112 unsigned long flags; 122 unsigned long flags;
113 123
114 lc = kzalloc(sizeof(struct rds_loop_connection), GFP_KERNEL); 124 lc = kzalloc(sizeof(struct rds_loop_connection), GFP_KERNEL);
115 if (lc == NULL) 125 if (!lc)
116 return -ENOMEM; 126 return -ENOMEM;
117 127
118 INIT_LIST_HEAD(&lc->loop_node); 128 INIT_LIST_HEAD(&lc->loop_node);
@@ -129,8 +139,12 @@ static int rds_loop_conn_alloc(struct rds_connection *conn, gfp_t gfp)
129static void rds_loop_conn_free(void *arg) 139static void rds_loop_conn_free(void *arg)
130{ 140{
131 struct rds_loop_connection *lc = arg; 141 struct rds_loop_connection *lc = arg;
142 unsigned long flags;
143
132 rdsdebug("lc %p\n", lc); 144 rdsdebug("lc %p\n", lc);
145 spin_lock_irqsave(&loop_conns_lock, flags);
133 list_del(&lc->loop_node); 146 list_del(&lc->loop_node);
147 spin_unlock_irqrestore(&loop_conns_lock, flags);
134 kfree(lc); 148 kfree(lc);
135} 149}
136 150
@@ -169,14 +183,12 @@ void rds_loop_exit(void)
169 */ 183 */
170struct rds_transport rds_loop_transport = { 184struct rds_transport rds_loop_transport = {
171 .xmit = rds_loop_xmit, 185 .xmit = rds_loop_xmit,
172 .xmit_cong_map = rds_loop_xmit_cong_map,
173 .recv = rds_loop_recv, 186 .recv = rds_loop_recv,
174 .conn_alloc = rds_loop_conn_alloc, 187 .conn_alloc = rds_loop_conn_alloc,
175 .conn_free = rds_loop_conn_free, 188 .conn_free = rds_loop_conn_free,
176 .conn_connect = rds_loop_conn_connect, 189 .conn_connect = rds_loop_conn_connect,
177 .conn_shutdown = rds_loop_conn_shutdown, 190 .conn_shutdown = rds_loop_conn_shutdown,
178 .inc_copy_to_user = rds_message_inc_copy_to_user, 191 .inc_copy_to_user = rds_message_inc_copy_to_user,
179 .inc_purge = rds_message_inc_purge, 192 .inc_free = rds_loop_inc_free,
180 .inc_free = rds_message_inc_free,
181 .t_name = "loopback", 193 .t_name = "loopback",
182}; 194};