[LTP] [PATCH 4/4] ipc/semget05: Convert into new api
Li Wang
liwang@redhat.com
Thu Apr 13 11:46:38 CEST 2023
Hi Xu,
Patch generally looks good, but I can't apply it to
main tree because of some code conflicting.
Can you help check the patch and resend another version?
On Mon, Mar 20, 2023 at 2:31 PM Yang Xu <xuyang2018.jy@fujitsu.com> wrote:
> Use the same logic as shmget03 and msget02 to trigger ENOSPC error.
>
> Signed-off-by: Yang Xu <xuyang2018.jy@fujitsu.com>
> ---
> testcases/kernel/syscalls/ipc/semget/Makefile | 5 +-
> .../kernel/syscalls/ipc/semget/semget05.c | 187 ++++++------------
> 2 files changed, 59 insertions(+), 133 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/ipc/semget/Makefile
> b/testcases/kernel/syscalls/ipc/semget/Makefile
> index 2f98c36ca..b1201281d 100644
> --- a/testcases/kernel/syscalls/ipc/semget/Makefile
> +++ b/testcases/kernel/syscalls/ipc/semget/Makefile
> @@ -3,11 +3,10 @@
>
> top_srcdir ?= ../../../../..
>
> -LTPLIBS = ltpipc ltpnewipc
> +LTPLIBS = ltpnewipc
>
> include $(top_srcdir)/include/mk/testcases.mk
>
> -semget01 semget02: LTPLDLIBS = -lltpnewipc
> -semget05: LTPLDLIBS = -lltpipc
> +LTPLDLIBS = -lltpnewipc
>
> include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/syscalls/ipc/semget/semget05.c
> b/testcases/kernel/syscalls/ipc/semget/semget05.c
> index f801cb8ed..38b0fad3c 100644
> --- a/testcases/kernel/syscalls/ipc/semget/semget05.c
> +++ b/testcases/kernel/syscalls/ipc/semget/semget05.c
> @@ -1,152 +1,79 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> /*
> - *
> - * Copyright (c) International Business Machines Corp., 2001
> - *
> - * This program is free software; you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License as published by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
> - * the GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program; if not, write to the Free Software
> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
> 02110-1301 USA
> + * Copyright (c) International Business Machines Corp., 2001
> */
>
> -/*
> - * NAME
> - * semget05.c
> +/*\
> + * [Description]
> *
> - * DESCRIPTION
> - * semget05 - test for ENOSPC error
> + * Test for ENOSPC error.
> *
> - * ALGORITHM
> - * create semaphore sets in a loop until the system limit is reached
> - * loop if that option was specified
> - * attempt to create yet another semaphore set
> - * check the errno value
> - * issue a PASS message if we get ENOSPC
> - * otherwise, the tests fails
> - * issue a FAIL message
> - * call cleanup
> - *
> - * USAGE: <for command-line>
> - * HISTORY
> - * 03/2001 - Written by Wayne Boyer
> - * 07/2006 - Changes By Michael Reed
> - * - Changed the value of MAXIDS for the specific machine
> by reading
> - * the system limit for SEMMNI - The maximum number of
> sempahore sets
> - * 03/2008 - Matthieu Fertré (mfertre@irisa.fr)
> - * - Fix concurrency issue. Create private semaphores to
> - * avoid conflict with concurrent processes.
> - *
> - * RESTRICTIONS
> - * none
> + * ENOSPC - a semaphore set exceed the maximum number of semaphore
> sets(SEMMNI)
> */
>
> -#include "ipcsem.h"
> -
> -char *TCID = "semget05";
> -int TST_TOTAL = 1;
> -
> -/*
> - * The MAXIDS value is somewhat arbitrary and may need to be increased
> - * depending on the system being tested.
> - */
> -
> -int MAXIDS = 2048;
> -
> -int *sem_id_arr = NULL;
> -int num_sems = 0; /* count the semaphores created */
> -
> -int main(int ac, char **av)
> +#include <stdio.h>
> +#include <stdlib.h>
> +#include <unistd.h>
> +#include <sys/types.h>
> +#include <sys/ipc.h>
> +#include "lapi/sem.h"
> +#include "tst_test.h"
> +#include "libnewipc.h"
> +#include "tst_safe_sysv_ipc.h"
> +
> +static int *sem_id_arr;
> +static int maxsems, array_cnt, used_cnt;
> +static key_t semkey;
> +
> +static void verify_semget(void)
> {
> - int lc;
> - FILE *fp;
> -
> - tst_parse_opts(ac, av, NULL, NULL);
> -
> - /* Set the MAXIDS for the specific machine by reading the system
> limit
> - * for SEMMNI - The maximum number of sempahore sets
> - */
> - fp = fopen("/proc/sys/kernel/sem", "r");
> - if (fp != NULL) {
> - int getmaxid;
> - if (fscanf(fp, "%*d %*d %*d %d", &getmaxid) == 1)
> - MAXIDS = getmaxid + 1;
> - fclose(fp);
> - }
> -
> - sem_id_arr = malloc(sizeof(int) * MAXIDS);
> - if (sem_id_arr == NULL)
> - tst_brkm(TBROK, cleanup, "malloc failed");
> -
> - setup();
> -
> - for (lc = 0; TEST_LOOPING(lc); lc++) {
> - tst_count = 0;
> -
> -
> - TEST(semget(IPC_PRIVATE, PSEMS, IPC_CREAT | IPC_EXCL |
> SEM_RA));
> - if (TEST_RETURN != -1) {
> - tst_resm(TFAIL, "call succeeded when error
> expected");
> - continue;
> - }
> -
> - switch (TEST_ERRNO) {
> - case ENOSPC:
> - tst_resm(TPASS, "expected failure - errno "
> - "= %d : %s", TEST_ERRNO,
> strerror(TEST_ERRNO));
> - break;
> - default:
> - tst_resm(TFAIL, "unexpected error - %d : %s",
> - TEST_ERRNO, strerror(TEST_ERRNO));
> - break;
> - }
> - }
> -
> - cleanup();
> -
> - tst_exit();
> + TST_EXP_FAIL2(semget(semkey + maxsems, PSEMS, IPC_CREAT | IPC_EXCL
> | SEM_RA),
> + ENOSPC, "semget(%i, %i, %i)", semkey + maxsems, PSEMS,
> + IPC_CREAT | IPC_EXCL | SEM_RA);
> }
>
> -void setup(void)
> +static void setup(void)
> {
> - int sem_q;
> -
> - tst_sig(NOFORK, DEF_HANDLER, cleanup);
> + int res, num;
>
> - TEST_PAUSE;
> + semkey = GETIPCKEY();
> + used_cnt = GET_USED_ARRAYS();
> + tst_res(TINFO, "Current environment %d semaphore arrays are
> already in use",
> + used_cnt);
> + SAFE_FILE_SCANF("/proc/sys/kernel/sem", "%*d %*d %*d %d",
> &maxsems);
>
> - tst_tmpdir();
> -
> - while ((sem_q = semget(IPC_PRIVATE, PSEMS, IPC_CREAT | IPC_EXCL))
> != -1) {
> - sem_id_arr[num_sems++] = sem_q;
> - if (num_sems == MAXIDS) {
> - tst_brkm(TBROK, cleanup, "The maximum number of "
> - "semaphore ID's has been\n\t reached.
> Please "
> - "increase the MAXIDS value in the test.");
> - }
> - }
> + sem_id_arr = SAFE_MALLOC((maxsems - used_cnt) * sizeof(int));
> + for (num = 0; num < maxsems - used_cnt; num++) {
> + res = semget(semkey + num, PSEMS, IPC_CREAT | IPC_EXCL |
> SEM_RA);
> + if (res == -1)
> + tst_brk(TBROK | TERRNO, "semget failed
> unexpectedly");
>
> - if (errno != ENOSPC) {
> - tst_brkm(TBROK, cleanup, "Didn't get ENOSPC in test setup"
> - " - errno = %d : %s", errno, strerror(errno));
> + sem_id_arr[array_cnt++] = res;
> }
> + tst_res(TINFO, "The maximum number of semaphore arrays (%d) has
> been reached",
> + maxsems);
> }
>
> -void cleanup(void)
> +static void cleanup(void)
> {
> - int i;
> + int num;
>
> - for (i = 0; i < num_sems; i++) {
> - rm_sema(sem_id_arr[i]);
> - }
> + if (!sem_id_arr)
> + return;
> +
> + for (num = 0; num < array_cnt; num++)
> + SAFE_SEMCTL(sem_id_arr[num], PSEMS, IPC_RMID);
>
> free(sem_id_arr);
> - tst_rmdir();
> }
> +
> +static struct tst_test test = {
> + .needs_tmpdir = 1,
> + .setup = setup,
> + .cleanup = cleanup,
> + .test_all = verify_semget,
> + .save_restore = (const struct tst_path_val[]){
> + {"/proc/sys/kernel/sem", NULL, TST_SR_TCONF},
> + {}
> + }
> +};
> --
> 2.39.1
>
>
> --
> Mailing list info: https://lists.linux.it/listinfo/ltp
>
--
Regards,
Li Wang
More information about the ltp
mailing list