From owner-freebsd-current@FreeBSD.ORG Tue Nov 8 19:18:34 2005 Return-Path: X-Original-To: freebsd-current@freebsd.org Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 7276F16A41F for ; Tue, 8 Nov 2005 19:18:34 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (vc4-2-0-87.dsl.netrack.net [199.45.160.85]) by mx1.FreeBSD.org (Postfix) with ESMTP id 0935243D48 for ; Tue, 8 Nov 2005 19:18:33 +0000 (GMT) (envelope-from imp@bsdimp.com) Received: from localhost (localhost.village.org [127.0.0.1] (may be forged)) by harmony.bsdimp.com (8.13.3/8.13.3) with ESMTP id jA8JIRMD025931; Tue, 8 Nov 2005 12:18:27 -0700 (MST) (envelope-from imp@bsdimp.com) Date: Tue, 08 Nov 2005 12:18:58 -0700 (MST) Message-Id: <20051108.121858.51703736.imp@bsdimp.com> To: thierry@herbelot.com From: "M. Warner Losh" In-Reply-To: <200511081913.15042.thierry@herbelot.com> References: <20051107094655.GA76489@cirb503493.alcatel.com.au> <200511081913.15042.thierry@herbelot.com> X-Mailer: Mew version 3.3 on Emacs 21.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-2.0 (harmony.bsdimp.com [127.0.0.1]); Tue, 08 Nov 2005 12:18:27 -0700 (MST) Cc: freebsd-current@freebsd.org Subject: Re: Attempting to sleep in interrupts 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, 08 Nov 2005 19:18:34 -0000 Does this solve the problem? Warner Index: subr_power.c =================================================================== RCS file: /cache/ncvs/src/sys/kern/subr_power.c,v retrieving revision 1.5 diff -u -r1.5 subr_power.c --- subr_power.c 2 Jan 2004 18:24:13 -0000 1.5 +++ subr_power.c 8 Nov 2005 19:17:54 -0000 @@ -32,10 +32,20 @@ #include #include +#include static u_int power_pm_type = POWER_PM_TYPE_NONE; static power_pm_fn_t power_pm_fn = NULL; static void *power_pm_arg = NULL; +static struct task power_pm_task; + +static void +power_pm_deferred_fn(void *arg, int pending) +{ + int state = (int)arg; + + power_pm_fn(POWER_CMD_SUSPEND, power_pm_arg, state); +} int power_pm_register(u_int pm_type, power_pm_fn_t pm_fn, void *pm_arg) @@ -48,6 +58,7 @@ power_pm_fn = pm_fn; power_pm_arg = pm_arg; error = 0; + TASK_INIT(&power_pm_task, 0, power_pm_deferred_fn, NULL); } else { error = ENXIO; } @@ -72,8 +83,8 @@ state != POWER_SLEEP_STATE_SUSPEND && state != POWER_SLEEP_STATE_HIBERNATE) return; - - power_pm_fn(POWER_CMD_SUSPEND, power_pm_arg, state); + power_pm_task.ta_context = (void *)state; + taskqueue_enqueue(taskqueue_swi, &power_pm_task); } /*