All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCHv2 dlm-next 0/3] fs: dlm: add support to set skb mark value
@ 2020-06-26 17:26 ` Alexander Aring
  0 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: davem; +Cc: kuba, teigland, ccaulfie, cluster-devel, netdev, Alexander Aring

Hi,

this patch series adds support for setting the skb mark value as socket
option. It's not possible yet to change this after the socket is
created, although the mark value can be changed afterwards.

How to test it:

1. Setup mark values

echo 0xcafe > /sys/kernel/config/dlm/cluster/mark
echo 0xbeef > /sys/kernel/config/dlm/cluster/comms/2/mark

Note: setting a mark value for local node has no effect.

2. Add some skb mark classifier:

tc qdisc add dev $DEV root handle 1: htb
tc filter add dev $DEV parent 1: u32 match mark 0xcafe 0xffffffff action ok
tc filter add dev $DEV parent 1: u32 match mark 0xbeef 0xffffffff action ok

3. Mount e.g. gfs2

4. dump stats:

tc -s -d filter show dev $DEV

5. Open e.g. wireshark and check the success rate of stats

I have also patches for dlm user space to set these values via
dlm controld.

- Alex

changes since v2:

- rebase on current dlm/next branch
- because rebase it's necessary now to add PATCH 1/3. Please netdev
  maintainers, reply if it's okay to merge this one patch into dlm/next.
  Due other patches in dlm/next it's as well not possible to merge
  everything in net-next. Thanks.

Alexander Aring (3):
  net: sock: add sock_set_mark
  fs: dlm: set skb mark for listen socket
  fs: dlm: set skb mark per peer socket

 fs/dlm/config.c    | 44 ++++++++++++++++++++++++++++++++++++++++++++
 fs/dlm/config.h    |  2 ++
 fs/dlm/lowcomms.c  | 19 +++++++++++++++++++
 include/net/sock.h |  1 +
 net/core/sock.c    |  8 ++++++++
 5 files changed, 74 insertions(+)

-- 
2.26.2


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Cluster-devel] [PATCHv2 dlm-next 0/3] fs: dlm: add support to set skb mark value
@ 2020-06-26 17:26 ` Alexander Aring
  0 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Hi,

this patch series adds support for setting the skb mark value as socket
option. It's not possible yet to change this after the socket is
created, although the mark value can be changed afterwards.

How to test it:

1. Setup mark values

echo 0xcafe > /sys/kernel/config/dlm/cluster/mark
echo 0xbeef > /sys/kernel/config/dlm/cluster/comms/2/mark

Note: setting a mark value for local node has no effect.

2. Add some skb mark classifier:

tc qdisc add dev $DEV root handle 1: htb
tc filter add dev $DEV parent 1: u32 match mark 0xcafe 0xffffffff action ok
tc filter add dev $DEV parent 1: u32 match mark 0xbeef 0xffffffff action ok

3. Mount e.g. gfs2

4. dump stats:

tc -s -d filter show dev $DEV

5. Open e.g. wireshark and check the success rate of stats

I have also patches for dlm user space to set these values via
dlm controld.

- Alex

changes since v2:

- rebase on current dlm/next branch
- because rebase it's necessary now to add PATCH 1/3. Please netdev
  maintainers, reply if it's okay to merge this one patch into dlm/next.
  Due other patches in dlm/next it's as well not possible to merge
  everything in net-next. Thanks.

Alexander Aring (3):
  net: sock: add sock_set_mark
  fs: dlm: set skb mark for listen socket
  fs: dlm: set skb mark per peer socket

 fs/dlm/config.c    | 44 ++++++++++++++++++++++++++++++++++++++++++++
 fs/dlm/config.h    |  2 ++
 fs/dlm/lowcomms.c  | 19 +++++++++++++++++++
 include/net/sock.h |  1 +
 net/core/sock.c    |  8 ++++++++
 5 files changed, 74 insertions(+)

-- 
2.26.2



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCHv2 dlm-next 1/3] net: sock: add sock_set_mark
  2020-06-26 17:26 ` [Cluster-devel] " Alexander Aring
@ 2020-06-26 17:26   ` Alexander Aring
  -1 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: davem; +Cc: kuba, teigland, ccaulfie, cluster-devel, netdev, Alexander Aring

This patch adds a new socket helper function to set the mark value for a
kernel socket.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 include/net/sock.h | 1 +
 net/core/sock.c    | 8 ++++++++
 2 files changed, 9 insertions(+)

diff --git a/include/net/sock.h b/include/net/sock.h
index c53cc42b5ab92..591dd3f12dbb1 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -2696,6 +2696,7 @@ void sock_no_linger(struct sock *sk);
 void sock_set_keepalive(struct sock *sk);
 void sock_set_priority(struct sock *sk, u32 priority);
 void sock_set_rcvbuf(struct sock *sk, int val);
+void sock_set_mark(struct sock *sk, u32 val);
 void sock_set_reuseaddr(struct sock *sk);
 void sock_set_reuseport(struct sock *sk);
 void sock_set_sndtimeo(struct sock *sk, s64 secs);
diff --git a/net/core/sock.c b/net/core/sock.c
index 6c4acf1f0220b..ea6e8348b3dc8 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -828,6 +828,14 @@ void sock_set_rcvbuf(struct sock *sk, int val)
 }
 EXPORT_SYMBOL(sock_set_rcvbuf);
 
+void sock_set_mark(struct sock *sk, u32 val)
+{
+	lock_sock(sk);
+	sk->sk_mark = val;
+	release_sock(sk);
+}
+EXPORT_SYMBOL(sock_set_mark);
+
 /*
  *	This is meant for all protocols to use and covers goings on
  *	at the socket level. Everything here is generic.
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Cluster-devel] [PATCHv2 dlm-next 1/3] net: sock: add sock_set_mark
@ 2020-06-26 17:26   ` Alexander Aring
  0 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: cluster-devel.redhat.com

This patch adds a new socket helper function to set the mark value for a
kernel socket.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 include/net/sock.h | 1 +
 net/core/sock.c    | 8 ++++++++
 2 files changed, 9 insertions(+)

diff --git a/include/net/sock.h b/include/net/sock.h
index c53cc42b5ab92..591dd3f12dbb1 100644
--- a/include/net/sock.h
+++ b/include/net/sock.h
@@ -2696,6 +2696,7 @@ void sock_no_linger(struct sock *sk);
 void sock_set_keepalive(struct sock *sk);
 void sock_set_priority(struct sock *sk, u32 priority);
 void sock_set_rcvbuf(struct sock *sk, int val);
+void sock_set_mark(struct sock *sk, u32 val);
 void sock_set_reuseaddr(struct sock *sk);
 void sock_set_reuseport(struct sock *sk);
 void sock_set_sndtimeo(struct sock *sk, s64 secs);
diff --git a/net/core/sock.c b/net/core/sock.c
index 6c4acf1f0220b..ea6e8348b3dc8 100644
--- a/net/core/sock.c
+++ b/net/core/sock.c
@@ -828,6 +828,14 @@ void sock_set_rcvbuf(struct sock *sk, int val)
 }
 EXPORT_SYMBOL(sock_set_rcvbuf);
 
+void sock_set_mark(struct sock *sk, u32 val)
+{
+	lock_sock(sk);
+	sk->sk_mark = val;
+	release_sock(sk);
+}
+EXPORT_SYMBOL(sock_set_mark);
+
 /*
  *	This is meant for all protocols to use and covers goings on
  *	at the socket level. Everything here is generic.
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv2 dlm-next 2/3] fs: dlm: set skb mark for listen socket
  2020-06-26 17:26 ` [Cluster-devel] " Alexander Aring
@ 2020-06-26 17:26   ` Alexander Aring
  -1 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: davem; +Cc: kuba, teigland, ccaulfie, cluster-devel, netdev, Alexander Aring

This patch adds support to set the skb mark value for the DLM listen
tcp and sctp sockets. The mark value will be offered as cluster
configuration. At creation time of the listen socket it will be set as
socket option.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 fs/dlm/config.c   | 6 ++++++
 fs/dlm/config.h   | 1 +
 fs/dlm/lowcomms.c | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/fs/dlm/config.c b/fs/dlm/config.c
index aee1be86adbdc..6dce6ec58d74f 100644
--- a/fs/dlm/config.c
+++ b/fs/dlm/config.c
@@ -73,6 +73,7 @@ struct dlm_cluster {
 	unsigned int cl_log_debug;
 	unsigned int cl_log_info;
 	unsigned int cl_protocol;
+	unsigned int cl_mark;
 	unsigned int cl_timewarn_cs;
 	unsigned int cl_waitwarn_us;
 	unsigned int cl_waitplock_recovery;
@@ -97,6 +98,7 @@ enum {
 	CLUSTER_ATTR_LOG_DEBUG,
 	CLUSTER_ATTR_LOG_INFO,
 	CLUSTER_ATTR_PROTOCOL,
+	CLUSTER_ATTR_MARK,
 	CLUSTER_ATTR_TIMEWARN_CS,
 	CLUSTER_ATTR_WAITWARN_US,
 	CLUSTER_ATTR_WAITPLOCK_RECOVERY,
@@ -170,6 +172,7 @@ CLUSTER_ATTR(scan_secs, 1);
 CLUSTER_ATTR(log_debug, 0);
 CLUSTER_ATTR(log_info, 0);
 CLUSTER_ATTR(protocol, 0);
+CLUSTER_ATTR(mark, 0);
 CLUSTER_ATTR(timewarn_cs, 1);
 CLUSTER_ATTR(waitwarn_us, 0);
 CLUSTER_ATTR(waitplock_recovery, 0);
@@ -186,6 +189,7 @@ static struct configfs_attribute *cluster_attrs[] = {
 	[CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug,
 	[CLUSTER_ATTR_LOG_INFO] = &cluster_attr_log_info,
 	[CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol,
+	[CLUSTER_ATTR_MARK] = &cluster_attr_mark,
 	[CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs,
 	[CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us,
 	[CLUSTER_ATTR_WAITPLOCK_RECOVERY] = &cluster_attr_waitplock_recovery,
@@ -859,6 +863,7 @@ int dlm_our_addr(struct sockaddr_storage *addr, int num)
 #define DEFAULT_LOG_DEBUG          0
 #define DEFAULT_LOG_INFO           1
 #define DEFAULT_PROTOCOL           0
+#define DEFAULT_MARK               0
 #define DEFAULT_TIMEWARN_CS      500 /* 5 sec = 500 centiseconds */
 #define DEFAULT_WAITWARN_US	   0
 #define DEFAULT_WAITPLOCK_RECOVERY 0
@@ -876,6 +881,7 @@ struct dlm_config_info dlm_config = {
 	.ci_log_debug = DEFAULT_LOG_DEBUG,
 	.ci_log_info = DEFAULT_LOG_INFO,
 	.ci_protocol = DEFAULT_PROTOCOL,
+	.ci_mark = DEFAULT_MARK,
 	.ci_timewarn_cs = DEFAULT_TIMEWARN_CS,
 	.ci_waitwarn_us = DEFAULT_WAITWARN_US,
 	.ci_waitplock_recovery = DEFAULT_WAITPLOCK_RECOVERY,
diff --git a/fs/dlm/config.h b/fs/dlm/config.h
index 0cf824367668c..bc94123ac305a 100644
--- a/fs/dlm/config.h
+++ b/fs/dlm/config.h
@@ -31,6 +31,7 @@ struct dlm_config_info {
 	int ci_log_debug;
 	int ci_log_info;
 	int ci_protocol;
+	int ci_mark;
 	int ci_timewarn_cs;
 	int ci_waitwarn_us;
 	int ci_waitplock_recovery;
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 3543a8fec9075..eaedad7d069a8 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -1111,6 +1111,8 @@ static struct socket *tcp_create_listen_sock(struct connection *con,
 		goto create_out;
 	}
 
+	sock_set_mark(sock->sk, dlm_config.ci_mark);
+
 	/* Turn off Nagle's algorithm */
 	tcp_sock_set_nodelay(sock->sk);
 
@@ -1185,6 +1187,7 @@ static int sctp_listen_for_all(void)
 	}
 
 	sock_set_rcvbuf(sock->sk, NEEDED_RMEM);
+	sock_set_mark(sock->sk, dlm_config.ci_mark);
 	sctp_sock_set_nodelay(sock->sk);
 
 	write_lock_bh(&sock->sk->sk_callback_lock);
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Cluster-devel] [PATCHv2 dlm-next 2/3] fs: dlm: set skb mark for listen socket
@ 2020-06-26 17:26   ` Alexander Aring
  0 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: cluster-devel.redhat.com

This patch adds support to set the skb mark value for the DLM listen
tcp and sctp sockets. The mark value will be offered as cluster
configuration. At creation time of the listen socket it will be set as
socket option.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 fs/dlm/config.c   | 6 ++++++
 fs/dlm/config.h   | 1 +
 fs/dlm/lowcomms.c | 3 +++
 3 files changed, 10 insertions(+)

diff --git a/fs/dlm/config.c b/fs/dlm/config.c
index aee1be86adbdc..6dce6ec58d74f 100644
--- a/fs/dlm/config.c
+++ b/fs/dlm/config.c
@@ -73,6 +73,7 @@ struct dlm_cluster {
 	unsigned int cl_log_debug;
 	unsigned int cl_log_info;
 	unsigned int cl_protocol;
+	unsigned int cl_mark;
 	unsigned int cl_timewarn_cs;
 	unsigned int cl_waitwarn_us;
 	unsigned int cl_waitplock_recovery;
@@ -97,6 +98,7 @@ enum {
 	CLUSTER_ATTR_LOG_DEBUG,
 	CLUSTER_ATTR_LOG_INFO,
 	CLUSTER_ATTR_PROTOCOL,
+	CLUSTER_ATTR_MARK,
 	CLUSTER_ATTR_TIMEWARN_CS,
 	CLUSTER_ATTR_WAITWARN_US,
 	CLUSTER_ATTR_WAITPLOCK_RECOVERY,
@@ -170,6 +172,7 @@ CLUSTER_ATTR(scan_secs, 1);
 CLUSTER_ATTR(log_debug, 0);
 CLUSTER_ATTR(log_info, 0);
 CLUSTER_ATTR(protocol, 0);
+CLUSTER_ATTR(mark, 0);
 CLUSTER_ATTR(timewarn_cs, 1);
 CLUSTER_ATTR(waitwarn_us, 0);
 CLUSTER_ATTR(waitplock_recovery, 0);
@@ -186,6 +189,7 @@ static struct configfs_attribute *cluster_attrs[] = {
 	[CLUSTER_ATTR_LOG_DEBUG] = &cluster_attr_log_debug,
 	[CLUSTER_ATTR_LOG_INFO] = &cluster_attr_log_info,
 	[CLUSTER_ATTR_PROTOCOL] = &cluster_attr_protocol,
+	[CLUSTER_ATTR_MARK] = &cluster_attr_mark,
 	[CLUSTER_ATTR_TIMEWARN_CS] = &cluster_attr_timewarn_cs,
 	[CLUSTER_ATTR_WAITWARN_US] = &cluster_attr_waitwarn_us,
 	[CLUSTER_ATTR_WAITPLOCK_RECOVERY] = &cluster_attr_waitplock_recovery,
@@ -859,6 +863,7 @@ int dlm_our_addr(struct sockaddr_storage *addr, int num)
 #define DEFAULT_LOG_DEBUG          0
 #define DEFAULT_LOG_INFO           1
 #define DEFAULT_PROTOCOL           0
+#define DEFAULT_MARK               0
 #define DEFAULT_TIMEWARN_CS      500 /* 5 sec = 500 centiseconds */
 #define DEFAULT_WAITWARN_US	   0
 #define DEFAULT_WAITPLOCK_RECOVERY 0
@@ -876,6 +881,7 @@ struct dlm_config_info dlm_config = {
 	.ci_log_debug = DEFAULT_LOG_DEBUG,
 	.ci_log_info = DEFAULT_LOG_INFO,
 	.ci_protocol = DEFAULT_PROTOCOL,
+	.ci_mark = DEFAULT_MARK,
 	.ci_timewarn_cs = DEFAULT_TIMEWARN_CS,
 	.ci_waitwarn_us = DEFAULT_WAITWARN_US,
 	.ci_waitplock_recovery = DEFAULT_WAITPLOCK_RECOVERY,
diff --git a/fs/dlm/config.h b/fs/dlm/config.h
index 0cf824367668c..bc94123ac305a 100644
--- a/fs/dlm/config.h
+++ b/fs/dlm/config.h
@@ -31,6 +31,7 @@ struct dlm_config_info {
 	int ci_log_debug;
 	int ci_log_info;
 	int ci_protocol;
+	int ci_mark;
 	int ci_timewarn_cs;
 	int ci_waitwarn_us;
 	int ci_waitplock_recovery;
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 3543a8fec9075..eaedad7d069a8 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -1111,6 +1111,8 @@ static struct socket *tcp_create_listen_sock(struct connection *con,
 		goto create_out;
 	}
 
+	sock_set_mark(sock->sk, dlm_config.ci_mark);
+
 	/* Turn off Nagle's algorithm */
 	tcp_sock_set_nodelay(sock->sk);
 
@@ -1185,6 +1187,7 @@ static int sctp_listen_for_all(void)
 	}
 
 	sock_set_rcvbuf(sock->sk, NEEDED_RMEM);
+	sock_set_mark(sock->sk, dlm_config.ci_mark);
 	sctp_sock_set_nodelay(sock->sk);
 
 	write_lock_bh(&sock->sk->sk_callback_lock);
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv2 dlm-next 3/3] fs: dlm: set skb mark per peer socket
  2020-06-26 17:26 ` [Cluster-devel] " Alexander Aring
@ 2020-06-26 17:26   ` Alexander Aring
  -1 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: davem; +Cc: kuba, teigland, ccaulfie, cluster-devel, netdev, Alexander Aring

This patch adds support to set the skb mark value for the DLM tcp and
sctp socket per peer. The mark value will be offered as per comm value
of configfs. At creation time of the peer socket it will be set as
socket option.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 fs/dlm/config.c   | 38 ++++++++++++++++++++++++++++++++++++++
 fs/dlm/config.h   |  1 +
 fs/dlm/lowcomms.c | 16 ++++++++++++++++
 3 files changed, 55 insertions(+)

diff --git a/fs/dlm/config.c b/fs/dlm/config.c
index 6dce6ec58d74f..eac241ed9003e 100644
--- a/fs/dlm/config.c
+++ b/fs/dlm/config.c
@@ -204,6 +204,7 @@ enum {
 	COMM_ATTR_LOCAL,
 	COMM_ATTR_ADDR,
 	COMM_ATTR_ADDR_LIST,
+	COMM_ATTR_MARK,
 };
 
 enum {
@@ -236,6 +237,7 @@ struct dlm_comm {
 	int nodeid;
 	int local;
 	int addr_count;
+	unsigned int mark;
 	struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT];
 };
 
@@ -473,6 +475,7 @@ static struct config_item *make_comm(struct config_group *g, const char *name)
 	cm->nodeid = -1;
 	cm->local = 0;
 	cm->addr_count = 0;
+	cm->mark = 0;
 	return &cm->item;
 }
 
@@ -668,8 +671,28 @@ static ssize_t comm_addr_list_show(struct config_item *item, char *buf)
 	return 4096 - allowance;
 }
 
+static ssize_t comm_mark_show(struct config_item *item, char *buf)
+{
+	return sprintf(buf, "%u\n", config_item_to_comm(item)->mark);
+}
+
+static ssize_t comm_mark_store(struct config_item *item, const char *buf,
+			       size_t len)
+{
+	unsigned int mark;
+	int rc;
+
+	rc = kstrtouint(buf, 0, &mark);
+	if (rc)
+		return rc;
+
+	config_item_to_comm(item)->mark = mark;
+	return len;
+}
+
 CONFIGFS_ATTR(comm_, nodeid);
 CONFIGFS_ATTR(comm_, local);
+CONFIGFS_ATTR(comm_, mark);
 CONFIGFS_ATTR_WO(comm_, addr);
 CONFIGFS_ATTR_RO(comm_, addr_list);
 
@@ -678,6 +701,7 @@ static struct configfs_attribute *comm_attrs[] = {
 	[COMM_ATTR_LOCAL] = &comm_attr_local,
 	[COMM_ATTR_ADDR] = &comm_attr_addr,
 	[COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list,
+	[COMM_ATTR_MARK] = &comm_attr_mark,
 	NULL,
 };
 
@@ -837,6 +861,20 @@ int dlm_comm_seq(int nodeid, uint32_t *seq)
 	return 0;
 }
 
+int dlm_comm_mark(int nodeid, unsigned int *mark)
+{
+	struct dlm_comm *cm;
+
+	cm = get_comm(nodeid);
+	if (!cm)
+		return -ENOENT;
+
+	*mark = cm->mark;
+	put_comm(cm);
+
+	return 0;
+}
+
 int dlm_our_nodeid(void)
 {
 	return local_comm ? local_comm->nodeid : 0;
diff --git a/fs/dlm/config.h b/fs/dlm/config.h
index bc94123ac305a..48b4055fd07ff 100644
--- a/fs/dlm/config.h
+++ b/fs/dlm/config.h
@@ -47,6 +47,7 @@ void dlm_config_exit(void);
 int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out,
 		     int *count_out);
 int dlm_comm_seq(int nodeid, uint32_t *seq);
+int dlm_comm_mark(int nodeid, unsigned int *mark);
 int dlm_our_nodeid(void);
 int dlm_our_addr(struct sockaddr_storage *addr, int num);
 
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index eaedad7d069a8..3fa1b93dbbc7e 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -914,6 +914,7 @@ static void sctp_connect_to_sock(struct connection *con)
 	int result;
 	int addr_len;
 	struct socket *sock;
+	unsigned int mark;
 
 	if (con->nodeid == 0) {
 		log_print("attempt to connect sock 0 foiled");
@@ -944,6 +945,13 @@ static void sctp_connect_to_sock(struct connection *con)
 	if (result < 0)
 		goto socket_err;
 
+	/* set skb mark */
+	result = dlm_comm_mark(con->nodeid, &mark);
+	if (result < 0)
+		goto bind_err;
+
+	sock_set_mark(sock->sk, mark);
+
 	con->rx_action = receive_from_sock;
 	con->connect_action = sctp_connect_to_sock;
 	add_sock(sock, con);
@@ -1006,6 +1014,7 @@ static void tcp_connect_to_sock(struct connection *con)
 	struct sockaddr_storage saddr, src_addr;
 	int addr_len;
 	struct socket *sock = NULL;
+	unsigned int mark;
 	int result;
 
 	if (con->nodeid == 0) {
@@ -1027,6 +1036,13 @@ static void tcp_connect_to_sock(struct connection *con)
 	if (result < 0)
 		goto out_err;
 
+	/* set skb mark */
+	result = dlm_comm_mark(con->nodeid, &mark);
+	if (result < 0)
+		goto out_err;
+
+	sock_set_mark(sock->sk, mark);
+
 	memset(&saddr, 0, sizeof(saddr));
 	result = nodeid_to_addr(con->nodeid, &saddr, NULL, false);
 	if (result < 0) {
-- 
2.26.2


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [Cluster-devel] [PATCHv2 dlm-next 3/3] fs: dlm: set skb mark per peer socket
@ 2020-06-26 17:26   ` Alexander Aring
  0 siblings, 0 replies; 10+ messages in thread
From: Alexander Aring @ 2020-06-26 17:26 UTC (permalink / raw)
  To: cluster-devel.redhat.com

This patch adds support to set the skb mark value for the DLM tcp and
sctp socket per peer. The mark value will be offered as per comm value
of configfs. At creation time of the peer socket it will be set as
socket option.

Signed-off-by: Alexander Aring <aahringo@redhat.com>
---
 fs/dlm/config.c   | 38 ++++++++++++++++++++++++++++++++++++++
 fs/dlm/config.h   |  1 +
 fs/dlm/lowcomms.c | 16 ++++++++++++++++
 3 files changed, 55 insertions(+)

diff --git a/fs/dlm/config.c b/fs/dlm/config.c
index 6dce6ec58d74f..eac241ed9003e 100644
--- a/fs/dlm/config.c
+++ b/fs/dlm/config.c
@@ -204,6 +204,7 @@ enum {
 	COMM_ATTR_LOCAL,
 	COMM_ATTR_ADDR,
 	COMM_ATTR_ADDR_LIST,
+	COMM_ATTR_MARK,
 };
 
 enum {
@@ -236,6 +237,7 @@ struct dlm_comm {
 	int nodeid;
 	int local;
 	int addr_count;
+	unsigned int mark;
 	struct sockaddr_storage *addr[DLM_MAX_ADDR_COUNT];
 };
 
@@ -473,6 +475,7 @@ static struct config_item *make_comm(struct config_group *g, const char *name)
 	cm->nodeid = -1;
 	cm->local = 0;
 	cm->addr_count = 0;
+	cm->mark = 0;
 	return &cm->item;
 }
 
@@ -668,8 +671,28 @@ static ssize_t comm_addr_list_show(struct config_item *item, char *buf)
 	return 4096 - allowance;
 }
 
+static ssize_t comm_mark_show(struct config_item *item, char *buf)
+{
+	return sprintf(buf, "%u\n", config_item_to_comm(item)->mark);
+}
+
+static ssize_t comm_mark_store(struct config_item *item, const char *buf,
+			       size_t len)
+{
+	unsigned int mark;
+	int rc;
+
+	rc = kstrtouint(buf, 0, &mark);
+	if (rc)
+		return rc;
+
+	config_item_to_comm(item)->mark = mark;
+	return len;
+}
+
 CONFIGFS_ATTR(comm_, nodeid);
 CONFIGFS_ATTR(comm_, local);
+CONFIGFS_ATTR(comm_, mark);
 CONFIGFS_ATTR_WO(comm_, addr);
 CONFIGFS_ATTR_RO(comm_, addr_list);
 
@@ -678,6 +701,7 @@ static struct configfs_attribute *comm_attrs[] = {
 	[COMM_ATTR_LOCAL] = &comm_attr_local,
 	[COMM_ATTR_ADDR] = &comm_attr_addr,
 	[COMM_ATTR_ADDR_LIST] = &comm_attr_addr_list,
+	[COMM_ATTR_MARK] = &comm_attr_mark,
 	NULL,
 };
 
@@ -837,6 +861,20 @@ int dlm_comm_seq(int nodeid, uint32_t *seq)
 	return 0;
 }
 
+int dlm_comm_mark(int nodeid, unsigned int *mark)
+{
+	struct dlm_comm *cm;
+
+	cm = get_comm(nodeid);
+	if (!cm)
+		return -ENOENT;
+
+	*mark = cm->mark;
+	put_comm(cm);
+
+	return 0;
+}
+
 int dlm_our_nodeid(void)
 {
 	return local_comm ? local_comm->nodeid : 0;
diff --git a/fs/dlm/config.h b/fs/dlm/config.h
index bc94123ac305a..48b4055fd07ff 100644
--- a/fs/dlm/config.h
+++ b/fs/dlm/config.h
@@ -47,6 +47,7 @@ void dlm_config_exit(void);
 int dlm_config_nodes(char *lsname, struct dlm_config_node **nodes_out,
 		     int *count_out);
 int dlm_comm_seq(int nodeid, uint32_t *seq);
+int dlm_comm_mark(int nodeid, unsigned int *mark);
 int dlm_our_nodeid(void);
 int dlm_our_addr(struct sockaddr_storage *addr, int num);
 
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index eaedad7d069a8..3fa1b93dbbc7e 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -914,6 +914,7 @@ static void sctp_connect_to_sock(struct connection *con)
 	int result;
 	int addr_len;
 	struct socket *sock;
+	unsigned int mark;
 
 	if (con->nodeid == 0) {
 		log_print("attempt to connect sock 0 foiled");
@@ -944,6 +945,13 @@ static void sctp_connect_to_sock(struct connection *con)
 	if (result < 0)
 		goto socket_err;
 
+	/* set skb mark */
+	result = dlm_comm_mark(con->nodeid, &mark);
+	if (result < 0)
+		goto bind_err;
+
+	sock_set_mark(sock->sk, mark);
+
 	con->rx_action = receive_from_sock;
 	con->connect_action = sctp_connect_to_sock;
 	add_sock(sock, con);
@@ -1006,6 +1014,7 @@ static void tcp_connect_to_sock(struct connection *con)
 	struct sockaddr_storage saddr, src_addr;
 	int addr_len;
 	struct socket *sock = NULL;
+	unsigned int mark;
 	int result;
 
 	if (con->nodeid == 0) {
@@ -1027,6 +1036,13 @@ static void tcp_connect_to_sock(struct connection *con)
 	if (result < 0)
 		goto out_err;
 
+	/* set skb mark */
+	result = dlm_comm_mark(con->nodeid, &mark);
+	if (result < 0)
+		goto out_err;
+
+	sock_set_mark(sock->sk, mark);
+
 	memset(&saddr, 0, sizeof(saddr));
 	result = nodeid_to_addr(con->nodeid, &saddr, NULL, false);
 	if (result < 0) {
-- 
2.26.2



^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCHv2 dlm-next 1/3] net: sock: add sock_set_mark
  2020-06-26 17:26   ` [Cluster-devel] " Alexander Aring
@ 2020-06-26 17:31     ` Alexander Ahring Oder Aring
  -1 siblings, 0 replies; 10+ messages in thread
From: Alexander Ahring Oder Aring @ 2020-06-26 17:31 UTC (permalink / raw)
  To: davem; +Cc: kuba, David Teigland, Christine Caulfield, cluster-devel, netdev

Dear netdev maintainers,

These patches are based on dlm/next. Due other changes in dlm/next
there could be a conflict when applying everything into net-next. Is
it okay to get this patch merged into dlm/next? Or what is the
preferred way to get these patches upstream?

Thank you.

- Alex


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [Cluster-devel] [PATCHv2 dlm-next 1/3] net: sock: add sock_set_mark
@ 2020-06-26 17:31     ` Alexander Ahring Oder Aring
  0 siblings, 0 replies; 10+ messages in thread
From: Alexander Ahring Oder Aring @ 2020-06-26 17:31 UTC (permalink / raw)
  To: cluster-devel.redhat.com

Dear netdev maintainers,

These patches are based on dlm/next. Due other changes in dlm/next
there could be a conflict when applying everything into net-next. Is
it okay to get this patch merged into dlm/next? Or what is the
preferred way to get these patches upstream?

Thank you.

- Alex



^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2020-06-26 17:31 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-26 17:26 [PATCHv2 dlm-next 0/3] fs: dlm: add support to set skb mark value Alexander Aring
2020-06-26 17:26 ` [Cluster-devel] " Alexander Aring
2020-06-26 17:26 ` [PATCHv2 dlm-next 1/3] net: sock: add sock_set_mark Alexander Aring
2020-06-26 17:26   ` [Cluster-devel] " Alexander Aring
2020-06-26 17:31   ` Alexander Ahring Oder Aring
2020-06-26 17:31     ` [Cluster-devel] " Alexander Ahring Oder Aring
2020-06-26 17:26 ` [PATCHv2 dlm-next 2/3] fs: dlm: set skb mark for listen socket Alexander Aring
2020-06-26 17:26   ` [Cluster-devel] " Alexander Aring
2020-06-26 17:26 ` [PATCHv2 dlm-next 3/3] fs: dlm: set skb mark per peer socket Alexander Aring
2020-06-26 17:26   ` [Cluster-devel] " Alexander Aring

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.