From owner-p4-projects@FreeBSD.ORG Mon Jun 9 18:42:29 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id A01801065675; Mon, 9 Jun 2008 18:42:29 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 49E4B1065672 for ; Mon, 9 Jun 2008 18:42:29 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 3B8768FC16 for ; Mon, 9 Jun 2008 18:42:29 +0000 (UTC) (envelope-from zec@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m59IgTdm005746 for ; Mon, 9 Jun 2008 18:42:29 GMT (envelope-from zec@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m59IgTm4005744 for perforce@freebsd.org; Mon, 9 Jun 2008 18:42:29 GMT (envelope-from zec@FreeBSD.org) Date: Mon, 9 Jun 2008 18:42:29 GMT Message-Id: <200806091842.m59IgTm4005744@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to zec@FreeBSD.org using -f From: Marko Zec To: Perforce Change Reviews Cc: Subject: PERFORCE change 143208 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 09 Jun 2008 18:42:29 -0000 http://perforce.freebsd.org/chv.cgi?CH=143208 Change 143208 by zec@zec_tpx32 on 2008/06/09 18:41:43 Attempt to fix rpc.lockd triggered panics. The problem was (and still most probably is) caused by network stack functions being called without curvnet context being set first. The canonical remedy is insertioin of CURVNET_SET() / CURVNET_RESTORE() macro pairs at proper places in the offending callers. Obviously to insert such macros at _proper_ places one should have a clear understanding on how the calling code works, and I have absolutely no clue on what and how the kernel-level RPC stuff is supposed to do... Reported by: kris@ Affected files ... .. //depot/projects/vimage/src/sys/rpc/clnt_dg.c#2 edit .. //depot/projects/vimage/src/sys/rpc/rpc_generic.c#2 edit .. //depot/projects/vimage/src/sys/rpc/svc_dg.c#2 edit .. //depot/projects/vimage/src/sys/rpc/svc_generic.c#2 edit Differences ... ==== //depot/projects/vimage/src/sys/rpc/clnt_dg.c#2 (text+ko) ==== ==== //depot/projects/vimage/src/sys/rpc/rpc_generic.c#2 (text+ko) ==== @@ -42,6 +42,7 @@ */ #include "opt_inet6.h" +#include "opt_vimage.h" #include #include @@ -54,6 +55,7 @@ #include #include #include +#include #include #include @@ -183,9 +185,12 @@ struct sockopt opt; int error; + CURVNET_SET(so->so_vnet); error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa); - if (error) + if (error) { + CURVNET_RESTORE(); return 0; + } sip->si_alen = sa->sa_len; family = sa->sa_family; @@ -198,6 +203,7 @@ opt.sopt_valsize = sizeof type; opt.sopt_td = NULL; error = sogetopt(so, &opt); + CURVNET_RESTORE(); if (error) return 0; @@ -694,7 +700,9 @@ struct sockaddr *sa; int error, bound; + CURVNET_SET(so->so_vnet); error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa); + CURVNET_RESTORE(); if (error) return (0); ==== //depot/projects/vimage/src/sys/rpc/svc_dg.c#2 (text+ko) ==== @@ -43,6 +43,8 @@ * svc_dg.c, Server side for connectionless RPC. */ +#include "opt_vimage.h" + #include #include #include @@ -55,6 +57,7 @@ #include #include #include +#include #include @@ -125,7 +128,9 @@ xprt->xp_p2 = NULL; xprt->xp_ops = &svc_dg_ops; + CURVNET_SET(so->so_vnet); error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa); + CURVNET_RESTORE(); if (error) goto freedata; ==== //depot/projects/vimage/src/sys/rpc/svc_generic.c#2 (text+ko) ==== @@ -46,6 +46,7 @@ */ #include "opt_inet6.h" +#include "opt_vimage.h" #include #include @@ -59,6 +60,7 @@ #include #include #include +#include #include #include @@ -203,7 +205,9 @@ socklen_t salen; if (sa == NULL) { + CURVNET_SET(so->so_vnet); error = so->so_proto->pr_usrreqs->pru_sockaddr(so, &sa); + CURVNET_RESTORE(); if (error) return (error); freesa = TRUE; @@ -324,6 +328,7 @@ /* * If the socket is unbound, try to bind it. */ + CURVNET_SET(so->so_vnet); if (madeso || !__rpc_sockisbound(so)) { if (bindaddr == NULL) { if (bindresvport(so, NULL)) { @@ -393,9 +398,11 @@ if (nconf) { xprt->xp_netid = strdup(nconf->nc_netid, M_RPC); } + CURVNET_RESTORE(); return (xprt); freedata: + CURVNET_RESTORE(); if (madeso) (void)soclose(so); if (xprt) {