The next major problem is system call virtualization. Since UML runs the same binaries as the host, they will make system calls with int 0x80 on x86. This causes them to enter the host kernel in order to run system calls. UML intercepts and nullifies them with PTRACE_SYSCALL.
The downside to this is that every UML system call requires four host context switches, to and from the tracing thread at both the start and and end of the system call. There are also a fair number of host system calls involved in this process. This makes UML system call overhead very high compared to the host.