600 also works for me.
Besides, coreutils mkfifo doesn't open the fifo, it only creates it and immediately terminates as indicated by strace.
edit
Actually, it opens the fifo if -m is passed, in the subsequent call to lib/lchmod.c:lchmod()
mknod("test", S_IFIFO|0600) = 0
open("test", O_RDONLY|O_LARGEFILE|O_NOFOLLOW|O_CLOEXEC|O_PATH) = 3
readlinkat(3, "", 0xbee9b83c, 1) = -1 ENOENT (No such file or directory)
close(3) = 0
readlink("test", 0xbee9b83c, 1) = -1 EINVAL (Invalid argument)
chmod("test", 0600) = 0
close(1) = 0
close(2) = 0
exit_group(0) = ?
+++ exited with 0 +++
But it works...
This call hanging despite O_PATH could be a kernel bug perhaps. Not sure why it's OK on my system, maybe it's specific to some 4.x release or maybe my ARM vendor backported fixes to this old 3.x branch... (this is not a vanilla kernel I'm testing with)