Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rds: make v3.1 as compat version

Mark RDSv3.1 as compat version and add v4.1 version macro's.
Subsequent patches enable TOS(Type of Service) feature which is
tied with v4.1 for RDMA transport.

Reviewed-by: Sowmini Varadhan <sowmini.varadhan@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com>
[yanjun.zhu@oracle.com: Adapted original patch with ipv6 changes]
Signed-off-by: Zhu Yanjun <yanjun.zhu@oracle.com>

+29 -17
+1
net/rds/connection.c
··· 139 139 atomic_set(&cp->cp_state, RDS_CONN_DOWN); 140 140 cp->cp_send_gen = 0; 141 141 cp->cp_reconnect_jiffies = 0; 142 + cp->cp_conn->c_proposed_version = RDS_PROTOCOL_VERSION; 142 143 INIT_DELAYED_WORK(&cp->cp_send_w, rds_send_worker); 143 144 INIT_DELAYED_WORK(&cp->cp_recv_w, rds_recv_worker); 144 145 INIT_DELAYED_WORK(&cp->cp_conn_w, rds_connect_worker);
+23 -17
net/rds/ib_cm.c
··· 133 133 rds_ib_set_flow_control(conn, be32_to_cpu(credit)); 134 134 } 135 135 136 - if (conn->c_version < RDS_PROTOCOL(3, 1)) { 137 - pr_notice("RDS/IB: Connection <%pI6c,%pI6c> version %u.%u no longer supported\n", 138 - &conn->c_laddr, &conn->c_faddr, 139 - RDS_PROTOCOL_MAJOR(conn->c_version), 140 - RDS_PROTOCOL_MINOR(conn->c_version)); 141 - set_bit(RDS_DESTROY_PENDING, &conn->c_path[0].cp_flags); 142 - rds_conn_destroy(conn); 143 - return; 144 - } else { 145 - pr_notice("RDS/IB: %s conn connected <%pI6c,%pI6c> version %u.%u%s\n", 146 - ic->i_active_side ? "Active" : "Passive", 147 - &conn->c_laddr, &conn->c_faddr, 148 - RDS_PROTOCOL_MAJOR(conn->c_version), 149 - RDS_PROTOCOL_MINOR(conn->c_version), 150 - ic->i_flowctl ? ", flow control" : ""); 136 + if (conn->c_version < RDS_PROTOCOL_VERSION) { 137 + if (conn->c_version != RDS_PROTOCOL_COMPAT_VERSION) { 138 + pr_notice("RDS/IB: Connection <%pI6c,%pI6c> version %u.%u no longer supported\n", 139 + &conn->c_laddr, &conn->c_faddr, 140 + RDS_PROTOCOL_MAJOR(conn->c_version), 141 + RDS_PROTOCOL_MINOR(conn->c_version)); 142 + rds_conn_destroy(conn); 143 + return; 144 + } 151 145 } 146 + 147 + pr_notice("RDS/IB: %s conn connected <%pI6c,%pI6c> version %u.%u%s\n", 148 + ic->i_active_side ? "Active" : "Passive", 149 + &conn->c_laddr, &conn->c_faddr, 150 + RDS_PROTOCOL_MAJOR(conn->c_version), 151 + RDS_PROTOCOL_MINOR(conn->c_version), 152 + ic->i_flowctl ? ", flow control" : ""); 152 153 153 154 atomic_set(&ic->i_cq_quiesce, 0); 154 155 ··· 185 184 NULL); 186 185 } 187 186 187 + conn->c_proposed_version = conn->c_version; 188 188 rds_connect_complete(conn); 189 189 } 190 190 ··· 669 667 version = RDS_PROTOCOL_3_0; 670 668 while ((common >>= 1) != 0) 671 669 version++; 670 + } else if (RDS_PROTOCOL_COMPAT_VERSION == 671 + RDS_PROTOCOL(major, minor)) { 672 + version = RDS_PROTOCOL_COMPAT_VERSION; 672 673 } else { 673 674 if (isv6) 674 675 printk_ratelimited(KERN_NOTICE "RDS: Connection from %pI6c using incompatible protocol version %u.%u\n", ··· 866 861 867 862 /* If the peer doesn't do protocol negotiation, we must 868 863 * default to RDSv3.0 */ 869 - rds_ib_set_protocol(conn, RDS_PROTOCOL_3_0); 864 + rds_ib_set_protocol(conn, RDS_PROTOCOL_VERSION); 870 865 ic->i_flowctl = rds_ib_sysctl_flow_control; /* advertise flow control */ 871 866 872 867 ret = rds_ib_setup_qp(conn); ··· 875 870 goto out; 876 871 } 877 872 878 - rds_ib_cm_fill_conn_param(conn, &conn_param, &dp, RDS_PROTOCOL_VERSION, 873 + rds_ib_cm_fill_conn_param(conn, &conn_param, &dp, 874 + conn->c_proposed_version, 879 875 UINT_MAX, UINT_MAX, isv6); 880 876 ret = rdma_connect(cm_id, &conn_param); 881 877 if (ret)
+4
net/rds/rds.h
··· 19 19 */ 20 20 #define RDS_PROTOCOL_3_0 0x0300 21 21 #define RDS_PROTOCOL_3_1 0x0301 22 + #define RDS_PROTOCOL_4_0 0x0400 23 + #define RDS_PROTOCOL_4_1 0x0401 22 24 #define RDS_PROTOCOL_VERSION RDS_PROTOCOL_3_1 23 25 #define RDS_PROTOCOL_MAJOR(v) ((v) >> 8) 24 26 #define RDS_PROTOCOL_MINOR(v) ((v) & 255) 25 27 #define RDS_PROTOCOL(maj, min) (((maj) << 8) | min) 28 + #define RDS_PROTOCOL_COMPAT_VERSION RDS_PROTOCOL_3_1 26 29 27 30 /* The following ports, 16385, 18634, 18635, are registered with IANA as 28 31 * the ports to be used for RDS over TCP and UDP. Currently, only RDS over ··· 154 151 struct rds_cong_map *c_fcong; 155 152 156 153 /* Protocol version */ 154 + unsigned int c_proposed_version; 157 155 unsigned int c_version; 158 156 possible_net_t c_net; 159 157
+1
net/rds/threads.c
··· 93 93 queue_delayed_work(rds_wq, &cp->cp_recv_w, 0); 94 94 } 95 95 rcu_read_unlock(); 96 + cp->cp_conn->c_proposed_version = RDS_PROTOCOL_VERSION; 96 97 } 97 98 EXPORT_SYMBOL_GPL(rds_connect_path_complete); 98 99