1f08c3bdfSopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 2f08c3bdfSopenharmony_ci/* 3f08c3bdfSopenharmony_ci * Copyright (c) International Business Machines Corp., 2007 4f08c3bdfSopenharmony_ci * Rishikesh K Rajak <risrajak@in.ibm.com> 5f08c3bdfSopenharmony_ci * Copyright (C) 2022 SUSE LLC Andrea Cervesato <andrea.cervesato@suse.com> 6f08c3bdfSopenharmony_ci */ 7f08c3bdfSopenharmony_ci 8f08c3bdfSopenharmony_ci#ifndef COMMON_H 9f08c3bdfSopenharmony_ci#define COMMON_H 10f08c3bdfSopenharmony_ci 11f08c3bdfSopenharmony_ci#include <stdlib.h> 12f08c3bdfSopenharmony_ci#include "tst_test.h" 13f08c3bdfSopenharmony_ci#include "lapi/syscalls.h" 14f08c3bdfSopenharmony_ci#include "lapi/sched.h" 15f08c3bdfSopenharmony_ci 16f08c3bdfSopenharmony_cienum { 17f08c3bdfSopenharmony_ci T_CLONE, 18f08c3bdfSopenharmony_ci T_UNSHARE, 19f08c3bdfSopenharmony_ci T_NONE, 20f08c3bdfSopenharmony_ci}; 21f08c3bdfSopenharmony_ci 22f08c3bdfSopenharmony_cistatic inline int get_clone_unshare_enum(const char *str_op) 23f08c3bdfSopenharmony_ci{ 24f08c3bdfSopenharmony_ci int use_clone; 25f08c3bdfSopenharmony_ci 26f08c3bdfSopenharmony_ci use_clone = T_NONE; 27f08c3bdfSopenharmony_ci 28f08c3bdfSopenharmony_ci if (!str_op || !strcmp(str_op, "none")) 29f08c3bdfSopenharmony_ci use_clone = T_NONE; 30f08c3bdfSopenharmony_ci else if (!strcmp(str_op, "clone")) 31f08c3bdfSopenharmony_ci use_clone = T_CLONE; 32f08c3bdfSopenharmony_ci else if (!strcmp(str_op, "unshare")) 33f08c3bdfSopenharmony_ci use_clone = T_UNSHARE; 34f08c3bdfSopenharmony_ci else 35f08c3bdfSopenharmony_ci tst_brk(TBROK, "Test execution mode <clone|unshare|none>"); 36f08c3bdfSopenharmony_ci 37f08c3bdfSopenharmony_ci return use_clone; 38f08c3bdfSopenharmony_ci} 39f08c3bdfSopenharmony_ci 40f08c3bdfSopenharmony_cistatic void clone_test(unsigned long clone_flags, void (*fn1)()) 41f08c3bdfSopenharmony_ci{ 42f08c3bdfSopenharmony_ci const struct tst_clone_args clone_args = { 43f08c3bdfSopenharmony_ci .flags = clone_flags, 44f08c3bdfSopenharmony_ci .exit_signal = SIGCHLD, 45f08c3bdfSopenharmony_ci }; 46f08c3bdfSopenharmony_ci int pid; 47f08c3bdfSopenharmony_ci 48f08c3bdfSopenharmony_ci pid = SAFE_CLONE(&clone_args); 49f08c3bdfSopenharmony_ci if (!pid) { 50f08c3bdfSopenharmony_ci fn1(); 51f08c3bdfSopenharmony_ci exit(0); 52f08c3bdfSopenharmony_ci } 53f08c3bdfSopenharmony_ci} 54f08c3bdfSopenharmony_ci 55f08c3bdfSopenharmony_cistatic void unshare_test(unsigned long clone_flags, void (*fn1)()) 56f08c3bdfSopenharmony_ci{ 57f08c3bdfSopenharmony_ci int pid; 58f08c3bdfSopenharmony_ci 59f08c3bdfSopenharmony_ci pid = SAFE_FORK(); 60f08c3bdfSopenharmony_ci if (!pid) { 61f08c3bdfSopenharmony_ci SAFE_UNSHARE(clone_flags); 62f08c3bdfSopenharmony_ci 63f08c3bdfSopenharmony_ci fn1(); 64f08c3bdfSopenharmony_ci exit(0); 65f08c3bdfSopenharmony_ci } 66f08c3bdfSopenharmony_ci} 67f08c3bdfSopenharmony_ci 68f08c3bdfSopenharmony_cistatic void plain_test(void (*fn1)()) 69f08c3bdfSopenharmony_ci{ 70f08c3bdfSopenharmony_ci int pid; 71f08c3bdfSopenharmony_ci 72f08c3bdfSopenharmony_ci pid = SAFE_FORK(); 73f08c3bdfSopenharmony_ci if (!pid) { 74f08c3bdfSopenharmony_ci fn1(); 75f08c3bdfSopenharmony_ci exit(0); 76f08c3bdfSopenharmony_ci } 77f08c3bdfSopenharmony_ci} 78f08c3bdfSopenharmony_ci 79f08c3bdfSopenharmony_cistatic void clone_unshare_test(int use_clone, unsigned long clone_flags, void (*fn1)()) 80f08c3bdfSopenharmony_ci{ 81f08c3bdfSopenharmony_ci switch (use_clone) { 82f08c3bdfSopenharmony_ci case T_NONE: 83f08c3bdfSopenharmony_ci plain_test(fn1); 84f08c3bdfSopenharmony_ci break; 85f08c3bdfSopenharmony_ci case T_CLONE: 86f08c3bdfSopenharmony_ci clone_test(clone_flags, fn1); 87f08c3bdfSopenharmony_ci break; 88f08c3bdfSopenharmony_ci case T_UNSHARE: 89f08c3bdfSopenharmony_ci unshare_test(clone_flags, fn1); 90f08c3bdfSopenharmony_ci break; 91f08c3bdfSopenharmony_ci default: 92f08c3bdfSopenharmony_ci tst_brk(TBROK, "%s: bad use_clone option: %d", __FUNCTION__, use_clone); 93f08c3bdfSopenharmony_ci break; 94f08c3bdfSopenharmony_ci } 95f08c3bdfSopenharmony_ci} 96f08c3bdfSopenharmony_ci 97f08c3bdfSopenharmony_ci#endif 98