]) # LIBCFS_IP6_SET_PREF
#
+# LIBCFS_IP_SET_TOS
+#
+# kernel v5.8-rc1~165^2~71^2~3 commit 6ebf71bab9fb476fc8132be4c12b88201278f0ca
+# ipv4: add ip_sock_set_tos
+#
+AC_DEFUN([LIBCFS_SRC_IP_SET_TOS], [
+ LB2_LINUX_TEST_SRC([ip_set_tos_test], [
+ #include <net/ip.h>
+ ],[
+ ip_sock_set_tos(NULL, 0);
+ ],[-Werror])
+])
+AC_DEFUN([LIBCFS_IP_SET_TOS], [
+ LB2_MSG_LINUX_TEST_RESULT([if ip_sock_set_tos() exists],
+ [ip_set_tos_test], [
+ AC_DEFINE(HAVE_IP_SET_TOS, 1,
+ [if ip_sock_set_tos exists])
+ ])
+]) # LIBCFS_IP_SET_TOS
+
+#
# LIBCFS_VMALLOC_2ARGS
#
# kernel v5.8-rc1~201^2~19
LIBCFS_SRC_TCP_SOCK_SET_KEEPCNT
# 5.8
LIBCFS_SRC_IP6_SET_PREF
+ LIBCFS_SRC_IP_SET_TOS
LIBCFS_SRC_VMALLOC_2ARGS
LIBCFS_SRC_HAVE_NR_UNSTABLE_NFS
LIBCFS_SRC_KERNEL_SETSOCKOPT
LIBCFS_TCP_SOCK_SET_KEEPCNT
# 5.8
LIBCFS_IP6_SET_PREF
+ LIBCFS_IP_SET_TOS
LIBCFS_VMALLOC_2ARGS
LIBCFS_HAVE_NR_UNSTABLE_NFS
LIBCFS_KERNEL_SETSOCKOPT
(char *)&pref, sizeof(pref));
}
#endif /* HAVE_IP6_SET_PREF */
+
+#if !defined(HAVE_IP_SET_TOS)
+static inline void ip_sock_set_tos(struct sock *sk, int val)
+{
+ kernel_setsockopt(sk->sk_socket, IPPROTO_IP, IP_TOS,
+ (char *)&val, sizeof(val));
+}
+#endif /* HAVE_IP_SET_TOS */
#endif /* HAVE_KERNEL_SETSOCKOPT */
#endif /* __LIBCFS_LINUX_NET_H__ */
__u16 lnd_conns_per_peer;
__u16 lnd_pad;
__u32 lnd_timeout;
+ __s16 lnd_tos;
};
struct lnet_ioctl_config_gnilnd_tunables {
.lkp_value = "timeout",
.lkp_data_type = NLA_U32
},
+ [LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TOS] = {
+ .lkp_value = "tos",
+ .lkp_data_type = NLA_S16,
+ },
},
};
tun->lnd_tun_u.lnd_sock.lnd_conns_per_peer);
nla_put_u32(msg, LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TIMEOUT,
ksocknal_timeout());
+ nla_put_s16(msg, LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TOS,
+ tun->lnd_tun_u.lnd_sock.lnd_tos);
return 0;
}
case LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TIMEOUT:
num = nla_get_s64(attr);
tunables->lnd_tun_u.lnd_sock.lnd_timeout = num;
+ break;
+ case LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TOS:
+ num = nla_get_s64(attr);
+ clamp_t(s64, num, -1, 0xff);
+ tunables->lnd_tun_u.lnd_sock.lnd_tos = num;
fallthrough;
default:
break;
* response has been sent.
*/
if (rc == 0)
- rc = ksocknal_lib_setup_sock(sock);
+ rc = ksocknal_lib_setup_sock(sock, ni);
write_lock_bh(global_lock);
LNET_NET_SOCKLND_TUNABLES_ATTR_CONNS_PER_PEER,
LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TIMEOUT,
+ LNET_NET_SOCKLND_TUNABLES_ATTR_LND_TOS,
__LNET_NET_SOCKLND_TUNABLES_ATTR_MAX_PLUS_ONE,
};
struct ksock_conn *conn);
extern void ksocknal_lib_push_conn(struct ksock_conn *conn);
extern int ksocknal_lib_get_conn_addrs(struct ksock_conn *conn);
-extern int ksocknal_lib_setup_sock(struct socket *so);
+extern int ksocknal_lib_setup_sock(struct socket *sock, struct lnet_ni *ni);
extern int ksocknal_lib_send_hdr(struct ksock_conn *conn, struct ksock_tx *tx,
struct kvec *scratch_iov);
extern int ksocknal_lib_send_kiov(struct ksock_conn *conn, struct ksock_tx *tx,
}
int
-ksocknal_lib_setup_sock (struct socket *sock)
+ksocknal_lib_setup_sock(struct socket *sock, struct lnet_ni *ni)
{
int rc;
int keep_idle;
int keep_count;
int do_keepalive;
struct tcp_sock *tp = tcp_sk(sock->sk);
+ struct lnet_ioctl_config_socklnd_tunables *lndtun;
sock->sk->sk_allocation = GFP_NOFS;
return rc;
}
+ lndtun = &ni->ni_lnd_tunables.lnd_tun_u.lnd_sock;
+ if (lndtun->lnd_tos >= 0)
+ ip_sock_set_tos(sock->sk, lndtun->lnd_tos);
+
return (0);
}
MODULE_PARM_DESC(protocol, "protocol version");
#endif
+static int tos = -1;
+static int param_set_tos(const char *val, cfs_kernel_param_arg_t *kp);
+#ifdef HAVE_KERNEL_PARAM_OPS
+static const struct kernel_param_ops param_ops_tos = {
+ .set = param_set_tos,
+ .get = param_get_int,
+};
+
+#define param_check_tos(name, p) \
+ __param_check(name, p, int)
+module_param(tos, tos, 0444);
+#else
+module_param_call(tos, param_set_tos, param_get_int, &tos, 0444);
+#endif
+MODULE_PARM_DESC(tos, "Set the type of service (=-1 to disable)");
+
static inline bool is_native_host(void)
{
#ifdef HAVE_HYPERVISOR_IS_TYPE
struct ksock_tunables ksocknal_tunables;
struct lnet_ioctl_config_socklnd_tunables ksock_default_tunables;
+static int param_set_tos(const char *val, cfs_kernel_param_arg_t *kp)
+{
+ int rc, t;
+
+ if (!val)
+ return -EINVAL;
+
+ rc = kstrtoint(val, 0, &t);
+ if (rc)
+ return rc;
+
+ if (t < -1 || t > 0xff)
+ return -ERANGE;
+
+ *((int *)kp->arg) = t;
+
+ return 0;
+}
+
#ifdef HAVE_ETHTOOL_LINK_SETTINGS
static int ksocklnd_ni_get_eth_intf_speed(struct lnet_ni *ni)
{
{
ksock_default_tunables.lnd_version = CURRENT_LND_VERSION;
ksock_default_tunables.lnd_conns_per_peer = conns_per_peer;
+ ksock_default_tunables.lnd_tos = tos;
/* initialize ksocknal_tunables structure */
ksocknal_tunables.ksnd_timeout = &sock_timeout;
tunables->lnd_conns_per_peer =
ksocklnd_lookup_conns_per_peer(ni);
+ if (tunables->lnd_tos < 0)
+ tunables->lnd_tos = tos;
+
tunables->lnd_timeout = ksocknal_timeout();
}