+always_inline int
+segment_try_alloc_fifos (svm_fifo_segment_private_t * fifo_segment,
+ u32 rx_fifo_size, u32 tx_fifo_size,
+ svm_fifo_t ** rx_fifo, svm_fifo_t ** tx_fifo)
+{
+ rx_fifo_size = clib_max (rx_fifo_size, default_fifo_size);
+ *rx_fifo = svm_fifo_segment_alloc_fifo (fifo_segment, rx_fifo_size,
+ FIFO_SEGMENT_RX_FREELIST);
+
+ tx_fifo_size = clib_max (tx_fifo_size, default_fifo_size);
+ *tx_fifo = svm_fifo_segment_alloc_fifo (fifo_segment, tx_fifo_size,
+ FIFO_SEGMENT_TX_FREELIST);
+
+ if (*rx_fifo == 0)
+ {
+ /* This would be very odd, but handle it... */
+ if (*tx_fifo != 0)
+ {
+ svm_fifo_segment_free_fifo (fifo_segment, *tx_fifo,
+ FIFO_SEGMENT_TX_FREELIST);
+ *tx_fifo = 0;
+ }
+ return -1;
+ }
+ if (*tx_fifo == 0)
+ {
+ if (*rx_fifo != 0)
+ {
+ svm_fifo_segment_free_fifo (fifo_segment, *rx_fifo,
+ FIFO_SEGMENT_RX_FREELIST);
+ *rx_fifo = 0;
+ }
+ return -1;
+ }
+
+ return 0;
+}
+