[tarantool-patches] [rfc 3/4] core/fiber: Put static watermark into stack to track its usage

Cyrill Gorcunov gorcunov at gmail.com
Tue Mar 5 22:17:55 MSK 2019


On Tue, Mar 05, 2019 at 11:10:13AM +0300, Konstantin Osipov wrote:
> * Cyrill Gorcunov <gorcunov at gmail.com> [19/03/03 23:25]:
> > +/*
> > + * Random values generated with uuid.
> > + * Try to fit a cache line.
> > + */
> > +static const uint64_t poison_pool[] = {
> > +	0x74f31d37285c4c37, 0xb10269a05bf10c29,
> > +	0x0994d845bd284e0f, 0x9ffd4f7129c184df,
> > +	0x357151e6711c4415, 0x8c5e5f41aafe6f28,
> > +	0x6917dd79e78049d5, 0xba61957c65ca2465,
> > +};
> 
> With randomness incorporated into each fiber I think we can reduce
> the poison pool to 4 8-byte integers or even less.

Kostja, you know, randoms values is a bad idea. For example I just got

[cyrill at uranus tarantool.git] ./src/tarantool
poison_gaps[0] = 736
poison_gaps[1] = 952
poison_gaps[2] = 976
poison_gaps[3] = 2016
Tarantool 2.1.1-360-g6666db8d5
type 'help' for interactive help

So the first gap almost close to 1K value :( Which means we won't detect
the page dirtifying while someone is putting values on start of the
page and even more, we're not controlling what exactly random values
come to us. I think putting poisons at 128 byte bound a way better

The pretty draf code I used is
---
static void
stack_poison_gaps_init(void)
{
	size_t i, j, m = page_size / 2;
	uint16_t v;

	assert(POISON_SIZE > 1);

	/*
	 * Fill the gaps with random (8 byte aligned)
	 * values in a half page range. This should decrease
	 * probability that someone manage to sneak out
	 * the poison values.
	 */

	random_bytes((void *)poison_gaps, sizeof(poison_gaps));
	for (i = 0; i < POISON_SIZE; i++) {
		v = poison_gaps[i] % m;
		poison_gaps[i] = (v + 8) & ~7;
	}

	for (i = 0; i < POISON_SIZE; i++) {
		v = poison_gaps[i], j = i;
		while (j > 0 && poison_gaps[j-1] > v)
			poison_gaps[j] = poison_gaps[j-1], j--;
		poison_gaps[j] = v;
	}

	for (i = 0; i < POISON_SIZE; i++) {
		say_info("poison_gaps[%d] = %d", i, (unsigned)poison_gaps[i]);
		if (i == 0)
			continue;
		assert(poison_gaps[i-1] != poison_gaps[i]);
	}
}
---



More information about the Tarantool-patches mailing list