I'd prefer we re-used KEEPALIVE_TIMEOUT for this. This would change the semantics slightly, as right now the value does nothing when KEEPALIVE_TIME is infinite (the default). However, it makes a lot of sense to use the same value for both entries because they have mostly-shared fate. The only difference is that keepalive goes through the remote application whereas TCP_USER_TIMEOUT can be triggered directly by the kernel. The kernel will delay ACKs to combine them or to attach them to outgoing data. So when sending a keepalive, I'd expect the application to influence how soon data is ACK'ed, so they would be transmitted on the same packet frequently.
Also, KEEPALIVE_TIMEOUT is limited to no lower than 10 seconds. That is a very appropriate limit for TCP_USER_TIMEOUT as well, as application authors will commonly think "oh, a second looks good!" or "Oh, 100ms is plenty!". But that ignores retransmits and puts applications in a very dangerous position that can cause network collapse when the network slows down, even with datacenter networks.