On Fri, Jan 27, 2017 at 08:09:36PM +0100, Hrvoje Popovski wrote:
> On 27.1.2017. 19:14, David Hill wrote:
> >> splassert: yield: want 0 have 1
> >> Starting stack trace...
> >> yield() at yield+0xac
> >> pool_get() at pool_get+0x1ca
> >> m_get() at m_get+0x28
> >> ip_ctloutput() at ip_ctloutput+0x4bf
> >> sogetopt() at sogetopt+0x7e
> >> sys_getsockopt() at sys_getsockopt+0xbf
> >> syscall() at syscall+0x27b
> >> --- syscall (number 118) ---
> >> end of kernel
> >> end trace frame: 0x3, count: 250
> >> 0x978bdd844a:
> >> End of stack trace.
> >>  
> >>
> > Attempted to solve this and am running with this diff:
> 
> 
> Hi,
> 
> i applied you patch and i'm still seeing this trace
> 
> 
> splassert: yield: want 0 have 1
> Starting stack trace...
> yield() at yield+0xac
> pool_get() at pool_get+0x1ca
> m_get() at m_get+0x28
> ip_ctloutput() at ip_ctloutput+0x4bf
> sogetopt() at sogetopt+0xa1
> sys_getsockopt() at sys_getsockopt+0xbf
> syscall() at syscall+0x27b
> --- syscall (number 118) ---
> end of kernel
> end trace frame: 0x3, count: 250
> 0x178f12db8f1a:
> End of stack trace.
> 
> 
> and this one i'm seeing for first time, maybe because of this diff
> 
> splassert: yield: want 0 have 1
> Starting stack trace...
> yield() at yield+0xac
> malloc() at malloc+0x406
> ip_setmoptions() at ip_setmoptions+0x248
> ip_ctloutput() at ip_ctloutput+0x461
> sosetopt() at sosetopt+0x8e
> sys_setsockopt() at sys_setsockopt+0x12d
> syscall() at syscall+0x27b
> --- syscall (number 105) ---
> end of kernel
> end trace frame: 0x1f83, count: 250
> 0x91243a37f1a:
> End of stack trace.
>

Forgot a file...   Try this:

 
Index: kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.174
diff -u -p -r1.174 uipc_socket.c
--- kern/uipc_socket.c  26 Jan 2017 00:08:50 -0000      1.174
+++ kern/uipc_socket.c  27 Jan 2017 19:30:31 -0000
@@ -1758,11 +1758,19 @@ sogetopt(struct socket *so, int level, i
 
        if (level != SOL_SOCKET) {
                if (so->so_proto && so->so_proto->pr_ctloutput) {
+                       m = m_get(M_WAIT, MT_SOOPTS);
+                       m->m_len = 0;
+
                        NET_LOCK(s);
                        error = (*so->so_proto->pr_ctloutput)(PRCO_GETOPT, so,
-                           level, optname, mp);
+                           level, optname, &m);
                        NET_UNLOCK(s);
-                       return (error);
+                       if (error) {
+                               m_free(m);
+                               return (error);
+                       }
+                       *mp = m;
+                       return (0);
                } else
                        return (ENOPROTOOPT);
        } else {
@@ -1835,21 +1843,25 @@ sogetopt(struct socket *so, int level, i
                    }
 
                case SO_RTABLE:
-                       (void)m_free(m);
                        if (so->so_proto && so->so_proto->pr_domain &&
                            so->so_proto->pr_domain->dom_protosw &&
                            so->so_proto->pr_ctloutput) {
                                struct domain *dom = so->so_proto->pr_domain;
 
                                level = dom->dom_protosw->pr_protocol;
+                       
                                NET_LOCK(s);
                                error = (*so->so_proto->pr_ctloutput)
-                                   (PRCO_GETOPT, so, level, optname, mp);
+                                   (PRCO_GETOPT, so, level, optname, &m);
                                NET_UNLOCK(s);
-                               return (error);
+                               if (error) {
+                                       (void)m_free(m);
+                                       return (error);
+                               }
+                               break;
                        }
+                       (void)m_free(m);
                        return (ENOPROTOOPT);
-                       break;
 
 #ifdef SOCKET_SPLICE
                case SO_SPLICE:
@@ -1880,7 +1892,6 @@ sogetopt(struct socket *so, int level, i
                        }
                        (void)m_free(m);
                        return (EOPNOTSUPP);
-                       break;
 
                default:
                        (void)m_free(m);
Index: net/rtsock.c
===================================================================
RCS file: /cvs/src/sys/net/rtsock.c,v
retrieving revision 1.220
diff -u -p -r1.220 rtsock.c
--- net/rtsock.c        24 Jan 2017 00:17:14 -0000      1.220
+++ net/rtsock.c        27 Jan 2017 19:30:31 -0000
@@ -277,12 +277,12 @@ route_ctloutput(int op, struct socket *s
        case PRCO_GETOPT:
                switch (optname) {
                case ROUTE_MSGFILTER:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(unsigned int);
                        *mtod(m, unsigned int *) = rop->msgfilter;
                        break;
                case ROUTE_TABLEFILTER:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(unsigned int);
                        *mtod(m, unsigned int *) = rop->rtableid;
                        break;
Index: netinet/ip_mroute.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_mroute.c,v
retrieving revision 1.107
diff -u -p -r1.107 ip_mroute.c
--- netinet/ip_mroute.c 12 Jan 2017 08:22:42 -0000      1.107
+++ netinet/ip_mroute.c 27 Jan 2017 19:30:31 -0000
@@ -225,8 +225,6 @@ ip_mrouter_get(struct socket *so, int op
        if (so != ip_mrouter[inp->inp_rtableid])
                error = ENOPROTOOPT;
        else {
-               *mp = m_get(M_WAIT, MT_SOOPTS);
-
                switch (optname) {
                case MRT_VERSION:
                        error = get_version(*mp);
@@ -241,9 +239,6 @@ ip_mrouter_get(struct socket *so, int op
                        error = ENOPROTOOPT;
                        break;
                }
-
-               if (error)
-                       m_free(*mp);
        }
 
        return (error);
Index: netinet/ip_output.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.334
diff -u -p -r1.334 ip_output.c
--- netinet/ip_output.c 10 Jan 2017 09:01:18 -0000      1.334
+++ netinet/ip_output.c 27 Jan 2017 19:30:31 -0000
@@ -1081,7 +1081,7 @@ ip_ctloutput(int op, struct socket *so, 
                switch (optname) {
                case IP_OPTIONS:
                case IP_RETOPTS:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        if (inp->inp_options) {
                                m->m_len = inp->inp_options->m_len;
                                memcpy(mtod(m, caddr_t),
@@ -1102,7 +1102,7 @@ ip_ctloutput(int op, struct socket *so, 
                case IP_RECVRTABLE:
                case IP_IPSECFLOWINFO:
                case IP_IPDEFTTL:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(int);
                        switch (optname) {
 
@@ -1163,7 +1163,7 @@ ip_ctloutput(int op, struct socket *so, 
                        break;
 
                case IP_PORTRANGE:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(int);
 
                        if (inp->inp_flags & INP_HIGHPORT)
@@ -1180,12 +1180,11 @@ ip_ctloutput(int op, struct socket *so, 
                case IP_ESP_TRANS_LEVEL:
                case IP_ESP_NETWORK_LEVEL:
                case IP_IPCOMP_LEVEL:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
-#ifndef IPSEC
+                       m = *mp;
                        m->m_len = sizeof(int);
+#ifndef IPSEC
                        *mtod(m, int *) = IPSEC_LEVEL_NONE;
 #else
-                       m->m_len = sizeof(int);
                        switch (optname) {
                        case IP_AUTH_LEVEL:
                                optval = inp->inp_seclevel[SL_AUTH];
@@ -1210,12 +1209,12 @@ ip_ctloutput(int op, struct socket *so, 
                        error = EOPNOTSUPP;
                        break;
                case SO_RTABLE:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(u_int);
                        *mtod(m, u_int *) = inp->inp_rtableid;
                        break;
                case IP_PIPEX:
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(int);
                        *mtod(m, int *) = inp->inp_pipex;
                        break;
@@ -1632,10 +1631,7 @@ ip_getmoptions(int optname, struct ip_mo
        struct in_ifaddr *ia;
        struct ifnet *ifp;
 
-       *mp = m_get(M_WAIT, MT_SOOPTS);
-
        switch (optname) {
-
        case IP_MULTICAST_IF:
                addr = mtod(*mp, struct in_addr *);
                (*mp)->m_len = sizeof(struct in_addr);
Index: netinet/raw_ip.c
===================================================================
RCS file: /cvs/src/sys/netinet/raw_ip.c,v
retrieving revision 1.93
diff -u -p -r1.93 raw_ip.c
--- netinet/raw_ip.c    25 Jan 2017 17:34:31 -0000      1.93
+++ netinet/raw_ip.c    27 Jan 2017 19:30:31 -0000
@@ -347,7 +347,6 @@ rip_ctloutput(int op, struct socket *so,
                        break;
 
                case PRCO_GETOPT:
-                       *mp = m_get(M_WAIT, M_SOOPTS);
                        (*mp)->m_len = sizeof(int);
                        *mtod(*mp, int *) = inp->inp_divertfl;
                        break;
Index: netinet/tcp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
retrieving revision 1.142
diff -u -p -r1.142 tcp_usrreq.c
--- netinet/tcp_usrreq.c        10 Jan 2017 09:01:18 -0000      1.142
+++ netinet/tcp_usrreq.c        27 Jan 2017 19:30:32 -0000
@@ -573,7 +573,7 @@ tcp_ctloutput(int op, struct socket *so,
                break;
 
        case PRCO_GETOPT:
-               *mp = m = m_get(M_WAIT, MT_SOOPTS);
+               m = *mp;
                m->m_len = sizeof(int);
 
                switch (optname) {
Index: netinet6/icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.197
diff -u -p -r1.197 icmp6.c
--- netinet6/icmp6.c    19 Jan 2017 14:49:19 -0000      1.197
+++ netinet6/icmp6.c    27 Jan 2017 19:30:32 -0000
@@ -1853,7 +1853,7 @@ icmp6_ctloutput(int op, struct socket *s
                                error = EINVAL;
                                break;
                        }
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(struct icmp6_filter);
                        p = mtod(m, struct icmp6_filter *);
                        bcopy(in6p->inp_icmp6filt, p,
Index: netinet6/ip6_mroute.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_mroute.c,v
retrieving revision 1.107
diff -u -p -r1.107 ip6_mroute.c
--- netinet6/ip6_mroute.c       6 Jan 2017 10:02:57 -0000       1.107
+++ netinet6/ip6_mroute.c       27 Jan 2017 19:30:32 -0000
@@ -250,8 +250,6 @@ ip6_mrouter_get(int cmd, struct socket *
        if (so != ip6_mrouter)
                return (EPERM);
 
-       *mp = m_get(M_WAIT, MT_SOOPTS);
-
        switch (cmd) {
        default:
                return EOPNOTSUPP;
Index: netinet6/ip6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
retrieving revision 1.222
diff -u -p -r1.222 ip6_output.c
--- netinet6/ip6_output.c       27 Jan 2017 02:55:36 -0000      1.222
+++ netinet6/ip6_output.c       27 Jan 2017 19:30:32 -0000
@@ -1475,7 +1475,7 @@ do { \
                                }
                                if (error)
                                        break;
-                               *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                               m = *mp;
                                m->m_len = sizeof(int);
                                *mtod(m, int *) = optval;
                                break;
@@ -1515,7 +1515,7 @@ do { \
                                optdatalen = sizeof(mtuinfo);
                                if (optdatalen > MCLBYTES)
                                        return (EMSGSIZE); /* XXX */
-                               *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                               m = *mp;
                                if (optdatalen > MLEN)
                                        MCLGET(m, M_WAIT);
                                m->m_len = optdatalen;
@@ -1552,12 +1552,11 @@ do { \
                        case IPV6_ESP_TRANS_LEVEL:
                        case IPV6_ESP_NETWORK_LEVEL:
                        case IPV6_IPCOMP_LEVEL:
-                               *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                               m = *mp;
+                               m->m_len = sizeof(int); 
 #ifndef IPSEC
-                               m->m_len = sizeof(int);
                                *mtod(m, int *) = IPSEC_LEVEL_NONE;
 #else
-                               m->m_len = sizeof(int);
                                switch (optname) {
                                case IPV6_AUTH_LEVEL:
                                        optval = inp->inp_seclevel[SL_AUTH];
@@ -1581,12 +1580,12 @@ do { \
 #endif
                                break;
                        case SO_RTABLE:
-                               *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                               m = *mp;
                                m->m_len = sizeof(u_int);
                                *mtod(m, u_int *) = optval;
                                break;
                        case IPV6_PIPEX:
-                               *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                               m = *mp;
                                m->m_len = sizeof(int);
                                *mtod(m, int *) = optval;
                                break;
@@ -1653,7 +1652,7 @@ ip6_raw_ctloutput(int op, struct socket 
                        else
                                optval = inp->inp_cksum6;
 
-                       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+                       m = *mp;
                        m->m_len = sizeof(int);
                        *mtod(m, int *) = optval;
                        break;
@@ -1682,7 +1681,6 @@ ip6_raw_ctloutput(int op, struct socket 
 void
 ip6_initpktopts(struct ip6_pktopts *opt)
 {
-
        bzero(opt, sizeof(*opt));
        opt->ip6po_hlim = -1;   /* -1 means default hop limit */
        opt->ip6po_tclass = -1; /* -1 means default traffic class */
@@ -1787,7 +1785,7 @@ ip6_getpcbopt(struct ip6_pktopts *pktopt
 
        if (optdatalen > MCLBYTES)
                return (EMSGSIZE); /* XXX */
-       *mp = m = m_get(M_WAIT, MT_SOOPTS);
+       m = *mp;
        if (optdatalen > MLEN)
                MCLGET(m, M_WAIT);
        m->m_len = optdatalen;
@@ -2173,10 +2171,7 @@ ip6_getmoptions(int optname, struct ip6_
 {
        u_int *hlim, *loop, *ifindex;
 
-       *mp = m_get(M_WAIT, MT_SOOPTS);
-
        switch (optname) {
-
        case IPV6_MULTICAST_IF:
                ifindex = mtod(*mp, u_int *);
                (*mp)->m_len = sizeof(u_int);
Index: netinet6/raw_ip6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
retrieving revision 1.103
diff -u -p -r1.103 raw_ip6.c
--- netinet6/raw_ip6.c  23 Jan 2017 16:31:24 -0000      1.103
+++ netinet6/raw_ip6.c  27 Jan 2017 19:30:32 -0000
@@ -502,7 +502,6 @@ rip6_ctloutput(int op, struct socket *so
                                break;
 
                        case PRCO_GETOPT:
-                               *mp = m_get(M_WAIT, M_SOOPTS);
                                (*mp)->m_len = sizeof(int);
                                *mtod(*mp, int *) = inp->inp_divertfl;
                                break;

Reply via email to