Print this page
DLPX-25998 TCP congestion control is inadequate
Reviewed at: http://reviews.delphix.com/r/34808/


 305         if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) \
 306             == NULL)                                                    \
 307                 (head)->stqh_last = &(head)->stqh_first;              \
 308         _NOTE(CONSTCOND)                                                \
 309 } while (0)
 310 
 311 #define STAILQ_REMOVE(head, elm, type, field) do {                      \
 312         if ((head)->stqh_first == (elm)) {                           \
 313                 STAILQ_REMOVE_HEAD((head), field);                      \
 314         } else {                                                        \
 315                 struct type *curelm = (head)->stqh_first;            \
 316                 while (curelm->field.stqe_next != (elm))             \
 317                         curelm = curelm->field.stqe_next;            \
 318                 if ((curelm->field.stqe_next =                               \
 319                         curelm->field.stqe_next->field.stqe_next) == NULL) \
 320                             (head)->stqh_last = &(curelm)->field.stqe_next; \
 321         }                                                               \
 322         _NOTE(CONSTCOND)                                                \
 323 } while (0)
 324 
 325 #define STAILQ_FOREACH(var, head, field)                                \
 326         for ((var) = ((head)->stqh_first);                           \
 327                 (var);                                                  \
 328                 (var) = ((var)->field.stqe_next))
 329 
 330 /*
 331  * Singly-linked Tail queue access methods.
 332  */
 333 #define STAILQ_EMPTY(head)      ((head)->stqh_first == NULL)
 334 #define STAILQ_FIRST(head)      ((head)->stqh_first)
 335 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
 336 




 337 






 338 /*
 339  * Simple queue definitions.
 340  */
 341 #define SIMPLEQ_HEAD(name, type)                                        \
 342 struct name {                                                           \
 343         struct type *sqh_first; /* first element */             \
 344         struct type **sqh_last; /* addr of last next element */ \
 345 }
 346 
 347 #define SIMPLEQ_HEAD_INITIALIZER(head)                                  \
 348         { NULL, &(head).sqh_first }
 349 
 350 #define SIMPLEQ_ENTRY(type)                                             \
 351 struct {                                                                \
 352         struct type *sqe_next;  /* next element */                      \
 353 }
 354 
 355 /*
 356  * Simple queue functions.
 357  */




 305         if (((head)->stqh_first = (head)->stqh_first->field.stqe_next) \
 306             == NULL)                                                    \
 307                 (head)->stqh_last = &(head)->stqh_first;              \
 308         _NOTE(CONSTCOND)                                                \
 309 } while (0)
 310 
 311 #define STAILQ_REMOVE(head, elm, type, field) do {                      \
 312         if ((head)->stqh_first == (elm)) {                           \
 313                 STAILQ_REMOVE_HEAD((head), field);                      \
 314         } else {                                                        \
 315                 struct type *curelm = (head)->stqh_first;            \
 316                 while (curelm->field.stqe_next != (elm))             \
 317                         curelm = curelm->field.stqe_next;            \
 318                 if ((curelm->field.stqe_next =                               \
 319                         curelm->field.stqe_next->field.stqe_next) == NULL) \
 320                             (head)->stqh_last = &(curelm)->field.stqe_next; \
 321         }                                                               \
 322         _NOTE(CONSTCOND)                                                \
 323 } while (0)
 324 





 325 /*
 326  * Singly-linked Tail queue access methods.
 327  */
 328 #define STAILQ_EMPTY(head)      ((head)->stqh_first == NULL)
 329 #define STAILQ_FIRST(head)      ((head)->stqh_first)
 330 #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next)
 331 
 332 #define STAILQ_FOREACH(var, head, field)                                \
 333         for ((var) = ((head)->stqh_first);                           \
 334                 (var);                                                  \
 335                 (var) = ((var)->field.stqe_next))
 336 
 337 #define STAILQ_FOREACH_SAFE(var, head, field, tvar)                     \
 338         for ((var) = STAILQ_FIRST((head));                              \
 339                 (var) && ((tvar) = STAILQ_NEXT((var), field), 1);       \
 340                 (var) = (tvar))
 341 
 342 
 343 /*
 344  * Simple queue definitions.
 345  */
 346 #define SIMPLEQ_HEAD(name, type)                                        \
 347 struct name {                                                           \
 348         struct type *sqh_first; /* first element */             \
 349         struct type **sqh_last; /* addr of last next element */ \
 350 }
 351 
 352 #define SIMPLEQ_HEAD_INITIALIZER(head)                                  \
 353         { NULL, &(head).sqh_first }
 354 
 355 #define SIMPLEQ_ENTRY(type)                                             \
 356 struct {                                                                \
 357         struct type *sqe_next;  /* next element */                      \
 358 }
 359 
 360 /*
 361  * Simple queue functions.
 362  */