15f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis/* 25f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * Copyright (C) 2015 Cyril Hrubis <chrubis@suse.cz> 35f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * 45f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * Licensed under the GNU GPLv2 or later. 55f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * This program is free software; you can redistribute it and/or modify 65f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * it under the terms of the GNU General Public License as published by 75f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * the Free Software Foundation; either version 2 of the License, or 85f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * (at your option) any later version. 95f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * 105f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * This program is distributed in the hope that it will be useful, 115f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 125f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 135f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * the GNU General Public License for more details. 145f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * 155f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * You should have received a copy of the GNU General Public License 165f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * along with this program; if not, write to the Free Software 175f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 185f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis */ 195f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 2058df142411d7c1ba8ac9c8b9e88f008123c36bbcCyril Hrubis#define TRESHOLD_US 100000 215f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 225f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubisstatic void verify_futex_wait_bitset(long long wait_us, clock_t clk_id) 235f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis{ 245f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis struct timespec start, to, end; 255f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis futex_t futex = FUTEX_INITIALIZER; 265f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis u_int32_t bitset = 0xffffffff; 275f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis int flags = clk_id == CLOCK_REALTIME ? FUTEX_CLOCK_REALTIME : 0; 285f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 295f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_resm(TINFO, "testing futex_wait_bitset() timeout with %s", 305f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis clk_id == CLOCK_REALTIME ? "CLOCK_REALTIME" : "CLOCK_MONOTONIC"); 315f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 325f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis clock_gettime(clk_id, &start); 335f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis to = tst_timespec_add_us(start, wait_us); 345f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 355f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis TEST(futex_wait_bitset(&futex, futex, &to, bitset, flags)); 365f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 375f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis clock_gettime(clk_id, &end); 385f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 395f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis if (TEST_RETURN != -1) { 405f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_resm(TFAIL, "futex_wait_bitset() returned %li, expected -1", 415f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis TEST_RETURN); 425f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis return; 435f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis } 445f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 45e7e4279c8eb6c9689485ca4adf5834930a76ff78Xiaoguang Wang if (TEST_ERRNO == ENOSYS) { 46e7e4279c8eb6c9689485ca4adf5834930a76ff78Xiaoguang Wang tst_resm(TCONF, "In this kernel, futex() does not support " 47e7e4279c8eb6c9689485ca4adf5834930a76ff78Xiaoguang Wang "FUTEX_WAIT_BITSET operation"); 48e7e4279c8eb6c9689485ca4adf5834930a76ff78Xiaoguang Wang return; 49e7e4279c8eb6c9689485ca4adf5834930a76ff78Xiaoguang Wang } 50e7e4279c8eb6c9689485ca4adf5834930a76ff78Xiaoguang Wang 515f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis if (TEST_ERRNO != ETIMEDOUT) { 525f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_resm(TFAIL | TTERRNO, "expected %s", 535f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_strerrno(ETIMEDOUT)); 545f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis return; 555f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis } 565f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 575f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis if (tst_timespec_lt(end, to)) { 585f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_resm(TFAIL, 595f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis "futex_wait_bitset() woken up prematurely %llius, expected %llius", 605f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_timespec_diff_us(end, start), wait_us); 615f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis return; 625f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis } 635f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 645f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis if (tst_timespec_diff_us(end, to) > TRESHOLD_US) { 655f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_resm(TFAIL, 665f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis "futex_wait_bitset() waited too long %llius, expected %llius", 675f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_timespec_diff_us(end, start), wait_us); 685f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis return; 695f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis } 705f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis 715f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_resm(TPASS, "futex_wait_bitset() waited %llius, expected %llius", 725f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis tst_timespec_diff_us(end, start), wait_us); 735f4378da2dddfbd51a80648e2ab70bd86b30da9eCyril Hrubis} 74