cregit-Linux how code gets into the kernel

Release 4.15 kernel/power/console.c

Directory: kernel/power
// SPDX-License-Identifier: GPL-2.0
/*
 * Functions for saving/restoring console.
 *
 * Originally from swsusp.
 */

#include <linux/console.h>
#include <linux/vt_kern.h>
#include <linux/kbd_kern.h>
#include <linux/vt.h>
#include <linux/module.h>
#include <linux/slab.h>
#include "power.h"


#define SUSPEND_CONSOLE	(MAX_NR_CONSOLES-1)



static int orig_fgconsole, orig_kmsg;

static DEFINE_MUTEX(vt_switch_mutex);


struct pm_vt_switch {
	
struct list_head head;
	
struct device *dev;
	
bool required;
};

static LIST_HEAD(pm_vt_switch_list);


/**
 * pm_vt_switch_required - indicate VT switch at suspend requirements
 * @dev: device
 * @required: if true, caller needs VT switch at suspend/resume time
 *
 * The different console drivers may or may not require VT switches across
 * suspend/resume, depending on how they handle restoring video state and
 * what may be running.
 *
 * Drivers can indicate support for switchless suspend/resume, which can
 * save time and flicker, by using this routine and passing 'false' as
 * the argument.  If any loaded driver needs VT switching, or the
 * no_console_suspend argument has been passed on the command line, VT
 * switches will occur.
 */

void pm_vt_switch_required(struct device *dev, bool required) { struct pm_vt_switch *entry, *tmp; mutex_lock(&vt_switch_mutex); list_for_each_entry(tmp, &pm_vt_switch_list, head) { if (tmp->dev == dev) { /* already registered, update requirement */ tmp->required = required; goto out; } } entry = kmalloc(sizeof(*entry), GFP_KERNEL); if (!entry) goto out; entry->required = required; entry->dev = dev; list_add(&entry->head, &pm_vt_switch_list); out: mutex_unlock(&vt_switch_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
Jesse Barnes109100.00%1100.00%
Total109100.00%1100.00%

EXPORT_SYMBOL(pm_vt_switch_required); /** * pm_vt_switch_unregister - stop tracking a device's VT switching needs * @dev: device * * Remove @dev from the vt switch list. */
void pm_vt_switch_unregister(struct device *dev) { struct pm_vt_switch *tmp; mutex_lock(&vt_switch_mutex); list_for_each_entry(tmp, &pm_vt_switch_list, head) { if (tmp->dev == dev) { list_del(&tmp->head); kfree(tmp); break; } } mutex_unlock(&vt_switch_mutex); }

Contributors

PersonTokensPropCommitsCommitProp
Jesse Barnes5691.80%150.00%
Masami Ichikawa58.20%150.00%
Total61100.00%2100.00%

EXPORT_SYMBOL(pm_vt_switch_unregister); /* * There are three cases when a VT switch on suspend/resume are required: * 1) no driver has indicated a requirement one way or another, so preserve * the old behavior * 2) console suspend is disabled, we want to see debug messages across * suspend/resume * 3) any registered driver indicates it needs a VT switch * * If none of these conditions is present, meaning we have at least one driver * that doesn't need the switch, and none that do, we can avoid it to make * resume look a little prettier (and suspend too, but that's usually hidden, * e.g. when closing the lid on a laptop). */
static bool pm_vt_switch(void) { struct pm_vt_switch *entry; bool ret = true; mutex_lock(&vt_switch_mutex); if (list_empty(&pm_vt_switch_list)) goto out; if (!console_suspend_enabled) goto out; list_for_each_entry(entry, &pm_vt_switch_list, head) { if (entry->required) goto out; } ret = false; out: mutex_unlock(&vt_switch_mutex); return ret; }

Contributors

PersonTokensPropCommitsCommitProp
Jesse Barnes77100.00%1100.00%
Total77100.00%1100.00%


void pm_prepare_console(void) { if (!pm_vt_switch()) return; orig_fgconsole = vt_move_to_console(SUSPEND_CONSOLE, 1); if (orig_fgconsole < 0) return; orig_kmsg = vt_kmsg_redirect(SUSPEND_CONSOLE); return; }

Contributors

PersonTokensPropCommitsCommitProp
Patrick Mochel1950.00%116.67%
Jesse Barnes615.79%116.67%
Alan Cox513.16%116.67%
Borislav Petkov410.53%116.67%
Bernhard Walle37.89%116.67%
Andrew Morton12.63%116.67%
Total38100.00%6100.00%


void pm_restore_console(void) { if (!pm_vt_switch()) return; if (orig_fgconsole >= 0) { vt_move_to_console(orig_fgconsole, 0); vt_kmsg_redirect(orig_kmsg); } }

Contributors

PersonTokensPropCommitsCommitProp
Patrick Mochel823.53%114.29%
Alan Cox720.59%114.29%
Jesse Barnes720.59%114.29%
Arve Hjönnevåg514.71%114.29%
Bernhard Walle38.82%114.29%
Ian Campbell25.88%114.29%
Andres Salomon25.88%114.29%
Total34100.00%7100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
Jesse Barnes30076.14%17.14%
Patrick Mochel4210.66%17.14%
Alan Cox123.05%17.14%
Bernhard Walle71.78%17.14%
Arve Hjönnevåg51.27%17.14%
Andres Salomon51.27%17.14%
Masami Ichikawa51.27%17.14%
Borislav Petkov41.02%17.14%
Rafael J. Wysocki30.76%17.14%
Tejun Heo30.76%17.14%
Andrew Morton30.76%17.14%
Ian Campbell30.76%17.14%
H Hartley Sweeten10.25%17.14%
Greg Kroah-Hartman10.25%17.14%
Total394100.00%14100.00%
Directory: kernel/power
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.