cregit-Linux how code gets into the kernel

Release 4.10 kernel/power/console.c

Directory: kernel/power
/*
 * 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 barnesjesse 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 barnesjesse barnes5691.80%150.00%
masami ichikawamasami 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 barnesjesse 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 mochelpatrick mochel1950.00%116.67%
jesse barnesjesse barnes615.79%116.67%
alan coxalan cox513.16%116.67%
borislav petkovborislav petkov410.53%116.67%
bernhard wallebernhard walle37.89%116.67%
andrew mortonandrew 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
arve hjonnevagarve hjonnevag823.53%116.67%
patrick mochelpatrick mochel720.59%116.67%
alan coxalan cox720.59%116.67%
jesse barnesjesse barnes720.59%116.67%
bernhard wallebernhard walle38.82%116.67%
ian campbellian campbell25.88%116.67%
Total34100.00%6100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
jesse barnesjesse barnes30076.34%17.69%
patrick mochelpatrick mochel4110.43%17.69%
alan coxalan cox123.05%17.69%
arve hjonnevagarve hjonnevag82.04%17.69%
bernhard wallebernhard walle71.78%17.69%
masami ichikawamasami ichikawa51.27%17.69%
borislav petkovborislav petkov41.02%17.69%
tejun heotejun heo30.76%17.69%
rafael j. wysockirafael j. wysocki30.76%17.69%
andres salomonandres salomon30.76%17.69%
andrew mortonandrew morton30.76%17.69%
ian campbellian campbell30.76%17.69%
h hartley sweetenh hartley sweeten10.25%17.69%
Total393100.00%13100.00%
Directory: kernel/power
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.