If the TCP connection was idle and there is no unacknowledged data in either
direction, the answer is neither.
Acknowledging the data immediately is wasteful. There's a very good chance
another packet is right behind this one and delaying the acknowledgement
would save a packet.
Waiting for upper layers is disastrous, it could result in the other end
timing out and retransmitting and would limit the end of slow start based on
user-space speeds.
Google "delayed ACK".
http://www.freesoft.org/CIE/RFC/1122/110.htm
DS
--