Thanks for doing that - very interesting result! There were a lot of fuse changes between Linux 5.3 and 5.4. I don't know exactly what they are all about but I see a lot of moving to new API.
So I wonder if the new API for fuse is slower for sync access but fast for async access? If so then I expect other fuse filing systems will have noticed this.
$ git log --oneline v5.3..v5.4 -- fs/fuse | cat
091d1a726772 fuse: redundant get_fuse_inode() calls in fuse_writepages_fill()
e4648309b85a fuse: truncate pending writes on O_TRUNC
b24e7598db62 fuse: flush dirty data/metadata before non-truncate setattr
80da5a809d19 virtiofs: Remove set but not used variable 'fc'
a9bfd9dd3417 virtiofs: Retry request submission from worker context
c17ea0096103 virtiofs: Count pending forgets as in_flight forgets
5dbe190f3412 virtiofs: Set FR_SENT flag only after request has been sent
7ee1e2e631db virtiofs: No need to check fpq->connected state
51fecdd2555b virtiofs: Do not end request in submission context
6c26f71759a6 fuse: don't advise readdirplus for negative lookup
2b319d1f6f92 fuse: don't dereference req->args on finished request
3f22c7467136 virtio-fs: don't show mount options
112e72373d1f virtio-fs: Change module name to virtiofs.ko
8f744bdee4fe Merge tag 'virtio-fs-5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse
5addcd5dbd8c fuse: Make fuse_args_to_req static
9ad09b1976c5 fuse: fix memleak in cuse_channel_open
e5854b1cdf6c fuse: fix beyond-end-of-page access in fuse_parse_cache()
0ed4059302a7 fuse: unexport fuse_put_request
dc69e98c241e fuse: kmemcg account fs data
30c6a23d34cb fuse: on 64-bit store time in d_fsdata directly
d5880c7a8620 fuse: fix missing unlock_page in fuse_writepage()
a62a8ef9d97d virtio-fs: add virtiofs filesystem
15c8e72e88e0 fuse: allow skipping control interface and forced unmount
783863d6476c fuse: dissociate DESTROY from fuseblk
8fab01064436 fuse: delete dentry if timeout is zero
0cd1eb9a4160 fuse: separate fuse device allocation and installation in fuse_conn
ae3aad77f46f fuse: add fuse_iqueue_ops callbacks
0cc2656cdb0b fuse: extract fuse_fill_super_common()
4388c5aac4ba fuse: export fuse_dequeue_forget() function
79d96efffda7 fuse: export fuse_get_unique()
95a84cdb11c2 fuse: export fuse_send_init_request()
14d46d7abc39 fuse: export fuse_len_args()
04ec5af0776e fuse: export fuse_end_request()
f22f812d5ce7 fuse: fix request limit
05ea48cc2b09 fuse: stop copying pages to fuse_req
d49937749fef fuse: stop copying args to fuse_req
145b673bd208 fuse: clean up fuse_req
7213394c4e18 fuse: simplify request allocation
66abc3599c3c fuse: unexport request ops
75b399dda5be fuse: convert retrieve to simple api
4cb548666e4c fuse: convert release to simple api
b50ef7c52ad7 cuse: convert init to simple api
615047eff108 fuse: convert init to simple api
33826ebbbe4b fuse: convert writepages to simple api
43f5098eb82b fuse: convert readdir to simple api
134831e36bbd fuse: convert readpages to simple api
45ac96ed7c36 fuse: convert direct_io to simple api
1259728731a7 fuse: add simple background helper
338f2e3f3341 fuse: convert sync write to simple api
00793ca5d443 fuse: covert readpage to simple api
a0d45d84f4c9 fuse: fuse_short_read(): don't take fuse_req as argument
093f38a2c1a8 fuse: convert ioctl to simple api
4c4f03f78ca9 fuse: move page alloc
4c29afece872 fuse: convert readlink to simple api
68583165f962 fuse: add pages to fuse_args
1ccd1ea24962 fuse: convert destroy to simple api
e413754b267e fuse: add nocreds to fuse_args
3545fe211282 fuse: convert fuse_force_forget() to simple api
454a7613f54e fuse: add noreply to fuse_args
c500ebaa908d fuse: convert flush to simple api
40ac7ab2d021 fuse: simplify 'nofail' request
1f4e9d03d1fb fuse: rearrange and resize fuse_args fields
d5b4854357f4 fuse: flatten 'struct fuse_args'
76e43c8ccaa3 fuse: fix deadlock with aio poll and fuse_iqueue::waitq.lock
c7eb6869632a vfs: subtype handling moved to fuse
c30da2e981a7 fuse: convert to use the new mount API
56d250ef9650 cuse: fix broken release
17b2cbe29492 fuse: cleanup fuse_wait_on_page_writeback
1fb027d75964 fuse: require /dev/fuse reads to have enough buffer capacity (take 2)