From mboxrd@z Thu Jan 1 00:00:00 1970 From: George Dunlap Subject: Re: [PATCH 5 of 6 v2] xen: tracing: introduce per-scheduler trace event IDs Date: Fri, 14 Dec 2012 20:00:34 +0000 Message-ID: <50CB8562.8070706@eu.citrix.com> References: <68004a57d91a9bf8b371.1355280775@Solace> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii"; Format="flowed" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <68004a57d91a9bf8b371.1355280775@Solace> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Dario Faggioli Cc: "xen-devel@lists.xensource.com" , "Keir (Xen.org)" , Ian Campbell List-Id: xen-devel@lists.xenproject.org On 12/12/12 02:52, Dario Faggioli wrote: > So that it becomes possible to create scheduler specific trace records, > within each scheduler, without worrying about the overlapping, and also > without giving up being able to recognise them univocally. The latter > is deemed as useful, since we can have more than one scheduler running > at the same time, thanks to cpupools. > > The event ID is 12 bits, and this change uses the upper 3 of them for > the 'scheduler ID'. This means we're limited to 8 schedulers and to > 512 scheduler specific tracing events. Both seem reasonable limitations > as of now. > > This also converts the existing credit2 tracing (the only scheduler > generating tracing events up to now) to the new system. > > Signed-off-by: Dario Faggioli Acked-by: George Dunlap > --- > Changes from v1: > * The event ID generaion macro is now called `TRC_SCHED_CLASS_EVT()', > and has been generalized and put in trace.h, as suggested. > * The handling of per-scheduler tracing IDs and masks have been > restructured, properly naming "ID" the numerical identifiers > and "MASK" the bitmasks, as requested. > > diff --git a/xen/common/sched_credit2.c b/xen/common/sched_credit2.c > --- a/xen/common/sched_credit2.c > +++ b/xen/common/sched_credit2.c > @@ -29,18 +29,22 @@ > #define d2printk(x...) > //#define d2printk printk > > -#define TRC_CSCHED2_TICK TRC_SCHED_CLASS + 1 > -#define TRC_CSCHED2_RUNQ_POS TRC_SCHED_CLASS + 2 > -#define TRC_CSCHED2_CREDIT_BURN TRC_SCHED_CLASS + 3 > -#define TRC_CSCHED2_CREDIT_ADD TRC_SCHED_CLASS + 4 > -#define TRC_CSCHED2_TICKLE_CHECK TRC_SCHED_CLASS + 5 > -#define TRC_CSCHED2_TICKLE TRC_SCHED_CLASS + 6 > -#define TRC_CSCHED2_CREDIT_RESET TRC_SCHED_CLASS + 7 > -#define TRC_CSCHED2_SCHED_TASKLET TRC_SCHED_CLASS + 8 > -#define TRC_CSCHED2_UPDATE_LOAD TRC_SCHED_CLASS + 9 > -#define TRC_CSCHED2_RUNQ_ASSIGN TRC_SCHED_CLASS + 10 > -#define TRC_CSCHED2_UPDATE_VCPU_LOAD TRC_SCHED_CLASS + 11 > -#define TRC_CSCHED2_UPDATE_RUNQ_LOAD TRC_SCHED_CLASS + 12 > +/* > + * Credit2 tracing events ("only" 512 available!). Check > + * include/public/trace.h for more details. > + */ > +#define TRC_CSCHED2_TICK TRC_SCHED_CLASS_EVT(CSCHED2, 1) > +#define TRC_CSCHED2_RUNQ_POS TRC_SCHED_CLASS_EVT(CSCHED2, 2) > +#define TRC_CSCHED2_CREDIT_BURN TRC_SCHED_CLASS_EVT(CSCHED2, 3) > +#define TRC_CSCHED2_CREDIT_ADD TRC_SCHED_CLASS_EVT(CSCHED2, 4) > +#define TRC_CSCHED2_TICKLE_CHECK TRC_SCHED_CLASS_EVT(CSCHED2, 5) > +#define TRC_CSCHED2_TICKLE TRC_SCHED_CLASS_EVT(CSCHED2, 6) > +#define TRC_CSCHED2_CREDIT_RESET TRC_SCHED_CLASS_EVT(CSCHED2, 7) > +#define TRC_CSCHED2_SCHED_TASKLET TRC_SCHED_CLASS_EVT(CSCHED2, 8) > +#define TRC_CSCHED2_UPDATE_LOAD TRC_SCHED_CLASS_EVT(CSCHED2, 9) > +#define TRC_CSCHED2_RUNQ_ASSIGN TRC_SCHED_CLASS_EVT(CSCHED2, 10) > +#define TRC_CSCHED2_UPDATE_VCPU_LOAD TRC_SCHED_CLASS_EVT(CSCHED2, 11) > +#define TRC_CSCHED2_UPDATE_RUNQ_LOAD TRC_SCHED_CLASS_EVT(CSCHED2, 12) > > /* > * WARNING: This is still in an experimental phase. Status and work can be found at the > diff --git a/xen/include/public/trace.h b/xen/include/public/trace.h > --- a/xen/include/public/trace.h > +++ b/xen/include/public/trace.h > @@ -57,6 +57,32 @@ > #define TRC_SCHED_CLASS 0x00022000 /* Scheduler-specific */ > #define TRC_SCHED_VERBOSE 0x00028000 /* More inclusive scheduling */ > > +/* > + * The highest 3 bits of the last 12 bits of TRC_SCHED_CLASS above are > + * reserved for encoding what scheduler produced the information. The > + * actual event is encoded in the last 9 bits. > + * > + * This means we have 8 scheduling IDs available (which means at most 8 > + * schedulers generating events) and, in each scheduler, up to 512 > + * different events. > + */ > +#define TRC_SCHED_ID_BITS 3 > +#define TRC_SCHED_ID_SHIFT (TRC_SUBCLS_SHIFT - TRC_SCHED_ID_BITS) > +#define TRC_SCHED_ID_MASK (((1UL< +#define TRC_SCHED_EVT_MASK (~(TRC_SCHED_ID_MASK)) > + > +/* Per-scheduler IDs, to identify scheduler specific events */ > +#define TRC_SCHED_CSCHED 0 > +#define TRC_SCHED_CSCHED2 1 > +#define TRC_SCHED_SEDF 2 > +#define TRC_SCHED_ARINC653 3 > + > +/* Per-scheduler tracing */ > +#define TRC_SCHED_CLASS_EVT(_c, _e) \ > + ( ( TRC_SCHED_CLASS | \ > + ((TRC_SCHED_##_c << TRC_SCHED_ID_SHIFT) & TRC_SCHED_ID_MASK) ) + \ > + (_e & TRC_SCHED_EVT_MASK) ) > + > /* Trace classes for Hardware */ > #define TRC_HW_PM 0x00801000 /* Power management traces */ > #define TRC_HW_IRQ 0x00802000 /* Traces relating to the handling of IRQs */