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"


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); }


Jesse Barnes109100.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); }


Jesse Barnes5691.80%150.00%
Masami Ichikawa58.20%150.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; }


Jesse Barnes77100.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; }


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%

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); } }


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%

Overall Contributors

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%
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.