On Mon, Aug 24, 2020 at 10:41 AM Utkarsh Rai <utkarsh.ra...@gmail.com> wrote: > > > > On Mon, Aug 24, 2020 at 9:34 PM Gedare Bloom <ged...@rtems.org> wrote: >> >> On Sat, Aug 22, 2020 at 11:27 PM Utkarsh Rai <utkarsh.ra...@gmail.com> wrote: >> > >> > >> > >> > On Sat, Aug 22, 2020 at 11:32 PM Gedare Bloom <ged...@rtems.org> wrote: >> >> >> >> I have some comments below. I'm not that happy with the lack of design >> >> discussion during the iteration of this code. While it is a little >> >> easier to critique the code, it is also a bit wasteful because I have >> >> to also comment on stylistic problems, and when some decisions you >> >> make while coding end up not being correct or aren't easily understood >> >> during code review then you might have to spend more time recoding. It >> >> can be hard to find the balance between design and code reviews, >> >> >> >> On Sat, Aug 22, 2020 at 9:19 AM Utkarsh Rai <utkarsh.ra...@gmail.com> >> >> wrote: >> >> > + >> >> > +#if defined ( RTEMS_THREAD_STACK_PROTECTION ) >> >> > + >> >> > +/** >> >> > + * The following defines the control block of a shared stack. Each >> >> > stack can have >> >> > + * different sharing attributes. >> >> > + */ >> >> > +typedef struct >> >> > +{ >> >> > + /** Access flags of the shared stack */ >> >> > + uint32_t access_flags; >> >> > + /** This is the stack address of the sharing thread*/ >> >> > + void* shared_stack_area; >> >> > + /** Stack size of the sharing thread*/ >> >> > + size_t shared_stack_size; >> >> > + /** This is the stack address of the target stack. Maybe this area >> >> > is not >> >> > + * needed but this helps in selecting the target thread during stack >> >> > sharing. >> >> > + */ >> >> > + void* target_stack_area; >> >> I'm confused about the difference between shared_stack_area and >> >> target_stack_area >> >> >> >> > + /** Error checking for valid target stack address. This is also used >> >> > to >> >> > + * distinguish between a normal mmap operation and a stack sharing >> >> > operation. >> >> > + */ >> >> I don't really know what this means. >> > >> > >> > This is related to the mmap() call. When we share stack using mmap, two >> > of the important parameters that reference to the target thread-stack >> > and sharing thread-stack are -'void* addr' which is the address of the >> > target thread stack and 'int fd' that is the file descriptor to the shared >> > memory >> > object corresponding to the thread stack being shared. Now, stack sharing >> > is different from a normal mmap operation in the sense that we need to add >> > the sharing stack attributes to the stack control structure of the thread >> > that is specified by 'addr' as compared to adding it to the chain of >> > mappings. To select the >> > target thread we need to iterate over all the threads, in the case we do >> > not find any thread, we can proceed with our normal mmap operation >> > otherwise we add the >> > sharing thread stack attribute to the stack control structure of the >> > target thread. We have the _Thread_Iterate() function but it only has two >> > parameters the pointer to the >> > function that performs operation during each iteration and a parameter >> > related to this operation. My decision to specify the 'target_stack_area', >> > the 'shared_stack_area' and 'stack_shared' in the structure >> > was so that I could squeeze in as much information to select the thread, >> > set the sharing stack parameters in the thread, and validate(through >> > stack_shared attribute) in the mmap() call that this is >> > in fact a stack-sharing operation, in a single iteration. >> > >> >> Maybe I should ask this on the mmap patch itself, but I'm more >> interested in the design than the code right now. I think I'll just >> ask a few questions: >> >> The 'sharing' stack is the stack that is getting r/w permission added >> to another thread, and the 'target' thread is the thread that is >> getting the r/w permission to access the shared stack. We should not >> really care about the 'sharing thread' or the 'target stack'? > > > If the mmap() call for sharing thread stack assumes that it is being called > from the context of the 'target thread', then no, we should not. > >> >> >> If mmap() assumes the calling context then the executing thread is the >> "target thread" and you shouldn't have to search for it? In typical >> POSIX implementations, mmap() assumes the executing process context >> called it, but can we make the same assumption? >> >> For mmap() the 'addr' should be the 'sharing' stack's (base) address >> not the 'target' stack, because you want to be accessing the 'sharing' >> stack memory? We don't have any virtual memory mapping, so the address >> of the sharing stack needs to be used. Or maybe it can be NULL, or >> even ignored, since the mmap() call should return the base address of >> the 'sharing' stack? The fd should be able to find all the information >> needed about the 'sharing' stack. > > > My confusion was, as you asked above, whether we can assume that the mmap() > was called by the executing process > context. I was making the mmap() call from the 'POSIX_Init' thread and > passing the address of the target thread and then > selecting the thread inside mmap(). Can we do something like this in the > application to ensure that the mmap() is called > from the desired thread? >
I think it is a reasonable assumption, but it may not be entirely within the standard. We may need to get a "ruling" on it from Joel, but I think you should proceed in this direction. Also, I'm wondering if the stack mmap should also go in the mmap_mappings list? >> >> -Gedare _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel