bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH gnumach] Enable MACH_HOST and fix non-addressable bitfields


From: Samuel Thibault
Subject: Re: [PATCH gnumach] Enable MACH_HOST and fix non-addressable bitfields
Date: Sun, 11 Feb 2024 15:14:06 +0100
User-agent: NeoMutt/20170609 (1.8.3)

Samuel Thibault, le dim. 11 févr. 2024 15:01:43 +0100, a ecrit:
> Damien Zammit, le dim. 11 févr. 2024 11:30:31 +0000, a ecrit:
> > On 2/11/24 10:07 PM, Samuel Thibault wrote:
> > > Damien Zammit, le dim. 11 févr. 2024 10:55:26 +0000, a ecrit:
> > >>>> diff --git a/kern/task.h b/kern/task.h
> > >>>> index dec3a530..27970620 100644
> > >>>> --- a/kern/task.h
> > >>>> +++ b/kern/task.h
> > >>>> @@ -61,11 +61,11 @@ struct task {
> > >>>>        decl_simple_lock_data(,lock)    /* Task's lock */
> > >>>>        int             ref_count;      /* Number of references to me */
> > >>>>
> > >>>> -      /* Flags */
> > >>>> -      unsigned int    active:1,       /* Task has not been terminated 
> > >>>> */
> > >>>> -      /* boolean_t */ may_assign:1,   /* can assigned pset be 
> > >>>> changed? */
> > >>>> -                      assign_active:1,        /* waiting for 
> > >>>> may_assign */
> > >>>> -                      essential:1;    /* Is this task essential for 
> > >>>> the system? */
> > >>>> +      /* Addressable flags */
> > >>>> +      unsigned char   active;         /* Task has not been terminated 
> > >>>> */
> > >>>> +      unsigned char   may_assign;     /* can assigned pset be 
> > >>>> changed? */
> > >>>> +      unsigned char   assign_active;  /* waiting for may_assign */
> > >>>> +      unsigned char   essential;      /* Is this task essential for 
> > >>>> the system? */
> > >>> AIUI only assign_active need to be adressable? Better make only that one
> > >>> addressable.
> > >> Looking at the existing flag types, it needs to fit into part of a 
> > >> cacheline.
> > > Why would it need to fit in a cacheline?
> > 
> > See comment above struct task:
> > 
> >   /*
> >    * Task name buffer size.  The size is chosen so that struct task fits
> >    * into three cache lines.  The size of a cache line on a typical CPU
> >    * is 64 bytes.
> >    */
> >   #define TASK_NAME_SIZE 32
> 
> Ok, but that's only for optimization.
> 
> > >> The way I have done it, I rearranged the existing 4 byte integer to be 4 
> > >> separate single byte flags.
> > >> If you want me to put only one of the values into an addressable field,
> > >> how will I retain the same size for the rest of the fields?
> > > What do you mean by "the same size"?
> > 
> > I think the actual sizeof(struct task) and its layout matters.
> 
> Ok
> 
> > Therefore, my original code change here preserves most of the layout and 
> > sizeof(struct task).
> 
> The original code uses 4 bits, so a byte. Your proposed change uses 4
> bytes, so 3 more bytes. By using e.g.
> 
>       unsigned char may_assign,       /* can assigned pset be changed? */
>       unsigned int    active:1,       /* Task has not been terminated */

I meant unsigned char here of course.

>                       assign_active:1,        /* waiting for may_assign */
>                       essential:1;    /* Is this task essential for the 
> system? */
> 
> That'll be 2 bytes, so even better for cache line size.
> 
> Samuel
> 

-- 
Samuel
---
Pour une évaluation indépendante, transparente et rigoureuse !
Je soutiens la Commission d'Évaluation de l'Inria.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]