Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 5 Apr 2006 17:08:21 +0100 (BST)
From:      Robert Watson <rwatson@FreeBSD.org>
To:        Kazuaki Oda <kaakun@highway.ne.jp>
Cc:        freebsd-current@freebsd.org
Subject:   Re: kernel panic: page fault
Message-ID:  <20060405170737.P82516@fledge.watson.org>
In-Reply-To: <44333063.70606@highway.ne.jp>
References:  <4430FAAF.2040809@highway.ne.jp> <20060403133210.U36756@fledge.watson.org> <44311AB5.2010407@highway.ne.jp> <20060404141813.H22854@fledge.watson.org> <44333063.70606@highway.ne.jp>

next in thread | previous in thread | raw e-mail | index | archive | help

On Wed, 5 Apr 2006, Kazuaki Oda wrote:

> Is more information required?

Could you try the attached patch?

Index: tcp_input.c
===================================================================
RCS file: /home/ncvs/src/sys/netinet/tcp_input.c,v
retrieving revision 1.296
diff -u -r1.296 tcp_input.c
--- tcp_input.c	5 Apr 2006 08:45:59 -0000	1.296
+++ tcp_input.c	5 Apr 2006 16:07:23 -0000
@@ -173,7 +173,7 @@
  		     struct mbuf *);
  static void	 tcp_xmit_timer(struct tcpcb *, int);
  static void	 tcp_newreno_partial_ack(struct tcpcb *, struct tcphdr *);
-static int	 tcp_timewait(struct tcptw *, struct tcpopt *,
+static int	 tcp_timewait(struct inpcb *, struct tcpopt *,
  		     struct tcphdr *, struct mbuf *, int);

  /* Neighbor Discovery, Neighbor Unreachability Detection Upper layer hint. */
@@ -760,7 +760,7 @@
  		 */
  		if (thflags & TH_SYN)
  			tcp_dooptions(&to, optp, optlen, 1);
-		if (tcp_timewait(intotw(inp), &to, th, m, tlen))
+		if (tcp_timewait(inp, &to, th, m, tlen))
  			goto findpcb;
  		/*
  		 * tcp_timewait unlocks inp.
@@ -3141,13 +3141,14 @@
   * looking for a pcb in the listen state.  Returns 0 otherwise.
   */
  static int
-tcp_timewait(tw, to, th, m, tlen)
-	struct tcptw *tw;
+tcp_timewait(inp, to, th, m, tlen)
+	struct inpcb *inp;
  	struct tcpopt *to;
  	struct tcphdr *th;
  	struct mbuf *m;
  	int tlen;
  {
+	struct tcptw *tw;
  	int thflags;
  	tcp_seq seq;
  #ifdef INET6
@@ -3156,19 +3157,20 @@
  	const int isipv6 = 0;
  #endif

+	/* tcbinfo lock required for tcp_twclose(), tcp_2msl_reset. */
+	INP_INFO_WLOCK_ASSERT(&tcbinfo);
+	INP_LOCK_ASSERT(inp);
+
  	/*
  	 * XXXRW: Time wait state for inpcb has been recycled, but inpcb is
  	 * still present.  This is undesirable, but temporarily necessary
  	 * until we work out how to handle inpcb's who's timewait state has
  	 * been removed.
  	 */
+	tw = intotw(inp);
  	if (tw == NULL)
  		goto drop;

-	/* tcbinfo lock required for tcp_twclose(), tcp_2msl_reset. */
-	INP_INFO_WLOCK_ASSERT(&tcbinfo);
-	INP_LOCK_ASSERT(tw->tw_inpcb);
-
  	thflags = th->th_flags;

  	/*
@@ -3268,12 +3270,11 @@
  		tcp_respond(NULL,
  		    mtod(m, void *), th, m, seq, 0, TH_RST|TH_ACK);
  	}
-	INP_UNLOCK(tw->tw_inpcb);
+	INP_UNLOCK(inp);
  	return (0);

  drop:
-	if (tw != NULL)
-		INP_UNLOCK(tw->tw_inpcb);
+	INP_UNLOCK(inp);
  	m_freem(m);
  	return (0);
  }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20060405170737.P82516>