Description:
Shmat1.c(testcases/kernel/mem/mtest06) is a test case which tries to
create 3 threads during its execution. One thread allocates shared
memory, second writes to the shared memory and the third reads from the
shared memory. All the 3 threads are synchronized using a global
variable. In case of signal (sigsegv) sighandler will be called. The
current test case implementation is complete only for x86 arc and is not
valid for other archs.
We have noticed various issues while executing this test case. Test
case issues can be summarized as
1. signals are masked once the signal handler is called
2. comparison signal_context->edi == map address is dubious
leading to test case failures under x86 architecture
Solution:
Issue 1:
This is due to calling siglongjmp() with in the signal handler. Once
the signal handler is called all the signals will be masked. It wont be
set back to the original value unless sigsetjmp() is called with a non
zero second parameter. This was not happening earlier leading to
segmentation faults while executing the tests.
Issue 2: In the x86 architecture source and destination index with in
the ES or DS segments are stored in esi and edi registers. While the
shared memory address is being written to edi will have the map_address,
returned by shmget, while when the data is read from map_address: will
be contained in esi register. So it is inappropriate to just compare
map_address to edi register.
Even after fixing these 2 issues I still see the test case failing some
time with messages like: process exited with errors -1 etc
I wanted to know whether we should keep this test case in LTP suite or
if there is a better way to fix the issues?
Whether comparing signal_context->edi (or esi) == map_address is it the
right thing to do?
Attaching the patch to fix the issue
Thanks
Yeehaw
--- shmat1_orig.c 2009-02-11 05:18:25.000000000 -0600
+++ shmat1.c 2009-02-11 05:48:41.000000000 -0600
@@ -179,11 +179,19 @@ sig_handler(int signal, /* signal numbe
"page fault at [%#lx] - ignore\n", scp->edi);
siglongjmp(jmpbuf, 1);
}
+ else if (scp->esi == (int)map_address )
+ {
+ fprintf(stdout,
+ "page fault at [%#lx] - ignore\n", scp->esi);
+ siglongjmp(jmpbuf, 1);
+ }
else
{
- fprintf(stderr, "address at which sigfault occured: [%#lx]\n"
- "address at which memory was shmat: [%p]\n",
- scp->edi, map_address);
+ fprintf(stderr, "address at which sigfault occured: [%lx]\n"
+ "address at which sigfault occured: [%lx]\n"
+ "address at which memory was shmat: [%p]\n",
+ (unsigned long)scp->edi,(unsigned long) scp->esi,
+ map_address);
fprintf(stderr, "bad page fault exit test\n");
exit (-1);
}
@@ -362,7 +370,7 @@ write_to_mem(void *args)
while(!done_shmat)
usleep(0);
- if (sigsetjmp(jmpbuf,0) == 1)
+ if (sigsetjmp(jmpbuf,1) == 1)
{
fprintf(stdout,
"page fault ocurred due a write after an shmdt from [%p]\n",
@@ -408,7 +416,7 @@ read_from_mem(void *args)
fprintf(stdout,
"%s[%#lx]: read_from_mem(): memory address: [%p]\n",
STR_READER, pthread_self(), map_address);
- if (sigsetjmp(jmpbuf,0) == 1)
+ if (sigsetjmp(jmpbuf,1) == 1)
{
fprintf(stdout,
"page fault ocurred due a read after an shmdt from %p\n",
------------------------------------------------------------------------------
Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM)
software. With Adobe AIR, Ajax developers can use existing skills and code to
build responsive, highly engaging applications that combine the power of local
resources and data with the reach of the web. Download the Adobe AIR SDK and
Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list