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

Re: [PATCH v5 13/13] xen/arm: add cache coloring support for Xen



Hi Julien,

On Tue, Jan 16, 2024 at 12:59 PM Julien Grall <julien@xxxxxxx> wrote:
>
> Hi,
>
> On 15/01/2024 16:16, Julien Grall wrote:
> > On 15/01/2024 15:43, Carlo Nonato wrote:
> >> Hi Julien,
> >
> > Hi Carlo,
> >
> >> On Mon, Jan 15, 2024 at 12:18 PM Julien Grall <julien@xxxxxxx> wrote:
> >>> On 15/01/2024 10:11, Carlo Nonato wrote:
> >>>> I understand what you're talking about, and it seems reasonable to
> >>>> get rid of
> >>>> xen_colored_temp[] and create_llc_coloring_mappings() since in the
> >>>> end they
> >>>> serve the purpose of mapping the physically colored space that is
> >>>> already
> >>>> mapped using xen_xenmap[] pagetables.
> >>>> What I don't understand is then how to copy/relocate Xen since I
> >>>> don't have a
> >>>> destination virtual space anymore to use in relocate_xen().
> >>>
> >>> You will need to link xen_xenmap[] in boot_second[...] as well. With
> >>> that, you will be able to access the new Xen through the temporary area.
> >>
> >> Wouldn't it result in overwriting the current virtual space mapping?
> >> boot_second is the live page table and if I link xen_xenmap[] then
> >> XEN_VIRT_START would point to the new colored space which is still
> >> empty at
> >> this stage...
> >
> > If you link at XEN_VIRT_START then yes. But you could link at
> > BOOT_RELOC_VIRT_START like you already do today.
> >
> >>
> >>> [...]
> >>>
> >>>>> Note that this means the init_ttbr cannot be written directly. But you
> >>>>> can solve this problem by re-mapping the address.
> >>>>
> >>>> How to remap a single address?
> >>>
> >>> You should be able to use map_domain_page() to map the page where
> >>> init_ttbr is.
> >>>
> >>>> And if moving init_ttbr in the identity-mapped area means that it's
> >>>> no longer
> >>>> writable, so that I need to remap it, why moving it in that area in
> >>>> the first
> >>>> place. Again I think I'm missing something.
> >>>
> >>> The goal is to have everything used (code, data) before the MMU is
> >>> turned on residing in a single page. So secondary CPUs can directly jump
> >>> to the colored Xen without any trouble.
> >>
> >> This is what confuses me. Why having everything on a single page makes
> >> secondary cpus able to jump directly to colored Xen? (also see below)
> >
> > Because the code running with the MMU off can access easily access
> > everything.
> >
> >>
> >>>>>>
> >>>>>> 3) To access the identity mapping area I would need some accessor
> >>>>>> that takes
> >>>>>> an address and returns it + phys_offset, or is there a better way
> >>>>>> to do it?
> >>>>>
> >>>>> I am not sure I understand what you mean. Can you clarify?
> >>>>
> >>>> In my idea, I would use the identity mapping to access the "old"
> >>>> variables,
> >>>> where "old" means non physically colored. init_ttbr is an example. When
> >>>> Xen it's copied on the new physical space, init_ttbr is copied with
> >>>> it and
> >>>> if the boot cpu modifies this variable, it's actually touching the
> >>>> colored
> >>>> one and not the old one. This means that secondary CPUs that still
> >>>> haven't
> >>>> jumped to the new space, won't be able to see the new value and will
> >>>> never
> >>>> go online.
> >>>> So to access this "old" init_ttbr variable I need it's identity
> >>>> address,
> >>>> which is its current virtual address + some physical offset. I was
> >>>> asking
> >>>> you if this is the right approach to use the identity mapping.
> >>>
> >>> Secondary CPUs would directly start on the colored Xen. So they will be
> >>> able to access the "new" init_ttbr & co.
> >>
> >> How can this be true? I mean, in call_psci_cpu_on() I can start those
> >> CPUs in
> >> the colored space, but they still use the boot_* pagetables
> >
> > Are you looking at the 64-bit or 32-bit code? For 64-bit, staging is not
> > using boot_* pagetable anymore for secondary CPUs. Instead, they
> > directly jump to the runtime page-tables.
> >
> >> and there I can't
> >> easily link the new colored space, or, at least, I'm not succeding in
> >> doing
> >> that. What I tried at the moment is to link xen_xenmap in boot_second
> >> after
> >> switch_ttbr because of the problem I described above. But then secondary
> >> CPUs never go online...
> >
> > It would be helpful if you share some code.
> >
> >>
> >>> [...]
> >>>
> >>>>> ... as I wrote ealier your current approach seems to have a flaw.
> >>>>> As you
> >>>>> overwrite xen_bootmodule->{start, size}. setup_mm() will end up to add
> >>>>> the old Xen region to the boot allocator. This is before any secondary
> >>>>> CPUs are booted up.
> >>>>>
> >>>>> IOW, the allocator may provide some memory from the old Xen and
> >>>>> nothing
> >>>>> good will happen from that.
> >>>>>
> >>>>> The only way to solve it is to add another module. So the memory is
> >>>>> skipped by setup_mm(). However see below.
> >>>>>
> >>>>>>
> >>>>>> Yes that should be memory that in the end would not be needed so
> >>>>>> it must
> >>>>>> return to the boot-allocator (if that's what you mean). But how to do
> >>>>>> that?
> >>>>>
> >>>>> You can't really discard the old temporary Xen. This may work today
> >>>>> because we don't support CPU hotplug or suspend/resume. But there was
> >>>>> some series on the ML to enable it and I don't see any reason why
> >>>>> someone would not want to use the features with cache coloring.
> >>>>>
> >>>>> So the old temporary Xen would have to be kept around forever. This is
> >>>>> up to 8MB of memory wasted.
> >>>>>
> >>>>> The right approach is to have the secondary CPU boot code
> >>>>> (including the
> >>>>> variables it is using) fitting in the same page (or possibly
> >>>>> multiple so
> >>>>> long this is small and physically contiguous). With that it doesn't
> >>>>> matter where is the trampoline, it could stay at the old place, but we
> >>>>> would only waste a few pages rather than up 8MB as it is today.
> >>>>
> >>>> So what are you suggesting is to create a new section in the linker
> >>>> script
> >>>> for the trampoline code and data,
> >>>
> >>> We already have a section for that in place (see .idmap.*) which happens
> >>> to be at the beginning of Xen. Right now, the section is in text. Which
> >>> is why it is read-only executable.
> >>>
> >>>> then in setup_mm() we would skip this
> >>>> memory?
> >>>
> >>> We should not need this. Secondary boot CPUs should boot direclty on the
> >>> colored Xen.
> >>>
> >>>> Am I following you correctly? Sorry those topics are a little out
> >>>> of my preparation as you probably already guessed.
> >>>
> >>> No worries. I am happy to go in as much details as necessary. I can also
> >>> attempt to write a patch if that helps. (unless someone else in the Arm
> >>> maintainers want to give a try).
> >>
> >> Yes this would help. Thanks.
> >
> > I will try to have a look this evening. If I can't, it may have to wait
> > a couple of weeks unless someone has time before hand.
>
> Series sent [1]. This is not fully complete for cache coloring. You will
> need to modify the identity functions to take into account that the
> identity map will be different.
>
> You will also want to check the new identity map area is still below
> (see the check in prepare_boot_identity_mapping()).
>
> Cheers,
>
> [1] https://lore.kernel.org/xen-devel/20240116115509.77545-1-julien@xxxxxxx/

Thank you very much for your help. I succeeded in applying your patches and
reworking setup_pagetables() as we discussed previously. I dropped
xen_colored_temp[], the temporary mapping at the end of setup_pagetables()
and remove_llc_coloring_mappings().

Now, what to do with your patches? Will you push those before this series?

I still have a few other minor problems to face in other patches of my series,
but then I should be ready for v6.

> --
> Julien Grall

Thanks.



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.