1. ホーム
  2. Qt

random: crng init doneでアプリケーションの起動が遅くなる問題

2022-03-01 20:03:31
<パス

現象です。
起動後、アプリの起動が30秒間ブロックされ、random: crng init doneの後まで続かない。
原因
トレースした結果、getrandomの後にSYSC_getrandomの以下のシステムコールがあることが原因であることがわかりました。

SYSCALL_DEFINE3(getrandom, char __user *, buf, size_t, count,
		unsigned int, flags)
{
	if (flags & ~(GRND_NONBLOCK|GRND_RANDOM))
		return -EINVAL;

	if (count > INT_MAX)
		count = INT_MAX;

	if (flags & GRND_RANDOM)
		return _random_read(flags & GRND_NONBLOCK, buf, count);

	if (!crng_ready()) {
		if (flags & GRND_NONBLOCK)
			return -EAGAIN; 
		crng_wait_ready(); //******************* is blocking *************** at this point because the entropy pool is not full
		if (signal_pending(current))
			return -ERESTARTSYS;
	}
	return urandom_read(NULL, buf, count, NULL);
}



理論的には urandom_read は crng_wait_ready を待つ必要はありません。解決策は crng_ready の条件を crng_init > 0 に変更することです。

#if CRNG_READY_0
#define crng_ready() (likely(crng_init > 0))
#else
#define crng_ready() (likely(crng_init > 1))
#endif