diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c
index 8e1e97be4df79f3245e2bbbeb0a75841abc67f58..ee3eac338a9deef064f273e29bb59b057835d3f1 100644
--- a/net/sctp/sysctl.c
+++ b/net/sctp/sysctl.c
@@ -525,6 +525,8 @@ static int proc_sctp_do_auth(const struct ctl_table *ctl, int write,
        return ret;
 }
 
+static DEFINE_MUTEX(sctp_sysctl_mutex);
+
 static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write,
                                 void *buffer, size_t *lenp, loff_t *ppos)
 {
@@ -549,6 +551,7 @@ static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write,
                if (new_value > max || new_value < min)
                        return -EINVAL;
 
+               mutex_lock(&sctp_sysctl_mutex);
                net->sctp.udp_port = new_value;
                sctp_udp_sock_stop(net);
                if (new_value) {
@@ -561,6 +564,7 @@ static int proc_sctp_do_udp_port(const struct ctl_table *ctl, int write,
                lock_sock(sk);
                sctp_sk(sk)->udp_port = htons(net->sctp.udp_port);
                release_sock(sk);
+               mutex_unlock(&sctp_sysctl_mutex);
        }
 
        return ret;