Here is a patch which I had, sometime back. It is on an older version of LTP.

Cheers

Suzuki


, Suzuki Poulose wrote:
, renxiu liang wrote:
On Sun, 2010-09-19 at 12:06 +0530, Suzuki Poulose wrote:
Hello Renxiu,

Sorry for the late reply. Could you please resend the patch ? I don't
find the patch in the e-mail.

Hi Suzuki

attached failure logs on different archs and patch for you.

I don't understand why there should be ACCERR. The mmap is done with
PROT_WRIT|PROT_READ. Could we get more info on which condition triggers
this ?

You may use GDB to break for the ACCERR case and take a look at the
instruction which triggers this.

Coming back to your patch :

I think we should ensure the si_addr is within the map. (map_address,
map_address+mapsize-1) ? We should not let the other SIGSEGVs go through.

It may be like :

case SIGSEGV:
if ((si_addr >= map_address) &&
(si_addr < (map_address + map_size) ) {
...
..
}


Thanks

Suzuki





thanks for help review this.

BR
Renxiu
Thanks

Suzuki
, renxiu liang wrote:
On Wed, 2010-09-01 at 00:27 -0700, Garrett Cooper wrote:
On Wed, Sep 1, 2010 at 12:26 AM, Garrett Cooper<yaneg...@gmail.com>
wrote:
On Mon, Aug 30, 2010 at 6:51 PM, renxiu liang
<renxiu.li...@windriver.com> wrote:
On Wed, 2010-08-25 at 20:36 -0700, Garrett Cooper wrote:
On Wed, Aug 18, 2010 at 12:33 AM, renxiu liang
<renxiu.li...@windriver.com> wrote:
Hi,

We met the mtest06 failure several times; this is because in
mtest06/mmap1.c, when handling the signal 11 in sig_handler, it
doesn't
cover another two race conditions:
one is si_code equals "SEGV_MAPERR" but si_address does not
equal to
map_address; and one is si_code equals to "SEGV_ACCERR";

see below error log:

<<<test_start>>>
tag=mtest06 stime=1270902396
cmdline=" mmap1 -x 0.05"
contacts=""
analysis=exit
initiation_status="ok"
<<<test_output>>>
mmap1 0 INFO : pid[5456]: map, change contents, unmap files
1000 times
mmap1 0 INFO : created thread[1216369840]
mmap1 0 INFO : pid[5456] - read contents of memory 0x48002000
1000 times
mmap1 0 INFO : page fault occurred at 0x48002000
mmap1 0 INFO : page fault occurred at 0x48002000
mmap1 0 INFO : page fault occurred at 0x48002000
mmap1 0 INFO : page fault occurred at 0x48002000
......
mmap1 0 INFO : page fault occurred at 0x48002000
mmap1 0 INFO : page fault occurred at 0x48002000
caught unexpected signal - 11 --- exiting
<<<execution_status>>>
duration=1 termination_type=exited termination_id=255 corefile=no
cutime=0 cstime=4
<<<test_end>>>

I made a patch to cover all the three race conditions in one
case in
sig_handler(),
then run mtest06 repeatedly on different archs, test will not
fail by
catching signal 11.

Could you print out what the value of info->si_code and
info->si_addr
are at the time of the fault? Also, which architecture(s) are you
running into this issue on?
Hi Garrett,

Sorry for the late reply; See attached mtest06 logs, I printed
out the
values of si_code, si_addr, map_address;
it is reproducible on arm, x86, ppc and mips; though it is not
reproducible every time, but can be reproducible if run the case
repeatedly.

Nothing is jumping out at me as being incorrect, so I think it's best
that I bring in a better pair of eyes, just in case.

Suzuki-san,
Could you please help review this patch?

Hi Garrett,
No reply from Suzuki-san after almost three weeks; I'm afraid
Suzuki-san
didn't catch the mail, could you find someone else to review the patch?
thanks!

BR,
Renxiu

CCing Suzuki-san...
-Garrett





diff -Naur ltp-full-20091231.orig/testcases/kernel/mem/mtest06/mmap1.c 
ltp-full-20091231/testcases/kernel/mem/mtest06/mmap1.c
--- ltp-full-20091231.orig/testcases/kernel/mem/mtest06/mmap1.c 2009-10-13 
19:30:46.000000000 +0530
+++ ltp-full-20091231/testcases/kernel/mem/mtest06/mmap1.c      2010-03-15 
16:30:33.000000000 +0530
@@ -138,6 +138,7 @@
 int       verbose_print = FALSE;/* when called with -v print more info       */
 caddr_t    *map_address;       /* address of the file mapped.                */
 sigjmp_buf jmpbuf;             /* argument to sigsetjmp and siglongjmp       */
+long      map_len;
 
 char *TCID = "mmap1";
 int TST_TOTAL = 1;
@@ -168,14 +169,22 @@
              _exit(0);
 
         case SIGSEGV:
-             if (info->si_code == SEGV_MAPERR &&
-                      info->si_addr == map_address)
+             if ( info->si_addr == map_address ||
+                (map_address && (info->si_addr >= (void*) map_address &&
+                                info->si_addr < (void *)((long)map_address + 
map_len))
+                 )
+               )
              {
                   tst_resm(TINFO,
                     "page fault occurred at %p",
                     map_address);
                   longjmp(jmpbuf, 1);
-             }
+             } else {
+                 fprintf(stderr, "caught SIGSEGV at %p while mmap is (%p,%p) - 
 exiting\n",
+                               info->si_addr, map_address, 
(void*)((long)map_address + map_len));
+                 _exit(-1);
+            }
+               
         default:
             fprintf(stderr, "caught unexpected signal - %d --- exiting\n",
                      signal);
@@ -293,6 +302,9 @@
                       (long *)args;
     long exit_val = 0;  /* exit value of the pthread                 */
 
+    /* The size of the map */
+    map_len = mwuargs[1];
+
     tst_resm(TINFO, "pid[%d]: map, change contents, unmap files %d times",
                getpid(), (int)mwuargs[2]);
     if (verbose_print)
------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances
and start using them to simplify application deployment and
accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

Reply via email to