public inbox for ltp@lists.linux.it
 help / color / mirror / Atom feed
From: Caspar Zhang <czhang@redhat.com>
To: ltp-list@lists.sourceforge.net
Cc: Caspar Zhang <czhang@redhat.com>
Subject: [LTP] [PATCH] make pid_list dynamically sized with memory
Date: Tue, 21 Dec 2010 18:12:00 +0800	[thread overview]
Message-ID: <1292926320-7079-1-git-send-email-czhang@redhat.com> (raw)
In-Reply-To: <czhang@redhat.com>

We get segfaults during testing mtest01 on a 5TB memory machine, the
problem was traced to the array pdi_list[] went to overflow and
corrupted memory. This fix makes pid_list[] dynamically sized with
correct memory size to avoid overflow.

Signed-off-by: Caspar Zhang <czhang@redhat.com>
---
 testcases/kernel/mem/mtest01/mtest01.c |   50 +++++++++++++++++++------------
 1 files changed, 31 insertions(+), 19 deletions(-)

diff --git a/testcases/kernel/mem/mtest01/mtest01.c b/testcases/kernel/mem/mtest01/mtest01.c
index e4e9a56..1362e08 100644
--- a/testcases/kernel/mem/mtest01/mtest01.c
+++ b/testcases/kernel/mem/mtest01/mtest01.c
@@ -44,6 +44,10 @@
 
 #include "test.h"
 
+#define MAX_31BIT_SIZE (unsigned long)(500*1024*1024)
+#define MAX_32BIT_SIZE (unsigned long)(1024*1024*1024)
+#define MAX_64BIT_SIZE (unsigned long long)(3*1024*1024*1024)
+
 char *TCID = "mtest01";
 int TST_TOTAL = 1;
 
@@ -62,11 +66,12 @@ int main(int argc, char* argv[]) {
   unsigned long bytecount, alloc_bytes;
   unsigned long long original_maxbytes,maxbytes=0;
   unsigned long long pre_mem, post_mem;
+  unsigned long long total_ram, total_free, D, C;
   extern char* optarg;
   int chunksize = 1024*1024; /* one meg at a time by default */
   struct sysinfo sstats;
   int i,pid_cntr;
-  pid_t pid,pid_list[1000];
+  pid_t pid,*pid_list;
   struct sigaction act;
 
   act.sa_handler = handler;
@@ -74,8 +79,18 @@ int main(int argc, char* argv[]) {
   sigemptyset(&act.sa_mask);
   sigaction(SIGRTMIN,  &act, 0);
 
-  for (i=0;i<1000;i++)
-   pid_list[i]=(pid_t)0;
+  sysinfo(&sstats);
+  total_ram=sstats.totalram;
+  total_ram=total_ram+sstats.totalswap;
+#if defined (_s390_)
+  pidlist_sz = total_ram / MAX_31BIT_SIZE + 1;
+#elif __WORDSIZE==32
+  pidlist_sz = total_ram / MAX_32BIT_SIZE + 1;
+#elif __WORDSIZE==64
+  pidlist_sz = total_ram / MAX_64BIT_SIZE + 1;
+#endif
+  pid_list = (pid_t *)malloc(sizeof(pid_t) * pidlist_sz);
+  memset(pid_list, 0, sizeof(pid_t) * pidlist_sz);
 
   while ((c=getopt(argc, argv, "c:b:p:wvh")) != EOF) {
     switch((char)c) {
@@ -115,12 +130,8 @@ int main(int argc, char* argv[]) {
 
   sysinfo(&sstats);
   if (maxpercent) {
-    unsigned long long total_ram, total_free, D, C;
     percent=(float)maxpercent/100.00;
 
-    total_ram=sstats.totalram;
-    total_ram=total_ram+sstats.totalswap;
-
     total_free=sstats.freeram;
     total_free=total_free+sstats.freeswap;
 
@@ -157,47 +168,47 @@ int main(int argc, char* argv[]) {
     pid_list[i]=pid;
 
 #if defined (_s390_) /* s390's 31bit addressing requires smaller chunks */
-  while ( (pid!=0) && (maxbytes > 500*1024*1024) )
+  while ((pid!=0) && (maxbytes > MAX_31BIT_SIZE))
   {
     i++;
-    maxbytes=maxbytes-(500*1024*1024);
+    maxbytes -= MAX_31BIT_SIZE;
     pid=fork();
     if (pid != 0)
       pid_cntr++;
       pid_list[i]=pid;
   }
-  if ( maxbytes > 500*1024*1024 )
-    alloc_bytes=500*1024*1024;
+  if (maxbytes > MAX_31BIT_SIZE)
+    alloc_bytes = MAX_31BIT_SIZE;
   else
     alloc_bytes=(unsigned long)maxbytes;
 
 #elif __WORDSIZE==32
-  while ( (pid!=0) && (maxbytes > 1024*1024*1024) )
+  while ((pid!=0) && (maxbytes > MAX_32BIT_SIZE))
   {
     i++;
-    maxbytes=maxbytes-(1024*1024*1024);
+    maxbytes -= MAX_32BIT_SIZE;
     pid=fork();
     if (pid != 0)
       pid_cntr++;
       pid_list[i]=pid;
   }
-  if ( maxbytes > 1024*1024*1024 )
-    alloc_bytes=1024*1024*1024;
+  if (maxbytes > MAX_32BIT_SIZE)
+    alloc_bytes = MAX_32BIT_SIZE;
   else
     alloc_bytes=(unsigned long)maxbytes;
 
 #elif __WORDSIZE==64
-  while ( (pid!=0) && (maxbytes > (unsigned long long)3*1024*1024*1024) )
+  while ((pid!=0) && (maxbytes > MAX_64BIT_SIZE))
   {
     i++;
-    maxbytes=maxbytes-(unsigned long long)3*1024*1024*1024;
+    maxbytes - MAX_64BIT_SIZE;
     pid=fork();
     if (pid != 0)
       pid_cntr++;
       pid_list[i]=pid;
   }
-  if ( maxbytes > (unsigned long long)3*1024*1024*1024 )
-    alloc_bytes=(unsigned long long)3*1024*1024*1024;
+  if (maxbytes > MAX_64BIT_SIZE)
+    alloc_bytes = MAX_64BIT_SIZE;
   else
     alloc_bytes=(unsigned long)maxbytes;
 #endif
@@ -258,5 +269,6 @@ int main(int argc, char* argv[]) {
     else
       tst_resm(TPASS, "%llu kbytes allocated only.", original_maxbytes/1024);
   }
+  free(pid_list);
   exit(0);
 }
-- 
1.7.3.2


------------------------------------------------------------------------------
Lotusphere 2011
Register now for Lotusphere 2011 and learn how
to connect the dots, take your collaborative environment
to the next level, and enter the era of Social Business.
http://p.sf.net/sfu/lotusphere-d2d
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

             reply	other threads:[~2010-12-21 10:12 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-12-21 10:12 Caspar Zhang [this message]
2010-12-23  7:02 ` [LTP] [PATCH] make pid_list dynamically sized with memory Caspar Zhang
2010-12-23 19:22   ` Garrett Cooper
2010-12-23 11:20 ` Hannu Heikkinen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1292926320-7079-1-git-send-email-czhang@redhat.com \
    --to=czhang@redhat.com \
    --cc=ltp-list@lists.sourceforge.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox