----- Original Message -----
> Hi!
> > +#if __i386__ || __x86_64__
> > +#define HUGE_SIZE (2 * 1024 * 1024)
> > +
> > +#elif __powerpc__ || __powerpc64__
> > +#define HUGE_SIZE (16 * 1024 * 1024)
> > +
> > +#elif __s390__ || __s390x__
> > +#define HUGE_SIZE (1 * 1024 * 1024)
> > +
> > +#else
> > +#define HUGE_SIZE (2 * 1024 * 1024)
> > +#endif
>
> Can we use Hugepagesize from /proc/meminfo instead?
Ok, a new function
static int read_hugepagesize(void)
will be added.
>
> > +#define PATH_NR_HUGEPAGES "/proc/sys/vm/nr_hugepages"
> > +
> > +const char *TCID = "futex_wake04";
> > +const int TST_TOTAL = 1;
> > +
> > +static futex_t *futex1, *futex2;
> > +
> > +static long th2_wait_time;
> > +static int th2_wait_done;
> > +
> > +static long orig_hugepages;
> > +
> > +static void setup(void)
> > +{
> > + tst_require_root(NULL);
> > + tst_tmpdir();
> > +
> > + SAFE_FILE_SCANF(NULL, PATH_NR_HUGEPAGES, "%ld", &orig_hugepages);
> > + SAFE_FILE_PRINTF(NULL, PATH_NR_HUGEPAGES, "%d", 1);
> > +
> > + TEST_PAUSE;
> > +}
> > +
> > +static void cleanup(void)
> > +{
> > + SAFE_FILE_PRINTF(NULL, PATH_NR_HUGEPAGES, "%ld", orig_hugepages);
> > +
> > + tst_rmdir();
> > +}
> > +
> > +static void *wait_thread1(void *arg LTP_ATTRIBUTE_UNUSED)
> > +{
> > + futex_wait(futex1, *futex1, NULL, 0);
> > +
> > + return NULL;
> > +}
> > +
> > +static void *wait_thread2(void *arg LTP_ATTRIBUTE_UNUSED)
> > +{
> > + struct timeval tv;
> > +
> > + gettimeofday(&tv, NULL);
> > + th2_wait_time = tv.tv_sec;
> > + futex_wait(futex2, *futex2, NULL, 0);
>
> Eh, futex_wait can have timeout parameter. Why don't you set the timeout
> here and fail the test if the futex timeouted? That would be the
> simplest solution.
Good point! the new achieve would be like:
static struct timespec to = {.tv_sec = 30, .tv_nsec = 0};
static void *wait_thread2(void *arg LTP_ATTRIBUTE_UNUSED)
{
int res;
res = futex_wait(futex2, *futex2, &to, 0);
if (!res) {
tst_resm(TPASS, "Hi hydra, thread2 awake!");
return NULL;
} else {
tst_resm(TFAIL, "Bug: wait_thread2 did not wake after 30
secs.");
return NULL;
}
}
>
> > + th2_wait_done = 1;
> > + tst_resm(TPASS, "Hi hydra, thread2 awake!");
> > +
> > + return NULL;
> > +}
> > +
> > +static void wakeup_thread2(void)
> > +{
> > + void *addr;
> > + int pgsz, wait_max_time = 30;
> > + pthread_t th1, th2;
> > + struct timeval tv;
> > +
> > + /*allocate some shared memory*/
> > + addr = mmap(NULL,
> > + HUGE_SIZE,
> > + PROT_READ | PROT_WRITE,
> > + MAP_SHARED | MAP_ANONYMOUS | MAP_HUGETLB,
> > + -1,
> > + 0);
> > + if (addr == MAP_FAILED) {
> > + printf("errno=%d\n", errno);
> > + perror("mmap");
> > + if (errno == ENOMEM) {
> > + tst_brkm(TBROK | TERRNO, NULL,
> > + "Probably system didn't actually create any
> > huge pages.");
> > + }
> > + }
> > +
> > + pgsz = getpagesize();
> > +
> > + /*apply the first subpage to futex1*/
> > + futex1 = addr;
> > + *futex1 = 0;
> > + /*apply the second subpage to futex2*/
> > + futex2 = (futex_t *)((char *)addr + pgsz);
> > + *futex2 = 0;
> > +
> > + /*thread1 block on futex1 first,then thread2 block on futex2*/
> > + pthread_create(&th1, NULL, wait_thread1, NULL);
> > + sleep(2);
> > + pthread_create(&th2, NULL, wait_thread2, NULL);
> > + sleep(2);
>
> No sleeps in testcases, you have to use proper synchronization
> primitives.
proper synchronization primitives ??
I haven't used that. Could you show me a simple demo?
>
> If you need to run the test in several threads have a look at
> futex_wake03.c how to assert that threads are sleeping on futex.
Ok. thanks~
>
> If the bug can be reproduced using child processes as well, you can use
> TST_PROCESS_STATE_WAIT() to ensure children are sleeping in kernel and
> tst_record_childstatus() to propagate the test result from child
> process.
Looks like the bug reported by using thread. Anyway, I can have a try.
>
> > + /*try to wake up thread2*/
> > + futex_wake(futex2, 1, 0);
> > +
> > + /*see if thread2 can be woke up*/
> > + while (!th2_wait_done) {
> > + gettimeofday(&tv, NULL);
> > + /*thread2 block over 30 secs, test fail*/
> > + if (tv.tv_sec > (th2_wait_time + wait_max_time)) {
> > + tst_resm(TFAIL,
> > + "Bug: wait_thread2 did not wake after %ld
> > secs.",
> > + tv.tv_sec - th2_wait_time);
> > + break;
> > + }
> > + }
> > +
> > + munmap(addr, HUGE_SIZE);
>
> SAFE_MUNMAP()
Ok.
>
>
> You should also wake the second thread here and join both of them,
> otherwise with test looping the program will create more and more
> threads until it fails.
Ok,
pthread_join(th2, NULL);
pthread_join(th1, NULL);
will be added.
Thanks for reviewing this patch. I will post V2 in the next.
Li Wang.
>
> > +}
> > +
> > +int main(int argc, char *argv[])
> > +{
> > + int lc;
> > +
> > + tst_parse_opts(argc, argv, NULL, NULL);
> > +
> > + setup();
> > +
> > + for (lc = 0; TEST_LOOPING(lc); lc++)
> > + wakeup_thread2();
> > +
> > + cleanup();
> > + tst_exit();
> > +}
> > --
> > 1.8.3.1
> >
> >
> > ------------------------------------------------------------------------------
> > _______________________________________________
> > Ltp-list mailing list
> > [email protected]
> > https://lists.sourceforge.net/lists/listinfo/ltp-list
>
> --
> Cyril Hrubis
> [email protected]
>
------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list