From owner-freebsd-current@FreeBSD.ORG Tue Feb 27 14:53:18 2007 Return-Path: X-Original-To: freebsd-current@mx1.freebsd.org Delivered-To: freebsd-current@mx1.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id D059D16A401 for ; Tue, 27 Feb 2007 14:53:18 +0000 (UTC) (envelope-from piso@newluxor.wired.org) Received: from mail.oltrelinux.com (krisma.oltrelinux.com [194.242.226.43]) by mx1.freebsd.org (Postfix) with ESMTP id 5BE0913C48D for ; Tue, 27 Feb 2007 14:53:18 +0000 (UTC) (envelope-from piso@newluxor.wired.org) Received: from newluxor.wired.org (ip-91-186.sn1.eutelia.it [62.94.91.186]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by mail.oltrelinux.com (Postfix) with ESMTP id E238F11AEB1; Tue, 27 Feb 2007 15:53:12 +0100 (CET) Received: (from piso@localhost) by newluxor.wired.org (8.13.8/8.13.8/Submit) id l1REr1Yu001900; Tue, 27 Feb 2007 15:53:01 +0100 (CET) (envelope-from piso) Date: Tue, 27 Feb 2007 15:52:59 +0100 From: Paolo Pisati To: Goran Gajic Message-ID: <20070227145259.GB1655@tin.it> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.4.2.2i X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at krisma.oltrelinux.com Cc: freebsd-current@mx1.freebsd.org Subject: Re: em0+msi related panic X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 27 Feb 2007 14:53:18 -0000 On Tue, Feb 27, 2007 at 02:32:26PM +0100, Goran Gajic wrote: > > > Hi, > > Looking through source and diff of sys/dev/em/if_em.c I have noticed that > > @@ -275,7 +275,7 @@ static void em_add_int_delay_sysctl(stru > static poll_handler_t em_poll; > static void em_intr(void *); > #else > -static void em_intr_fast(void *); > +static int em_intr_fast(void *); > static void em_add_int_process_limit(struct adapter *, const char *, > const char *, int *, int); > static void em_handle_rxtx(void *context, int pending); > @@ -1307,7 +1307,7 @@ em_handle_rxtx(void *context, int pendin > * Fast Interrupt Service routine > * > *********************************************************************/ > -static void > +static int > em_intr_fast(void *arg) > { > struct adapter *adapter = arg; > > @@ -2173,8 +2174,8 @@ em_allocate_intr(struct adapter *adapter > > #ifdef DEVICE_POLLING > if (adapter->int_handler_tag == NULL && (error = > bus_setup_intr(dev, > - adapter->res_interrupt, INTR_TYPE_NET | INTR_MPSAFE, em_intr, > adapter, > - &adapter->int_handler_tag)) != 0) { > + adapter->res_interrupt, INTR_TYPE_NET | INTR_MPSAFE, NULL, > em_intr, > + adapter, &adapter->int_handler_tag)) != 0) { > device_printf(dev, "Failed to register interrupt > handler"); > return (error); > } > > > between revision 1.168 and 1.169 that causes panic. I have switched > em_intr_fast to be static void and order in bus_setup_intr is incorrect. > It should be: > > if ((error = bus_setup_intr(dev, adapter->res_interrupt, > INTR_TYPE_NET,NULL, em_intr_fast, adapter, > &adapter->int_handler_tag)) != 0) { > > not > > if ((error = bus_setup_intr(dev, adapter->res_interrupt, > INTR_TYPE_NET, em_intr_fast,NULL adapter, > &adapter->int_handler_tag)) != 0) { No, wait, em_intr_fast() was supposed to run as an INTR_FAST (that's where it gets the suffix '_fast'), and since the bus_setup_intr() modification to define an INTR_FAST/filter, you use the driver_filter_t arg, so: bus_setup_intr(dev, adapter->res_interrupt, INTR_TYPE_NET, em_intr_fast,NULL adapter, &adapter->int_handler_tag) is the correct one. Moreover, all the filter handlers (ex INTR_FAST) return a status about interrupt handling, so em_intr_fast() prototype and return code are corrects. bye, P.