qemu-e2k/hw/9pfs
Christian Schoenebeck 6b6aa8285d 9p: Use variable length suffixes for inode remapping
Use variable length suffixes for inode remapping instead of the fixed
16 bit size prefixes before. With this change the inode numbers on guest
will typically be much smaller (e.g. around >2^1 .. >2^7 instead of >2^48
with the previous fixed size inode remapping.

Additionally this solution is more efficient, since inode numbers in
practice can take almost their entire 64 bit range on guest as well, so
there is less likely a need for generating and tracking additional suffixes,
which might also be beneficial for nested virtualization where each level of
virtualization would shift up the inode bits and increase the chance of
expensive remapping actions.

The "Exponential Golomb" algorithm is used as basis for generating the
variable length suffixes. The algorithm has a parameter k which controls the
distribution of bits on increasing indeces (minimum bits at low index vs.
maximum bits at high index). With k=0 the generated suffixes look like:

Index Dec/Bin -> Generated Suffix Bin
1 [1] -> [1] (1 bits)
2 [10] -> [010] (3 bits)
3 [11] -> [110] (3 bits)
4 [100] -> [00100] (5 bits)
5 [101] -> [10100] (5 bits)
6 [110] -> [01100] (5 bits)
7 [111] -> [11100] (5 bits)
8 [1000] -> [0001000] (7 bits)
9 [1001] -> [1001000] (7 bits)
10 [1010] -> [0101000] (7 bits)
11 [1011] -> [1101000] (7 bits)
12 [1100] -> [0011000] (7 bits)
...
65533 [1111111111111101] ->  [1011111111111111000000000000000] (31 bits)
65534 [1111111111111110] ->  [0111111111111111000000000000000] (31 bits)
65535 [1111111111111111] ->  [1111111111111111000000000000000] (31 bits)
Hence minBits=1 maxBits=31

And with k=5 they would look like:

Index Dec/Bin -> Generated Suffix Bin
1 [1] -> [000001] (6 bits)
2 [10] -> [100001] (6 bits)
3 [11] -> [010001] (6 bits)
4 [100] -> [110001] (6 bits)
5 [101] -> [001001] (6 bits)
6 [110] -> [101001] (6 bits)
7 [111] -> [011001] (6 bits)
8 [1000] -> [111001] (6 bits)
9 [1001] -> [000101] (6 bits)
10 [1010] -> [100101] (6 bits)
11 [1011] -> [010101] (6 bits)
12 [1100] -> [110101] (6 bits)
...
65533 [1111111111111101] -> [0011100000000000100000000000] (28 bits)
65534 [1111111111111110] -> [1011100000000000100000000000] (28 bits)
65535 [1111111111111111] -> [0111100000000000100000000000] (28 bits)
Hence minBits=6 maxBits=28

Signed-off-by: Christian Schoenebeck <qemu_oss@crudebyte.com>
Signed-off-by: Greg Kurz <groug@kaod.org>
2019-10-10 11:36:23 +02:00
..
9p-local.c 9p: Added virtfs option 'multidevs=remap|forbid|warn' 2019-10-10 11:36:05 +02:00
9p-local.h
9p-posix-acl.c
9p-proxy.c 9p: Simplify error path of v9fs_device_realize_common() 2019-10-10 11:36:04 +02:00
9p-proxy.h
9p-synth.c
9p-synth.h
9p-util.c
9p-util.h
9p-xattr-user.c
9p-xattr.c
9p-xattr.h
9p.c 9p: Use variable length suffixes for inode remapping 2019-10-10 11:36:23 +02:00
9p.h 9p: Use variable length suffixes for inode remapping 2019-10-10 11:36:23 +02:00
codir.c Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
cofile.c Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
cofs.c Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
coth.c Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
coth.h Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
coxattr.c Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
Kconfig 9p: simplify source file selection 2019-08-20 17:26:19 +02:00
Makefile.objs
trace-events 9p: unsigned type for type, version, path 2019-10-10 11:36:04 +02:00
virtio-9p-device.c Include hw/qdev-properties.h less 2019-08-16 13:31:53 +02:00
virtio-9p.h
xen-9p-backend.c Include qemu/main-loop.h less 2019-08-16 13:31:52 +02:00
xen-9pfs.h