From: DAN LI <li...@cn...> - 2013-05-24 05:21:18
|
On 05/23/2013 09:01 PM, Jan Stancek wrote: > > > ----- Original Message ----- >> From: "DAN LI" <li...@cn...> >> To: "LTP list" <ltp...@li...> >> Sent: Thursday, 23 May, 2013 10:39:28 AM >> Subject: [LTP] [PATCH 2/2] shmctl/shmctl01.c: Test features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK. >> >> >> Additional tests for features IPC_INFO, SHM_STAT, SHM_LOCK and SHM_UNLOCK. >> >> >> Signed-off-by: DAN LI <li...@cn...> > > Hi, > > 1/2 cleanup looks OK to me, comments for 2/2 are inline. > >> --- >> testcases/kernel/syscalls/ipc/shmctl/shmctl01.c | 83 >> ++++++++++++++++++++++--- >> 1 file changed, 75 insertions(+), 8 deletions(-) >> >> diff --git a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c >> b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c >> index 34ff30c..c0f2c81 100644 >> --- a/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c >> +++ b/testcases/kernel/syscalls/ipc/shmctl/shmctl01.c >> @@ -43,13 +43,18 @@ >> * call cleanup >> */ >> >> +#ifndef _GNU_SOURCE >> +#define _GNU_SOURCE >> +#endif >> #include "ipcshm.h" >> #include "libtestsuite.h" >> >> char *TCID = "shmctl01"; >> >> static int shm_id_1 = -1; >> +static int shm_index; >> static struct shmid_ds buf; >> +static struct shminfo info; >> static long save_time; >> >> #define FIRST 0 >> @@ -64,12 +69,24 @@ static pid_t pid_arr[N_ATTACH]; >> static int sync_pipes[2]; >> >> /* Setup, cleanup and check routines for IPC_STAT */ >> -static void stat_setup(void), func_stat(void); >> +static void stat_setup(void), func_istat(void); >> static void stat_cleanup(void); >> >> /* Setup and check routines for IPC_SET */ >> static void set_setup(void), func_set(void); >> >> +/* Check routine for IPC_INFO */ >> +static void func_info(void); >> + >> +/* Check routine for SHM_STAT */ >> +static void func_sstat(void); >> + >> +/* Check routine for SHM_LOCK */ >> +static void func_lock(void); >> + >> +/* Check routine for SHM_UNLOCK */ >> +static void func_unlock(void); >> + >> /* Check routine for IPC_RMID */ >> static void func_rmid(void); >> >> @@ -77,21 +94,27 @@ static void func_rmid(void); >> static void do_child(void); >> >> static struct test_case_t { >> + int *shmid; >> int cmd; >> + struct shmid_ds *arg; >> void (*func_test) (); >> void (*func_setup) (); >> } TC[] = { >> - {IPC_STAT, func_stat, stat_setup}, >> + {&shm_id_1, IPC_STAT, &buf, func_istat, stat_setup}, >> #ifndef UCLINUX >> /* >> * The second test is not applicable to uClinux; >> * shared memory segments are detached on exec(), >> * so cannot be passed to uClinux children. >> */ >> - {IPC_STAT, func_stat, stat_setup}, >> + {&shm_id_1, IPC_STAT, &buf, func_istat, stat_setup}, >> #endif >> - {IPC_SET, func_set, set_setup}, >> - {IPC_RMID, func_rmid, NULL}, >> + {&shm_id_1, IPC_SET, &buf, func_set, set_setup}, >> + {&shm_id_1, IPC_INFO, (struct shmid_ds *) &info, func_info, NULL}, >> + {&shm_index, SHM_STAT, &buf, func_sstat, NULL}, >> + {&shm_id_1, SHM_LOCK, &buf, func_lock, NULL}, >> + {&shm_id_1, SHM_UNLOCK, &buf, func_unlock, NULL}, >> + {&shm_id_1, IPC_RMID, &buf, func_rmid, NULL}, >> }; > > Are last 3 cases actually using buf? Actually, not used... Passing NULL to shmctl is just ok. > >> >> static int TST_TOTAL = ARRAY_SIZE(TC); >> @@ -146,7 +169,7 @@ int main(int argc, char *argv[]) >> if (TC[i].func_setup != NULL) >> (*TC[i].func_setup) (); >> >> - TEST(shmctl(shm_id_1, TC[i].cmd, &buf)); >> + TEST(shmctl(*(TC[i].shmid), TC[i].cmd, TC[i].arg)); >> >> if (TEST_RETURN == -1) { >> tst_resm(TFAIL, "%s call failed - errno " >> @@ -294,11 +317,11 @@ void do_child(void) >> } >> >> /* >> - * func_stat() - check the functionality of the IPC_STAT command with >> shmctl() >> + * func_istat() - check the functionality of the IPC_STAT command with >> shmctl() >> * by looking at the pid of the creator, the segement size, >> * the number of attaches and the mode. >> */ >> -void func_stat(void) >> +void func_istat(void) >> { >> int fail = 0; >> pid_t pid; >> @@ -419,6 +442,50 @@ void func_set(void) >> tst_resm(TPASS, "new mode and change time are correct"); >> } >> >> + >> +static void func_info(void) >> +{ >> + if (info.shmmin != 1) >> + tst_resm(TFAIL, "value of shmmin is incorrect"); >> + else >> + tst_resm(TPASS, "get correct shared memory limits"); >> +} >> + >> +static void func_sstat(void) >> +{ >> + if (buf.shm_segsz != SHM_SIZE) > > I think this will work only if there are no shared memory segments before > test starts. Because shm_index == 0, this will check first one: You are right. I will get the functionality test of SHM_STAT to check if shmctl returns correct shared memory id. > > # ipcs -m > ------ Shared Memory Segments -------- > key shmid owner perms bytes nattch status > 0xffffffff 134971392 root 600 4 0 > > # ./shmctl01 > shmctl01 1 TPASS : pid, size, # of attaches and mode are correct - pass #1 > shmctl01 2 TPASS : pid, size, # of attaches and mode are correct - pass #2 > shmctl01 3 TPASS : new mode and change time are correct > shmctl01 4 TPASS : get correct shared memory limits > shmctl01 5 TFAIL : segment size is incorrect > shmctl01 6 TPASS : SHM_LOCK is setted > shmctl01 7 TPASS : SHM_LOCK is cleared > shmctl01 8 TPASS : shared memory appears to be removed > >> + tst_resm(TFAIL, "segment size is incorrect"); >> + else >> + tst_resm(TPASS, "size of attache is correct"); >> +} >> + >> +static void func_lock(void) >> +{ >> + if (shmctl(shm_id_1, IPC_STAT, &buf) == -1) { >> + tst_resm(TBROK, "stat failed in func_lock()"); >> + return; >> + } >> + >> + if (buf.shm_perm.mode & SHM_LOCKED) >> + tst_resm(TPASS, "SHM_LOCK is setted"); > > Just "set", I suggest: SHM_LOCKED flag is set/cleared > Ok. Thank you for reviewing. :) Regards, DAN LI > Regards, > Jan > >> + else >> + tst_resm(TFAIL, "SHM_LOCK is not setted"); >> +} >> + >> +static void func_unlock(void) >> +{ >> + if (shmctl(shm_id_1, IPC_STAT, &buf) == -1) { >> + tst_resm(TBROK, "stat failed in func_unlock()"); >> + return; >> + } >> + >> + if (buf.shm_perm.mode & SHM_LOCKED) >> + tst_resm(TFAIL, "SHM_LOCK is not cleared"); >> + else >> + tst_resm(TPASS, "SHM_LOCK is cleared"); >> +} >> + >> + >> /* >> * func_rmid() - check the functionality of the IPC_RMID command with >> shmctl() >> */ >> -- >> 1.8.1 >> >> ------------------------------------------------------------------------------ >> Try New Relic Now & We'll Send You this Cool Shirt >> New Relic is the only SaaS-based application performance monitoring service >> that delivers powerful full stack analytics. Optimize and monitor your >> browser, app, & servers with just a few lines of code. Try New Relic >> and get this awesome Nerd Life shirt! http://p.sf.net/sfu/newrelic_d2d_may >> _______________________________________________ >> Ltp-list mailing list >> Ltp...@li... >> https://lists.sourceforge.net/lists/listinfo/ltp-list >> > |