Date: Sat, 17 Mar 2007 21:52:55 -0700 From: Nate Lawson <nate@root.org> To: arch@freebsd.org Subject: Re: PATCH: cpu freq notifiers and eventhandler register from SYSINIT Message-ID: <45FCC5A7.8030704@root.org> In-Reply-To: <45FB908A.6070006@root.org> References: <45FB908A.6070006@root.org>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------090401030305030704030302 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Nate Lawson wrote: > Attached is an updated patch for handling cpu freq changes. It updates > tsc_freq and all direct consumers of it. > > I also would like to add something to eventhandler.h. As I was doing > this, I really wanted a way to declare an eventhandler tag and call > eventhandler_register() from a SYSINIT. I ended up doing that manually > in a lot of cases where I couldn't register up front because it was too > early in boot (i.e. identcpu). Comments on adding this macro, similar > to TASQUEUE_DEFINE in taskqueue.h? Maybe EVENTHANDLER_REGISTER_INIT()? Attached is the patch and an example of how EVENTHANDLER_DECLARE() would be used. It creates a handle and uses a SYSINIT to register the callback function. -- Nate --------------090401030305030704030302 Content-Type: text/plain; name="evh.diff" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="evh.diff" Index: sys/sys/eventhandler.h =================================================================== RCS file: /home/ncvs/src/sys/sys/eventhandler.h,v retrieving revision 1.35 diff -u -r1.35 eventhandler.h --- sys/sys/eventhandler.h 15 Aug 2006 12:10:57 -0000 1.35 +++ sys/sys/eventhandler.h 18 Mar 2007 04:29:51 -0000 @@ -104,6 +104,17 @@ }; \ struct __hack +#define EVENTHANDLER_DEFINE(name, func, arg, priority) \ + static eventhandler_tag name ## _tag; \ + static void name ## _evh_init(void *ctx) \ + { \ + name ## _tag = EVENTHANDLER_REGISTER(name, func, ctx, \ + priority); \ + } \ + SYSINIT(name ## _evh_init, SI_SUB_CONFIGURE, SI_ORDER_ANY, \ + name ## _evh_init, arg) \ + struct __hack + #define EVENTHANDLER_INVOKE(name, ...) \ do { \ struct eventhandler_list *_el; \ Index: sys/i386/i386/identcpu.c =================================================================== RCS file: /home/ncvs/src/sys/i386/i386/identcpu.c,v retrieving revision 1.172 diff -u -r1.172 identcpu.c --- sys/i386/i386/identcpu.c 12 Mar 2007 20:27:21 -0000 1.172 +++ sys/i386/i386/identcpu.c 18 Mar 2007 04:33:02 -0000 @@ -45,6 +45,8 @@ #include <sys/param.h> #include <sys/bus.h> +#include <sys/cpu.h> +#include <sys/eventhandler.h> #include <sys/systm.h> #include <sys/kernel.h> #include <sys/sysctl.h> @@ -1077,6 +1079,21 @@ write_eflags(eflags); } +/* Update TSC freq with the value indicated by the caller. */ +static void +tsc_freq_changed(void *arg, const struct cf_level *level, int status) +{ + /* If there was an error during the transition, don't do anything. */ + if (status != 0) + return; + + /* Total setting for this level gives the new frequency in MHz. */ + hw_clockrate = level->total_set.freq; +} + +EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL, + EVENTHANDLER_PRI_ANY); + /* * Final stage of CPU identification. -- Should I check TI? */ --------------090401030305030704030302--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?45FCC5A7.8030704>