Commit 8ac4bf01 authored by Petr Mladek's avatar Petr Mladek
Browse files

Merge branch 'rework/optimizations' into for-linus

parents 731ae3ad cf554387
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -64,6 +64,7 @@ struct dev_printk_info;

extern struct printk_ringbuffer *prb;
extern bool printk_kthreads_running;
extern bool printk_kthreads_ready;
extern bool debug_non_panic_cpus;

__printf(4, 0)
@@ -180,6 +181,7 @@ static inline void nbcon_kthread_wake(struct console *con)
#define PRINTKRB_RECORD_MAX	0

#define printk_kthreads_running (false)
#define printk_kthreads_ready (false)

/*
 * In !PRINTK builds we still export console_sem
+24 −2
Original line number Diff line number Diff line
@@ -1671,6 +1671,9 @@ bool nbcon_alloc(struct console *con)
{
	struct nbcon_state state = { };

	/* Synchronize the kthread start. */
	lockdep_assert_console_list_lock_held();

	/* The write_thread() callback is mandatory. */
	if (WARN_ON(!con->write_thread))
		return false;
@@ -1701,12 +1704,15 @@ bool nbcon_alloc(struct console *con)
			return false;
		}

		if (printk_kthreads_running) {
		if (printk_kthreads_ready && !have_boot_console) {
			if (!nbcon_kthread_create(con)) {
				kfree(con->pbufs);
				con->pbufs = NULL;
				return false;
			}

			/* Might be the first kthread. */
			printk_kthreads_running = true;
		}
	}

@@ -1716,14 +1722,30 @@ bool nbcon_alloc(struct console *con)
/**
 * nbcon_free - Free and cleanup the nbcon console specific data
 * @con:	Console to free/cleanup nbcon data
 *
 * Important: @have_nbcon_console must be updated before calling
 *	this function. In particular, it can be set only when there
 *	is still another nbcon console registered.
 */
void nbcon_free(struct console *con)
{
	struct nbcon_state state = { };

	if (printk_kthreads_running)
	/* Synchronize the kthread stop. */
	lockdep_assert_console_list_lock_held();

	if (printk_kthreads_running) {
		nbcon_kthread_stop(con);

		/* Might be the last nbcon console.
		 *
		 * Do not rely on printk_kthreads_check_locked(). It is not
		 * called in some code paths, see nbcon_free() callers.
		 */
		if (!have_nbcon_console)
			printk_kthreads_running = false;
	}

	nbcon_state_set(con, &state);

	/* Boot consoles share global printk buffers. */
+11 −9
Original line number Diff line number Diff line
@@ -3574,7 +3574,7 @@ EXPORT_SYMBOL(console_resume);
static int unregister_console_locked(struct console *console);

/* True when system boot is far enough to create printer threads. */
static bool printk_kthreads_ready __ro_after_init;
bool printk_kthreads_ready __ro_after_init;

static struct task_struct *printk_legacy_kthread;

@@ -3713,6 +3713,7 @@ static void printk_kthreads_check_locked(void)
	if (!printk_kthreads_ready)
		return;

	/* Start or stop the legacy kthread when needed. */
	if (have_legacy_console || have_boot_console) {
		if (!printk_legacy_kthread &&
		    force_legacy_kthread() &&
@@ -4204,14 +4205,6 @@ static int unregister_console_locked(struct console *console)
	 */
	synchronize_srcu(&console_srcu);

	if (console->flags & CON_NBCON)
		nbcon_free(console);

	console_sysfs_notify();

	if (console->exit)
		res = console->exit(console);

	/*
	 * With this console gone, the global flags tracking registered
	 * console types may have changed. Update them.
@@ -4232,6 +4225,15 @@ static int unregister_console_locked(struct console *console)
	if (!found_nbcon_con)
		have_nbcon_console = found_nbcon_con;

	/* @have_nbcon_console must be updated before calling nbcon_free(). */
	if (console->flags & CON_NBCON)
		nbcon_free(console);

	console_sysfs_notify();

	if (console->exit)
		res = console->exit(console);

	/* Changed console list, may require printer threads to start/stop. */
	printk_kthreads_check_locked();