diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /net/rds/loop.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (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.c | 44 |
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 | 88 | out: | |
77 | return sizeof(struct rds_header) + be32_to_cpu(rm->m_inc.i_hdr.h_len); | 89 | return ret; |
78 | } | 90 | } |
79 | 91 | ||
80 | static 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 | */ | ||
96 | static 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) | |||
129 | static void rds_loop_conn_free(void *arg) | 139 | static 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 | */ |
170 | struct rds_transport rds_loop_transport = { | 184 | struct 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 | }; |