Lines Matching refs:queue
50 static inline void spsc_queue_init(struct spsc_queue *queue) in spsc_queue_init() argument
52 queue->head = NULL; in spsc_queue_init()
53 atomic_long_set(&queue->tail, (long)&queue->head); in spsc_queue_init()
54 atomic_set(&queue->job_count, 0); in spsc_queue_init()
57 static inline struct spsc_node *spsc_queue_peek(struct spsc_queue *queue) in spsc_queue_peek() argument
59 return queue->head; in spsc_queue_peek()
62 static inline int spsc_queue_count(struct spsc_queue *queue) in spsc_queue_count() argument
64 return atomic_read(&queue->job_count); in spsc_queue_count()
67 static inline bool spsc_queue_push(struct spsc_queue *queue, struct spsc_node *node) in spsc_queue_push() argument
75 tail = (struct spsc_node **)atomic_long_xchg(&queue->tail, (long)&node->next); in spsc_queue_push()
77 atomic_inc(&queue->job_count); in spsc_queue_push()
87 return tail == &queue->head; in spsc_queue_push()
91 static inline struct spsc_node *spsc_queue_pop(struct spsc_queue *queue) in spsc_queue_pop() argument
98 node = READ_ONCE(queue->head); in spsc_queue_pop()
104 WRITE_ONCE(queue->head, next); in spsc_queue_pop()
109 if (atomic_long_cmpxchg(&queue->tail, in spsc_queue_pop()
110 (long)&node->next, (long) &queue->head) != (long)&node->next) { in spsc_queue_pop()
114 } while (unlikely(!(queue->head = READ_ONCE(node->next)))); in spsc_queue_pop()
118 atomic_dec(&queue->job_count); in spsc_queue_pop()