static void sclp_conbuf_emit(void) { struct sclp_buffer* buffer; unsigned long flags; int rc; spin_lock_irqsave(&sclp_con_lock, flags); if (sclp_conbuf) list_add_tail(&sclp_conbuf->list, &sclp_con_outqueue); sclp_conbuf = NULL; if (sclp_con_queue_running || sclp_con_suspended) goto out_unlock; if (list_empty(&sclp_con_outqueue)) goto out_unlock; buffer = list_first_entry(&sclp_con_outqueue, struct sclp_buffer, list); sclp_con_queue_running = 1; spin_unlock_irqrestore(&sclp_con_lock, flags); rc = sclp_emit_buffer(buffer, sclp_conbuf_callback); if (rc) sclp_conbuf_callback(buffer, rc); return; out_unlock: spin_unlock_irqrestore(&sclp_con_lock, flags); }
static void sclp_conbuf_callback(struct sclp_buffer *buffer, int rc) { unsigned long flags; void *page; do { page = sclp_unmake_buffer(buffer); spin_lock_irqsave(&sclp_con_lock, flags); /* */ list_del(&buffer->list); list_add_tail((struct list_head *) page, &sclp_con_pages); /* */ buffer = NULL; if (!list_empty(&sclp_con_outqueue)) buffer = list_first_entry(&sclp_con_outqueue, struct sclp_buffer, list); if (!buffer || sclp_con_suspended) { sclp_con_queue_running = 0; spin_unlock_irqrestore(&sclp_con_lock, flags); break; } spin_unlock_irqrestore(&sclp_con_lock, flags); } while (sclp_emit_buffer(buffer, sclp_conbuf_callback)); }
static void sclp_conbuf_callback(struct sclp_buffer *buffer, int rc) { unsigned long flags; void *page; do { page = sclp_unmake_buffer(buffer); spin_lock_irqsave(&sclp_con_lock, flags); /* Remove buffer from outqueue */ list_del(&buffer->list); sclp_con_buffer_count--; list_add_tail((struct list_head *) page, &sclp_con_pages); /* Check if there is a pending buffer on the out queue. */ buffer = NULL; if (!list_empty(&sclp_con_outqueue)) buffer = list_entry(sclp_con_outqueue.next, struct sclp_buffer, list); spin_unlock_irqrestore(&sclp_con_lock, flags); } while (buffer && sclp_emit_buffer(buffer, sclp_conbuf_callback)); }
static void sclp_conbuf_emit(void) { struct sclp_buffer* buffer; unsigned long flags; int count; int rc; spin_lock_irqsave(&sclp_con_lock, flags); buffer = sclp_conbuf; sclp_conbuf = NULL; if (buffer == NULL) { spin_unlock_irqrestore(&sclp_con_lock, flags); return; } list_add_tail(&buffer->list, &sclp_con_outqueue); count = sclp_con_buffer_count++; spin_unlock_irqrestore(&sclp_con_lock, flags); if (count) return; rc = sclp_emit_buffer(buffer, sclp_conbuf_callback); if (rc) sclp_conbuf_callback(buffer, rc); }