From: Subrata <sub...@us...> - 2008-10-29 08:12:13
|
Update of /cvsroot/ltp/ltp/testcases/kernel/syscalls/madvise In directory ddv4jf1.ch3.sourceforge.com:/tmp/cvs-serv7626/ltp/testcases/kernel/syscalls/madvise Modified Files: madvise03.c Log Message: Fix the shared memory getting and removing in madvise03. <Bug 1>: In madvise03 case, it would apply a large size shared memory. But in some system, it was greater than the shmmax. So it would be failed. <Bug 2>: It would not remove the shared memory when it exited. Signed-off-by: Jin Bing Guo <gu...@li...>. Index: madvise03.c =================================================================== RCS file: /cvsroot/ltp/ltp/testcases/kernel/syscalls/madvise/madvise03.c,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** madvise03.c 28 Nov 2007 09:55:25 -0000 1.1 --- madvise03.c 29 Oct 2008 08:12:06 -0000 1.2 *************** *** 104,110 **** --- 104,113 ---- //#define MM_DEBUG 1 + #define BUFFER_SIZE 256 + void setup(void); void cleanup(void); void check_and_print(char *advice); + long get_shmmax(void); char *TCID = "madvise03"; /* Test program modifier */ *************** *** 113,116 **** --- 116,120 ---- int i=0; /* Loop Counters */ + static int shmid1; int main(int argc, char *argv[]) *************** *** 119,124 **** char *file=NULL; struct stat stat; - int shmid1; void *addr1; char *msg=NULL; --- 123,128 ---- char *file=NULL; struct stat stat; void *addr1; + long shm_size = 0; char *msg=NULL; *************** *** 135,139 **** tst_resm(TWARN, "This test can only run on kernels that are "); tst_resm(TWARN, "2.6.16 and higher"); ! exit(0); } --- 139,143 ---- tst_resm(TWARN, "This test can only run on kernels that are "); tst_resm(TWARN, "2.6.16 and higher"); ! tst_exit(0); } *************** *** 202,215 **** /* Allocate shared memory segment */ ! ! if ((shmid1 = shmget(IPC_PRIVATE, 1024*1024*1024, IPC_CREAT|IPC_EXCL|0701)) == -1) { ! perror("shmget"); ! exit(1); } /* Attach shared memory segment to 0x22000000 address */ if ((addr1 = shmat(shmid1, (void *)0x22000000, 0)) == (void *)-1) { ! perror("shmat"); ! exit(1); } --- 206,219 ---- /* Allocate shared memory segment */ ! shm_size = get_shmmax(); ! if ((shmid1 = shmget(IPC_PRIVATE, 1024*1024*1024>shm_size? shm_size:1024*1024*1024, IPC_CREAT|IPC_EXCL|0701)) == -1) ! { ! tst_brkm(TBROK, cleanup,"shmget error"); } /* Attach shared memory segment to 0x22000000 address */ if ((addr1 = shmat(shmid1, (void *)0x22000000, 0)) == (void *)-1) { ! tst_brkm(TBROK, cleanup, ! "shmat error"); } *************** *** 263,266 **** --- 267,275 ---- void cleanup(void) { + /* Free the shm resource. */ + if ( shmid1 != -1 ) + if ( shmctl (shmid1, IPC_RMID, 0) < 0) + perror("shmctl failed"); + /* * print timing stats if that option was specified. *************** *** 300,301 **** --- 309,338 ---- } } + /*************************************************************** + * get_shmmax() - Reads the size of share memory size + * from /proc/sys/kernel/shmmax + ***************************************************************/ + long get_shmmax(void) + { + long maxsize; + FILE* f; + int retcode=0; + char buff[BUFFER_SIZE]; + + f = fopen("/proc/sys/kernel/shmmax", "r"); + if (!f) + tst_brkm(TFAIL, cleanup, "Could not open /proc/sys/kernel/shmmax for reading"); + + while(fgets(buff,BUFFER_SIZE, f) != NULL){ + if((retcode = sscanf(buff, "%ld ", &maxsize)) == 1) + break; + } + + if (retcode != 1) { + fclose(f); + tst_brkm(TFAIL, cleanup, "Failed reading size of huge page."); + } + fclose(f); + return(maxsize); + } + |