|
@@ -63,6 +63,12 @@
|
|
|
static void sctp_assoc_bh_rcv(struct work_struct *work);
|
|
|
static void sctp_assoc_free_asconf_acks(struct sctp_association *asoc);
|
|
|
|
|
|
+/* Keep track of the new idr low so that we don't re-use association id
|
|
|
+ * numbers too fast. It is protected by they idr spin lock is in the
|
|
|
+ * range of 1 - INT_MAX.
|
|
|
+ */
|
|
|
+static u32 idr_low = 1;
|
|
|
+
|
|
|
|
|
|
/* 1st Level Abstractions. */
|
|
|
|
|
@@ -1553,7 +1559,12 @@ retry:
|
|
|
|
|
|
spin_lock_bh(&sctp_assocs_id_lock);
|
|
|
error = idr_get_new_above(&sctp_assocs_id, (void *)asoc,
|
|
|
- 1, &assoc_id);
|
|
|
+ idr_low, &assoc_id);
|
|
|
+ if (!error) {
|
|
|
+ idr_low = assoc_id + 1;
|
|
|
+ if (idr_low == INT_MAX)
|
|
|
+ idr_low = 1;
|
|
|
+ }
|
|
|
spin_unlock_bh(&sctp_assocs_id_lock);
|
|
|
if (error == -EAGAIN)
|
|
|
goto retry;
|