Revision 1fd684346d41f6be2487c161f60d03a7feb68911 authored by Rafael J. Wysocki on 19 January 2009, 19:57:36 UTC, committed by Jeff Garzik on 27 January 2009, 07:15:51 UTC
Some notebooks from HP have the problem that their BIOSes attempt to
spin down hard drives before entering ACPI system states S4 and S5.
This leads to a yo-yo effect during system power-off shutdown and the
last phase of hibernation when the disk is first spun down by the
kernel and then almost immediately turned on and off by the BIOS.
This, in turn, may result in shortening the disk's life times.

To prevent this from happening we can blacklist the affected systems
using DMI information.

Blacklist HP nx6310 that uses the AHCI driver.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
1 parent 2a6e58d
Raw File
is_single_threaded.c
/* Function to determine if a thread group is single threaded or not
 *
 * Copyright (C) 2008 Red Hat, Inc. All Rights Reserved.
 * Written by David Howells (dhowells@redhat.com)
 * - Derived from security/selinux/hooks.c
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public Licence
 * as published by the Free Software Foundation; either version
 * 2 of the Licence, or (at your option) any later version.
 */

#include <linux/sched.h>

/**
 * is_single_threaded - Determine if a thread group is single-threaded or not
 * @p: A task in the thread group in question
 *
 * This returns true if the thread group to which a task belongs is single
 * threaded, false if it is not.
 */
bool is_single_threaded(struct task_struct *p)
{
	struct task_struct *g, *t;
	struct mm_struct *mm = p->mm;

	if (atomic_read(&p->signal->count) != 1)
		goto no;

	if (atomic_read(&p->mm->mm_users) != 1) {
		read_lock(&tasklist_lock);
		do_each_thread(g, t) {
			if (t->mm == mm && t != p)
				goto no_unlock;
		} while_each_thread(g, t);
		read_unlock(&tasklist_lock);
	}

	return true;

no_unlock:
	read_unlock(&tasklist_lock);
no:
	return false;
}
back to top