+ nsoonest = 0;
+ soonest = jiffies;
+
+ list_for_each_safe(tmp, nxt, &dev->rad_new_conns) {
+ conn = list_entry(tmp, kra_conn_t, rac_schedlist);
+
+ deadline = conn->rac_last_tx + conn->rac_keepalive;
+ if (time_after_eq(jiffies, deadline)) {
+ /* Time to process this new conn */
+ spin_unlock_irqrestore(&dev->rad_lock, flags);
+ dropped_lock = 1;
+
+ rc = kranal_process_new_conn(conn);
+ if (rc != -EAGAIN) {
+ /* All done with this conn */
+ spin_lock_irqsave(&dev->rad_lock, flags);
+ list_del_init(&conn->rac_schedlist);
+ spin_unlock_irqrestore(&dev->rad_lock, flags);
+
+ kranal_conn_decref(conn);
+ spin_lock_irqsave(&dev->rad_lock, flags);
+ continue;
+ }
+
+ /* retry with exponential backoff until HZ */
+ if (conn->rac_keepalive == 0)
+ conn->rac_keepalive = 1;
+ else if (conn->rac_keepalive <= HZ)
+ conn->rac_keepalive *= 2;
+ else
+ conn->rac_keepalive += HZ;
+
+ deadline = conn->rac_last_tx + conn->rac_keepalive;
+ spin_lock_irqsave(&dev->rad_lock, flags);
+ }
+
+ /* Does this conn need attention soonest? */
+ if (nsoonest++ == 0 ||
+ !time_after_eq(deadline, soonest))
+ soonest = deadline;
+ }
+
+ if (dropped_lock) /* may sleep iff I didn't drop the lock */