On Mon, Nov 25, 2013 at 09:21:08AM +0100, Holger Hans Peter Freyther wrote:
As I have already pointed out. Some control blocks can starve. I don't know if it does but it is where I will continue to have a look.
Here is the starvation theory for the ping:
We have a LLC frame (or many queued up)... we schedule the polls and at the final_ack indicate we decide to re-use the TBF. This means that we will schedule another PACKET DOWNLINK ASSIGNMENT. But at the same time we either want to honor the "rh->si" or want to schedule the ACK due SEND_ACK_AFTER_FRAMES.
So we more or less want to send "PACKET DOWNLINK ASSIGNMENT" and the "PACKET UPLINK ACK" at the same time (with more DL tbfs/traffic this is getting more likely) but currently we will always prefer the PACKET DOWNLINK ASSIGNMENT. This means that the uplink will starve (e.g. the window stalled, rh->si means that the uplink will starve (the window will stall, rh->si being set, etc).
Fairness improvements:
* put ul_ass_tbf, dl_ass_tbf, ul_ack_tbf in an array and store the last index in the PDCH and iterate over it. * move the TBF to the front of the ul_tbfs and dl_tbfs list so that it is not selected again.