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)); }
/* * Drop oldest console buffer if sclp_con_drop is set */ static int sclp_console_drop_buffer(void) { struct list_head *list; struct sclp_buffer *buffer; void *page; if (!sclp_console_drop) return 0; list = sclp_con_outqueue.next; if (sclp_con_queue_running) /* The first element is in I/O */ list = list->next; if (list == &sclp_con_outqueue) return 0; list_del(list); buffer = list_entry(list, struct sclp_buffer, list); page = sclp_unmake_buffer(buffer); list_add_tail((struct list_head *) page, &sclp_con_pages); return 1; }