Module Name: src
Committed By: ozaki-r
Date: Mon Sep 25 01:57:54 UTC 2017
Modified Files:
src/sys/net: raw_usrreq.c rtsock.c
Log Message:
Use a dedicated mutex for rt_rawcb instead of softnet_lock if NET_MPSAFE
To generate a diff of this commit:
cvs rdiff -u -r1.57 -r1.58 src/sys/net/raw_usrreq.c
cvs rdiff -u -r1.228 -r1.229 src/sys/net/rtsock.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/net/raw_usrreq.c
diff -u src/sys/net/raw_usrreq.c:1.57 src/sys/net/raw_usrreq.c:1.58
--- src/sys/net/raw_usrreq.c:1.57 Mon Sep 25 01:56:22 2017
+++ src/sys/net/raw_usrreq.c Mon Sep 25 01:57:54 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: raw_usrreq.c,v 1.57 2017/09/25 01:56:22 ozaki-r Exp $ */
+/* $NetBSD: raw_usrreq.c,v 1.58 2017/09/25 01:57:54 ozaki-r Exp $ */
/*
* Copyright (c) 1980, 1986, 1993
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.57 2017/09/25 01:56:22 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: raw_usrreq.c,v 1.58 2017/09/25 01:57:54 ozaki-r Exp $");
#include <sys/param.h>
#include <sys/mbuf.h>
@@ -75,8 +75,6 @@ raw_input(struct mbuf *m0, ...)
struct sockaddr *src, *dst;
struct rawcbhead *rawcbhead;
- KASSERT(mutex_owned(softnet_lock));
-
va_start(ap, m0);
proto = va_arg(ap, struct sockproto *);
src = va_arg(ap, struct sockaddr *);
Index: src/sys/net/rtsock.c
diff -u src/sys/net/rtsock.c:1.228 src/sys/net/rtsock.c:1.229
--- src/sys/net/rtsock.c:1.228 Mon Sep 25 01:56:22 2017
+++ src/sys/net/rtsock.c Mon Sep 25 01:57:54 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: rtsock.c,v 1.228 2017/09/25 01:56:22 ozaki-r Exp $ */
+/* $NetBSD: rtsock.c,v 1.229 2017/09/25 01:57:54 ozaki-r Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.228 2017/09/25 01:56:22 ozaki-r Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rtsock.c,v 1.229 2017/09/25 01:57:54 ozaki-r Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -184,6 +184,11 @@ struct routecb {
};
#define sotoroutecb(so) ((struct routecb *)(so)->so_pcb)
+static struct rawcbhead rt_rawcb;
+#ifdef NET_MPSAFE
+static kmutex_t *rt_so_mtx;
+#endif
+
static void
rt_adjustcount(int af, int cnt)
{
@@ -260,6 +265,14 @@ COMPATNAME(route_attach)(struct socket *
so->so_pcb = rp;
s = splsoftnet();
+
+#ifdef NET_MPSAFE
+ KASSERT(so->so_lock == NULL);
+ mutex_obj_hold(rt_so_mtx);
+ so->so_lock = rt_so_mtx;
+ solock(so);
+#endif
+
if ((error = raw_attach(so, proto, &rt_rawcb)) == 0) {
rt_adjustcount(rp->rcb_proto.sp_protocol, 1);
rp->rcb_laddr = &COMPATNAME(route_info).ri_src;
@@ -2025,8 +2038,10 @@ COMPATNAME(route_intr)(void *cookie)
struct route_info * const ri = &COMPATNAME(route_info);
struct mbuf *m;
+#ifndef NET_MPSAFE
mutex_enter(softnet_lock);
KERNEL_LOCK(1, NULL);
+#endif
for (;;) {
IFQ_LOCK(&ri->ri_intrq);
IF_DEQUEUE(&ri->ri_intrq, m);
@@ -2034,10 +2049,18 @@ COMPATNAME(route_intr)(void *cookie)
if (m == NULL)
break;
proto.sp_protocol = M_GETCTX(m, uintptr_t);
+#ifdef NET_MPSAFE
+ mutex_enter(rt_so_mtx);
+#endif
raw_input(m, &proto, &ri->ri_src, &ri->ri_dst, &rt_rawcb);
+#ifdef NET_MPSAFE
+ mutex_exit(rt_so_mtx);
+#endif
}
+#ifndef NET_MPSAFE
KERNEL_UNLOCK_ONE(NULL);
mutex_exit(softnet_lock);
+#endif
}
/*
@@ -2075,6 +2098,9 @@ COMPATNAME(route_init)(void)
#ifndef COMPAT_RTSOCK
rt_init();
#endif
+#ifdef NET_MPSAFE
+ rt_so_mtx = mutex_obj_alloc(MUTEX_DEFAULT, IPL_NONE);
+#endif
sysctl_net_route_setup(NULL);
ri->ri_intrq.ifq_maxlen = ri->ri_maxqlen;