RDMA transport maps user tos to underline virtual lanes(VL)
for IB or DSCP values. RDMA CM transport abstract thats for
RDS. TCP transport makes use of default priority 0 and maps
all user tos values to it.

Reviewed-by: Sowmini Varadhan <sowmini.varad...@oracle.com>
Signed-off-by: Santosh Shilimkar <santosh.shilim...@oracle.com>
[yanjun....@oracle.com: Adapted original patch with ipv6 changes]
Signed-off-by: Zhu Yanjun <yanjun....@oracle.com>
---
 net/rds/af_rds.c | 10 ++++++----
 net/rds/ib.c     | 10 ++++++++++
 net/rds/rds.h    |  1 +
 net/rds/tcp.c    |  7 +++++++
 4 files changed, 24 insertions(+), 4 deletions(-)

diff --git a/net/rds/af_rds.c b/net/rds/af_rds.c
index 9045158..d6cc97f 100644
--- a/net/rds/af_rds.c
+++ b/net/rds/af_rds.c
@@ -255,16 +255,18 @@ static __poll_t rds_poll(struct file *file, struct socket 
*sock,
 static int rds_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
 {
        struct rds_sock *rs = rds_sk_to_rs(sock->sk);
-       rds_tos_t tos;
+       rds_tos_t utos, tos = 0;
 
        switch (cmd) {
        case SIOCRDSSETTOS:
-               if (get_user(tos, (rds_tos_t __user *)arg))
+               if (get_user(utos, (rds_tos_t __user *)arg))
                        return -EFAULT;
 
                if (rs->rs_transport &&
-                   rs->rs_transport->t_type == RDS_TRANS_TCP)
-                       tos = 0;
+                   rs->rs_transport->get_tos_map)
+                       tos = rs->rs_transport->get_tos_map(utos);
+               else
+                       return -ENOIOCTLCMD;
 
                spin_lock_bh(&rds_sock_lock);
                if (rs->rs_tos || rs->rs_conn) {
diff --git a/net/rds/ib.c b/net/rds/ib.c
index 21b6588..2da9b75 100644
--- a/net/rds/ib.c
+++ b/net/rds/ib.c
@@ -515,6 +515,15 @@ void rds_ib_exit(void)
        rds_ib_mr_exit();
 }
 
+static u8 rds_ib_get_tos_map(u8 tos)
+{
+       /* 1:1 user to transport map for RDMA transport.
+        * In future, if custom map is desired, hook can export
+        * user configurable map.
+        */
+       return tos;
+}
+
 struct rds_transport rds_ib_transport = {
        .laddr_check            = rds_ib_laddr_check,
        .xmit_path_complete     = rds_ib_xmit_path_complete,
@@ -537,6 +546,7 @@ struct rds_transport rds_ib_transport = {
        .sync_mr                = rds_ib_sync_mr,
        .free_mr                = rds_ib_free_mr,
        .flush_mrs              = rds_ib_flush_mrs,
+       .get_tos_map            = rds_ib_get_tos_map,
        .t_owner                = THIS_MODULE,
        .t_name                 = "infiniband",
        .t_unloading            = rds_ib_is_unloading,
diff --git a/net/rds/rds.h b/net/rds/rds.h
index 7e52b92..0d8f67c 100644
--- a/net/rds/rds.h
+++ b/net/rds/rds.h
@@ -574,6 +574,7 @@ struct rds_transport {
        void (*free_mr)(void *trans_private, int invalidate);
        void (*flush_mrs)(void);
        bool (*t_unloading)(struct rds_connection *conn);
+       u8 (*get_tos_map)(u8 tos);
 };
 
 /* Bind hash table key length.  It is the sum of the size of a struct
diff --git a/net/rds/tcp.c b/net/rds/tcp.c
index eb68519..fd26941 100644
--- a/net/rds/tcp.c
+++ b/net/rds/tcp.c
@@ -453,6 +453,12 @@ static void rds_tcp_destroy_conns(void)
 
 static void rds_tcp_exit(void);
 
+static u8 rds_tcp_get_tos_map(u8 tos)
+{
+       /* all user tos mapped to default 0 for TCP transport */
+       return 0;
+}
+
 struct rds_transport rds_tcp_transport = {
        .laddr_check            = rds_tcp_laddr_check,
        .xmit_path_prepare      = rds_tcp_xmit_path_prepare,
@@ -467,6 +473,7 @@ struct rds_transport rds_tcp_transport = {
        .inc_free               = rds_tcp_inc_free,
        .stats_info_copy        = rds_tcp_stats_info_copy,
        .exit                   = rds_tcp_exit,
+       .get_tos_map            = rds_tcp_get_tos_map,
        .t_owner                = THIS_MODULE,
        .t_name                 = "tcp",
        .t_type                 = RDS_TRANS_TCP,
-- 
1.9.1

Reply via email to