[PATCH 2/4] ntdll: Report logical cores per physical core through mask.
Roderick Colenbrander
thunderbird2k at gmail.com
Thu Jun 14 01:08:20 CDT 2018
Please still review the series for overall. I just realized though the
code can be slightly simplified if I still submit 'core_id' to
logical_proc_info_add_by_id. The lookup code within that function
doesn't have to parse the masks (ProcessorMask or GroupMask[0]) and it
is cleaner and more future proof that way.
Thanks,
Roderick
On Wed, Jun 13, 2018 at 10:48 PM, Roderick Colenbrander
<thunderbird2k at gmail.com> wrote:
> Signed-off-by: Roderick Colenbrander <thunderbird2k at gmail.com>
> ---
> dlls/ntdll/nt.c | 28 ++++++++++++++++++++++------
> 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
> index e6458b98f2..0b69f7de44 100644
> --- a/dlls/ntdll/nt.c
> +++ b/dlls/ntdll/nt.c
> @@ -1325,8 +1325,16 @@ static inline BOOL logical_proc_info_add_by_id(SYSTEM_LOGICAL_PROCESSOR_INFORMAT
> (*pdata)[i].ProcessorMask |= mask;
> return TRUE;
> }
> - }else
> - i = *len;
> + }
> + else
> + {
> + for(i=0; i<*len; i++)
> + {
> + if ((*pdata)[i].Relationship==rel && (*pdata)[i].ProcessorMask==mask &&
> + (*pdata)[i].u.Reserved[1]==id)
> + return TRUE;
> + }
> + }
>
> while(*len == *pmax_len)
> {
> @@ -1352,6 +1360,11 @@ static inline BOOL logical_proc_info_add_by_id(SYSTEM_LOGICAL_PROCESSOR_INFORMAT
> dataex->u.Processor.GroupMask[0].Mask |= mask;
> return TRUE;
> }
> + else if (rel == RelationProcessorCore && dataex->Relationship == rel &&
> + dataex->u.Processor.GroupMask[0].Mask == mask && dataex->u.Processor.Reserved[1] == id)
> + {
> + return TRUE;
> + }
> ofs += dataex->Size;
> }
>
> @@ -1548,6 +1561,8 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
>
> for(i=beg; i<=end; i++)
> {
> + ULONG_PTR thread_mask = 0;
> +
> if(i > 8*sizeof(ULONG_PTR))
> {
> FIXME("skipping logical processor %d\n", i);
> @@ -1568,15 +1583,16 @@ static NTSTATUS create_logical_proc_info(SYSTEM_LOGICAL_PROCESSOR_INFORMATION **
> return STATUS_NO_MEMORY;
> }
>
> - sprintf(name, core_info, i, "core_id");
> + /* Mask of logical threads sharing same physical core. */
> + sprintf(name, core_info, i, "thread_siblings");
> f = fopen(name, "r");
> if(f)
> {
> - fscanf(f, "%u", &r);
> + fscanf(f, "%lx", &thread_mask);
> fclose(f);
> }
> - else r = i;
> - if(!logical_proc_info_add_by_id(data, dataex, &len, max_len, RelationProcessorCore, r, (ULONG_PTR)1 << i))
> + else thread_mask = 1<<i;
> + if(!logical_proc_info_add_by_id(data, dataex, &len, max_len, RelationProcessorCore, r, thread_mask))
> {
> fclose(fcpu_list);
> return STATUS_NO_MEMORY;
> --
> 2.14.4
>
More information about the wine-devel
mailing list