[LTP] [PATCH v2] syscalls/keyctl02: wait for last key to be garbage collected
Cyril Hrubis
chrubis@suse.cz
Wed Oct 17 15:25:28 CEST 2018
Hi!
> static void do_test(void)
> {
> - int i;
> - key_serial_t key;
> + int i, ret;
> + key_serial_t key, key_inv;
> pthread_t pth[4];
>
> for (i = 0; i < LOOPS; i++) {
> @@ -94,13 +95,45 @@ static void do_test(void)
> SAFE_PTHREAD_JOIN(pth[3], NULL);
> }
>
> + /*
> + * Kernel should start garbage collect when last reference to key
> + * is removed (see key_put()). Since we are adding keys with identical
> + * description and type, each replacement should schedule a gc run,
> + * see comment at __key_link().
> + *
> + * We create extra key here, to remove reference to last revoked key.
> + */
> + key_inv = add_key("user", "ltptestkey", "foo", 3,
> + KEY_SPEC_PROCESS_KEYRING);
> + if (key_inv == -1)
> + tst_brk(TBROK | TERRNO, "Failed to add key");
> +
> + /*
> + * If we have invalidate, we can drop extra key immediately as well,
> + * which also schedules gc.
> + */
> + if (keyctl(KEYCTL_INVALIDATE, key_inv) == -1 && errno != EOPNOTSUPP)
> + tst_brk(TBROK | TERRNO, "Failed to invalidate key");
> +
> + /*
> + * At this point we are quite confident that gc has been scheduled,
> + * so we wait and periodically check for last test key to be removed.
> + */
> + for (i = 0; i < MAX_WAIT_FOR_GC_MS; i += 100) {
> + ret = keyctl(KEYCTL_REVOKE, key);
> + if (ret == -1 && errno == ENOKEY)
> + break;
> + usleep(100*1000);
> + }
> +
> + tst_res(TINFO, "waiting for key gc took: %d ms", i);
Minor enhancement may be:
if (i)
tst_res(TINFO, "waiting for key gc took: %d ms", i);
Anyways, the patch looks good, acked.
--
Cyril Hrubis
chrubis@suse.cz
More information about the ltp
mailing list