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