Skip to content

Commit 041dc3e

Browse files
sowminivLinuxMinion
authored andcommitted
Backport multipath RDS from upstream to UEK4
This commit backports upstream Multipath RDS to UEK4. Orabug: 26241322 Signed-off-by: Sowmini Varadhan <[email protected]> Acked-by: Santosh Shilimkar <[email protected]>
1 parent 89428ab commit 041dc3e

23 files changed

+1413
-784
lines changed

net/rds/af_rds.c

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#include <linux/in.h>
3838
#include <linux/poll.h>
3939
#include <linux/version.h>
40+
#include <linux/random.h>
4041
#include <net/sock.h>
4142

4243
#include "rds.h"
@@ -323,6 +324,24 @@ static int rds_cong_monitor(struct rds_sock *rs, char __user *optval,
323324
return ret;
324325
}
325326

327+
static void rds_user_conn_paths_drop(struct rds_connection *conn, int reason)
328+
{
329+
int i;
330+
struct rds_conn_path *cp;
331+
332+
if (!conn->c_trans->t_mp_capable || conn->c_npaths == 1) {
333+
cp = &conn->c_path[0];
334+
cp->cp_drop_source = reason;
335+
rds_conn_path_drop(cp, DR_USER_RESET);
336+
} else {
337+
for (i = 0; i < RDS_MPATH_WORKERS; i++) {
338+
cp = &conn->c_path[i];
339+
cp->cp_drop_source = reason;
340+
rds_conn_path_drop(cp, DR_USER_RESET);
341+
}
342+
}
343+
}
344+
326345
static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
327346
{
328347
struct rds_reset reset;
@@ -341,15 +360,14 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
341360
pr_info("RDS: Reset ALL conns for Source %pI4\n",
342361
&reset.src.s_addr);
343362

344-
rds_conn_laddr_list(reset.src.s_addr, &s_addr_conns);
363+
rds_conn_laddr_list(sock_net(rds_rs_to_sk(rs)),
364+
reset.src.s_addr, &s_addr_conns);
345365
if (list_empty(&s_addr_conns))
346366
goto done;
347367

348368
list_for_each_entry(conn, &s_addr_conns, c_laddr_node)
349-
if (conn) {
350-
conn->c_drop_source = 1;
351-
rds_conn_drop(conn, DR_USER_RESET);
352-
}
369+
if (conn)
370+
rds_user_conn_paths_drop(conn, 1);
353371
goto done;
354372
}
355373

@@ -358,11 +376,14 @@ static int rds_user_reset(struct rds_sock *rs, char __user *optval, int optlen)
358376
rs->rs_transport, reset.tos);
359377

360378
if (conn) {
361-
printk(KERN_NOTICE "Resetting RDS/IB connection "
379+
bool is_tcp = conn->c_trans->t_type == RDS_TRANS_TCP;
380+
381+
printk(KERN_NOTICE "Resetting RDS/%s connection "
362382
"<%u.%u.%u.%u,%u.%u.%u.%u,%d>\n",
383+
is_tcp ? "tcp" : "IB",
363384
NIPQUAD(reset.src.s_addr),
364385
NIPQUAD(reset.dst.s_addr), conn->c_tos);
365-
rds_conn_drop(conn, DR_USER_RESET);
386+
rds_user_conn_paths_drop(conn, DR_USER_RESET);
366387
}
367388
done:
368389
return 0;
@@ -898,10 +919,14 @@ static void rds_exit(void)
898919
}
899920
module_exit(rds_exit);
900921

922+
u32 rds_gen_num;
923+
901924
static int rds_init(void)
902925
{
903926
int ret;
904927

928+
net_get_random_once(&rds_gen_num, sizeof(rds_gen_num));
929+
905930
rds_bind_lock_init();
906931

907932
ret = rds_conn_init();

net/rds/cong.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,8 @@ void rds_cong_queue_updates(struct rds_cong_map *map)
242242
list_for_each_entry(conn, &map->m_conn_list, c_map_item) {
243243
if (!test_and_set_bit(0, &conn->c_map_queued)) {
244244
rds_stats_inc(s_cong_update_queued);
245-
queue_delayed_work(conn->c_wq, &conn->c_send_w, 0);
245+
queue_delayed_work(conn->c_path[0].cp_wq,
246+
&conn->c_path[0].cp_send_w, 0);
246247
}
247248
}
248249

0 commit comments

Comments
 (0)