1. 09 5月, 2007 40 次提交
    • D
      rtc-cmos wakeup interface · 87ac84f4
      David Brownell 提交于
      I finally got around to testing the updated wakeup event hooks for rtc-cmos,
      and they follow in two patches:
      
       - Interface update ... when a simple enable_irq_wake() doesn't suffice,
         the platform data can hold suspend/resume callback hooks.
      
       - ACPI implementation ... provides callback hooks to do ACPI magic, and
         eliminate the legacy /proc/acpi/alarm file.
      
      The interface update could go into 2.6.21, but that's not essential; they
      will be NOPs on most PCs, without the ACPI stuff.
      
      I suspect the ACPI folk may have opinions about how to merge that second
      patch, and how to obsolete that legacy procfs file.  I'd like to see that
      merge into 2.6.22 if possible...
      
      As for how to kick it in ... two ways:
      
       - The appended "rtcwake" program; updated since the last time it was
         posted, it deals much better with timezones and DST.
      
       - Write the /sys/class/rtc/.../wakealarm file, then go to sleep.
      
      For some reason RTC wake from "swsusp" stopped working on a system where
      it previously worked; the alarm setting appears to get clobbered.  But
      on the bright side, RTC wake from "standby" worked on a system that had
      never been able to resume from that state before ... IDEACPI is my guess
      as to why it finally started to work.  It's the old "two steps forward,
      one step back" dance, I guess.
      
      - Dave
      
      /* gcc -Wall -Os -o rtcwake rtcwake.c */
      
      #include <stdio.h>
      #include <getopt.h>
      #include <fcntl.h>
      #include <stdlib.h>
      #include <string.h>
      #include <unistd.h>
      #include <errno.h>
      #include <time.h>
      
      #include <sys/ioctl.h>
      #include <sys/time.h>
      #include <sys/types.h>
      
      #include <linux/rtc.h>
      
      /* constants from legacy PC/AT hardware */
      #define	RTC_PF	0x40
      #define	RTC_AF	0x20
      #define	RTC_UF	0x10
      
      /*
       * rtcwake -- enter a system sleep state until specified wakeup time.
       *
       * This uses cross-platform Linux interfaces to enter a system sleep state,
       * and leave it no later than a specified time.  It uses any RTC framework
       * driver that supports standard driver model wakeup flags.
       *
       * This is normally used like the old "apmsleep" utility, to wake from a
       * suspend state like ACPI S1 (standby) or S3 (suspend-to-RAM).  Most
       * platforms can implement those without analogues of BIOS, APM, or ACPI.
       *
       * On some systems, this can also be used like "nvram-wakeup", waking
       * from states like ACPI S4 (suspend to disk).  Not all systems have
       * persistent media that are appropriate for such suspend modes.
       *
       * The best way to set the system's RTC is so that it holds the current
       * time in UTC.  Use the "-l" flag to tell this program that the system
       * RTC uses a local timezone instead (maybe you dual-boot MS-Windows).
       */
      
      static char		*progname;
      
      #ifdef	DEBUG
      #define	VERSION	"1.0 dev (" __DATE__ " " __TIME__ ")"
      #else
      #define	VERSION	"0.9"
      #endif
      
      static unsigned		verbose;
      static int		rtc_is_utc = -1;
      
      static int may_wakeup(const char *devname)
      {
      	char	buf[128], *s;
      	FILE	*f;
      
      	snprintf(buf, sizeof buf, "/sys/class/rtc/%s/device/power/wakeup",
      			devname);
      	f = fopen(buf, "r");
      	if (!f) {
      		perror(buf);
      		return 0;
      	}
      	fgets(buf, sizeof buf, f);
      	fclose(f);
      
      	s = strchr(buf, '\n');
      	if (!s)
      		return 0;
      	*s = 0;
      
      	/* wakeup events could be disabled or not supported */
      	return strcmp(buf, "enabled") == 0;
      }
      
      /* all times should be in UTC */
      static time_t	sys_time;
      static time_t	rtc_time;
      
      static int get_basetimes(int fd)
      {
      	struct tm	tm;
      	struct rtc_time	rtc;
      
      	/* this process works in RTC time, except when working
      	 * with the system clock (which always uses UTC).
      	 */
      	if (rtc_is_utc)
      		setenv("TZ", "UTC", 1);
      	tzset();
      
      	/* read rtc and system clocks "at the same time", or as
      	 * precisely (+/- a second) as we can read them.
      	 */
      	if (ioctl(fd, RTC_RD_TIME, &rtc) < 0) {
      		perror("read rtc time");
      		return 0;
      	}
      	sys_time = time(0);
      	if (sys_time == (time_t)-1) {
      		perror("read system time");
      		return 0;
      	}
      
      	/* convert rtc_time to normal arithmetic-friendly form,
      	 * updating tm.tm_wday as used by asctime().
      	 */
      	memset(&tm, 0, sizeof tm);
      	tm.tm_sec = rtc.tm_sec;
      	tm.tm_min = rtc.tm_min;
      	tm.tm_hour = rtc.tm_hour;
      	tm.tm_mday = rtc.tm_mday;
      	tm.tm_mon = rtc.tm_mon;
      	tm.tm_year = rtc.tm_year;
      	tm.tm_isdst = rtc.tm_isdst;	/* stays unspecified? */
      	rtc_time = mktime(&tm);
      
      	if (rtc_time == (time_t)-1) {
      		perror("convert rtc time");
      		return 0;
      	}
      
      	if (verbose) {
      		if (!rtc_is_utc) {
      			printf("\ttzone   = %ld\n", timezone);
      			printf("\ttzname  = %s\n", tzname[daylight]);
      			gmtime_r(&rtc_time, &tm);
      		}
      		printf("\tsystime = %ld, (UTC) %s",
      				(long) sys_time, asctime(gmtime(&sys_time)));
      		printf("\trtctime = %ld, (UTC) %s",
      				(long) rtc_time, asctime(&tm));
      	}
      
      	return 1;
      }
      
      static int setup_alarm(int fd, time_t *wakeup)
      {
      	struct tm		*tm;
      	struct rtc_wkalrm	wake;
      
      	tm = gmtime(wakeup);
      
      	wake.time.tm_sec = tm->tm_sec;
      	wake.time.tm_min = tm->tm_min;
      	wake.time.tm_hour = tm->tm_hour;
      	wake.time.tm_mday = tm->tm_mday;
      	wake.time.tm_mon = tm->tm_mon;
      	wake.time.tm_year = tm->tm_year;
      	wake.time.tm_wday = tm->tm_wday;
      	wake.time.tm_yday = tm->tm_yday;
      	wake.time.tm_isdst = tm->tm_isdst;
      
      	/* many rtc alarms only support up to 24 hours from 'now' ... */
      	if ((rtc_time + (24 * 60 * 60)) > *wakeup) {
      		if (ioctl(fd, RTC_ALM_SET, &wake.time) < 0) {
      			perror("set rtc alarm");
      			return 0;
      		}
      		if (ioctl(fd, RTC_AIE_ON, 0) < 0) {
      			perror("enable rtc alarm");
      			return 0;
      		}
      
      	/* ... so use the "more than 24 hours" request only if we must */
      	} else {
      		/* avoid an extra AIE_ON call */
      		wake.enabled = 1;
      
      		if (ioctl(fd, RTC_WKALM_SET, &wake) < 0) {
      			perror("set rtc wake alarm");
      			return 0;
      		}
      	}
      
      	return 1;
      }
      
      static void suspend_system(const char *suspend)
      {
      	FILE	*f = fopen("/sys/power/state", "w");
      
      	if (!f) {
      		perror("/sys/power/state");
      		return;
      	}
      
      	fprintf(f, "%s\n", suspend);
      	fflush(f);
      
      	/* this executes after wake from suspend */
      	fclose(f);
      }
      
      int main(int argc, char **argv)
      {
      	static char		*devname = "rtc0";
      	static unsigned		seconds = 0;
      	static char		*suspend = "standby";
      
      	int		t;
      	int		fd;
      	time_t		alarm = 0;
      
      	progname = strrchr(argv[0], '/');
      	if (progname)
      		progname++;
      	else
      		progname = argv[0];
      	if (chdir("/dev/") < 0) {
      		perror("chdir /dev");
      		return 1;
      	}
      
      	while ((t = getopt(argc, argv, "d:lm:s:t:uVv")) != EOF) {
      		switch (t) {
      
      		case 'd':
      			devname = optarg;
      			break;
      
      		case 'l':
      			rtc_is_utc = 0;
      			break;
      
      		/* what system power mode to use?  for now handle only
      		 * standardized mode names; eventually when systems define
      		 * their own state names, parse /sys/power/state.
      		 *
      		 * "on" is used just to test the RTC alarm mechanism,
      		 * bypassing all the wakeup-from-sleep infrastructure.
      		 */
      		case 'm':
      			if (strcmp(optarg, "standby") == 0
      					|| strcmp(optarg, "mem") == 0
      					|| strcmp(optarg, "disk") == 0
      					|| strcmp(optarg, "on") == 0
      					) {
      				suspend = optarg;
      				break;
      			}
      			printf("%s: unrecognized suspend state '%s'\n",
      					progname, optarg);
      			goto usage;
      
      		/* alarm time, seconds-to-sleep (relative) */
      		case 's':
      			t = atoi(optarg);
      			if (t < 0) {
      				printf("%s: illegal interval %s seconds\n",
      						progname, optarg);
      				goto usage;
      			}
      			seconds = t;
      			break;
      
      		/* alarm time, time_t (absolute, seconds since 1/1 1970 UTC) */
      		case 't':
      			t = atoi(optarg);
      			if (t < 0) {
      				printf("%s: illegal time_t value %s\n",
      						progname, optarg);
      				goto usage;
      			}
      			alarm = t;
      			break;
      
      		case 'u':
      			rtc_is_utc = 1;
      			break;
      
      		case 'v':
      			verbose++;
      			break;
      
      		case 'V':
      			printf("%s: version %s\n", progname, VERSION);
      			break;
      
      		default:
      usage:
      			printf("usage: %s [options]"
      				"\n\t"
      				"-d rtc0|rtc1|...\t(select rtc)"
      				"\n\t"
      				"-l\t\t\t(RTC uses local timezone)"
      				"\n\t"
      				"-m standby|mem|...\t(sleep mode)"
      				"\n\t"
      				"-s seconds\t\t(seconds to sleep)"
      				"\n\t"
      				"-t time_t\t\t(time to wake)"
      				"\n\t"
      				"-u\t\t\t(RTC uses UTC)"
      				"\n\t"
      				"-v\t\t\t(verbose messages)"
      				"\n\t"
      				"-V\t\t\t(show version)"
      				"\n",
      				progname);
      			return 1;
      		}
      	}
      
      	if (!alarm && !seconds) {
      		printf("%s: must provide wake time\n", progname);
      		goto usage;
      	}
      
      	/* REVISIT:  if /etc/adjtime exists, read it to see what
      	 * the util-linux version of hwclock assumes.
      	 */
      	if (rtc_is_utc == -1) {
      		printf("%s: assuming RTC uses UTC ...\n", progname);
      		rtc_is_utc = 1;
      	}
      
      	/* this RTC must exist and (if we'll sleep) be wakeup-enabled */
      	fd = open(devname, O_RDONLY);
      	if (fd < 0) {
      		perror(devname);
      		return 1;
      	}
      	if (strcmp(suspend, "on") != 0 && !may_wakeup(devname)) {
      		printf("%s: %s not enabled for wakeup events\n",
      				progname, devname);
      		return 1;
      	}
      
      	/* relative or absolute alarm time, normalized to time_t */
      	if (!get_basetimes(fd))
      		return 1;
      	if (verbose)
      		printf("alarm %ld, sys_time %ld, rtc_time %ld, seconds %u\n",
      				alarm, sys_time, rtc_time, seconds);
      	if (alarm) {
      		if (alarm < sys_time) {
      			printf("%s: time doesn't go backward to %s",
      					progname, ctime(&alarm));
      			return 1;
      		}
      		alarm += sys_time - rtc_time;
      	} else
      		alarm = rtc_time + seconds + 1;
      	if (setup_alarm(fd, &alarm) < 0)
      		return 1;
      
      	sync();
      	printf("%s: wakeup from \"%s\" using %s at %s",
      			progname, suspend, devname,
      			ctime(&alarm));
      	fflush(stdout);
      	usleep(10 * 1000);
      
      	if (strcmp(suspend, "on") != 0)
      		suspend_system(suspend);
      	else {
      		unsigned long data;
      
      		do {
      			t = read(fd, &data, sizeof data);
      			if (t < 0) {
      				perror("rtc read");
      				break;
      			}
      			if (verbose)
      				printf("... %s: %03lx\n", devname, data);
      		} while (!(data & RTC_AF));
      	}
      
      	if (ioctl(fd, RTC_AIE_OFF, 0) < 0)
      		perror("disable rtc alarm interrupt");
      
      	close(fd);
      	return 0;
      }
      
      This patch:
      
      Make rtc-cmos do the relevant magic so this RTC can wake the system from a
      sleep state.  That magic comes in two basic flavors:
      
       - Straightforward:  enable_irq_wake(), the way it'd work on most SOC chips;
         or generally with system sleep states which don't disable core IRQ logic.
      
       - Roundabout, using non-IRQ platform hooks.  This is needed with ACPI and
         one almost-clone chip which uses a special wakeup-only alarm.  (That's
         the RTC used on Footbridge boards, FWIW, which don't do PM in Linux.)
      
      A separate patch implements those hooks for ACPI platforms, so that rtc_cmos
      can issue system wakeup events (and its sysfs "wakealarm" attribute works on
      at least some systems).
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Cc: Len Brown <lenb@kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      87ac84f4
    • Y
      rtc: update vr41xx alarm handling · 9b5ef64a
      Yoichi Yuasa 提交于
      - vr41xx_rtc_read_alarm() reports alarm enabled.
      - vr41xx_rtc_set_alarm() sets alarm disable/enable by rtc_wkalrm.enabled.
      Signed-off-by: NYoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
      Acked-by: NAlessandro Zummo <a.zummo@towertech.it>
      Acked-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      9b5ef64a
    • A
      RTC Kconfig cleanup · 09a21e56
      Alessandro Zummo 提交于
      Signed-off-by: NAlessandro Zummo <a.zummo@towertech.it>
      Cc: David Brownell <david-b@pacbell.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      09a21e56
    • D
      rtc: update to class device removal patches · cb3a58d2
      David Brownell 提交于
      Fix a goof in the revised classdev support for RTCs: make sure the /dev
      node info is ready before the device is registered, not after.  Otherwise
      the /sys/class/rtc/rtcN/dev attribute won't be created and then udev won't
      have the information it needs to create the /dev/rtcN node.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Alessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      cb3a58d2
    • D
    • D
      rtc: suspend()/resume() restores system clock · 7ca1d488
      David Brownell 提交于
      RTC class suspend/resume support, re-initializing the system clock on resume
      from the clock used to initialize it at boot time.
      
       - The reinit-on-resume is hooked to the existing RTC_HCTOSYS config
         option, on the grounds that a clock good enough for init must also
         be good enough for re-init.
      
       - Inlining a version of the code used by ARM, to save and restore the
         delta between a selected RTC and the current system wall-clock time.
      
       - Removes calls to that ARM code from AT91, OMAP1, and S3C RTCs.  This
         means that systems using those RTCs across suspend/resume will likely
         want to change their kernel configs to enable RTC_HCTOSYS.
      
         If HCTOSYS isn't using a second RTC (with battery?), this changes the
         system's initial date from Jan 1970 to the epoch this hardware uses:
         1998 for AT91, 2000 for OMAP1 (assuming no split power mode), etc.
      
      This goes on top of the patch series removing "struct class_device" usage
      from the RTC framework.  That's all needed for class suspend()/resume().
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7ca1d488
    • D
      rtc: remove rest of class_device · cd966209
      David Brownell 提交于
      Finish converting the RTC framework so it no longer uses class_device.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      cd966209
    • D
      rtc: simplified /proc/driver/rtc handling · 7d9f99ec
      David Brownell 提交于
      This simplifies the RTC procfs support by removing the class_interface that
      hooks it into the rtc core.  If it's configured, then sysfs support is now
      part of the RTC core, and is never a separate module.
      
      It also removes the class_interface hook, now that its last remaining user is
      gone.  (That API is usable only with a "struct class_device".)
      
      It's another step towards being able to remove "struct class_device".
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      7d9f99ec
    • D
      rtc: simplified rtc sysfs attribute handling · 446ecbd9
      David Brownell 提交于
      This simplifies the RTC sysfs support by removing the class_interface that
      hooks it into the rtc core.  If it's configured, then sysfs support is now
      part of the RTC core, and is never a separate module.
      
      It's another step towards being able to remove "struct class_device".
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      446ecbd9
    • D
      rtc: rtc interfaces don't use class_device · ab6a2d70
      David Brownell 提交于
      This patch removes class_device from the programming interface that the RTC
      framework exposes to the rest of the kernel.  Now an rtc_device is passed,
      which is more type-safe and streamlines all the relevant code.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      ab6a2d70
    • D
      rtc: remove /sys/class/rtc-dev/* · 5726fb20
      David Brownell 提交于
      This simplifies the /dev support by removing a superfluous class_device (the
      /sys/class/rtc-dev stuff) and the class_interface that hooks it into the rtc
      core.  Accordingly, if it's configured then /dev support is now part of the
      RTC core, and is never a separate module.
      
      It's another step towards being able to remove "struct class_device".
      
      [bunk@stusta.de: drivers/rtc/rtc-dev.c should #include "rtc-core.h"]
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Acked-by: NGreg Kroah-Hartman <gregkh@suse.de>
      Acked-By: NAlessandro Zummo <a.zummo@towertech.it>
      Signed-off-by: NAdrian Bunk <bunk@stusta.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      5726fb20
    • U
      utimensat implementation · 1c710c89
      Ulrich Drepper 提交于
      Implement utimensat(2) which is an extension to futimesat(2) in that it
      
      a) supports nano-second resolution for the timestamps
      b) allows to selectively ignore the atime/mtime value
      c) allows to selectively use the current time for either atime or mtime
      d) supports changing the atime/mtime of a symlink itself along the lines
         of the BSD lutimes(3) functions
      
      For this change the internally used do_utimes() functions was changed to
      accept a timespec time value and an additional flags parameter.
      
      Additionally the sys_utime function was changed to match compat_sys_utime
      which already use do_utimes instead of duplicating the work.
      
      Also, the completely missing futimensat() functionality is added.  We have
      such a function in glibc but we have to resort to using /proc/self/fd/* which
      not everybody likes (chroot etc).
      
      Test application (the syscall number will need per-arch editing):
      
      #include <errno.h>
      #include <fcntl.h>
      #include <time.h>
      #include <sys/time.h>
      #include <stddef.h>
      #include <syscall.h>
      
      #define __NR_utimensat 280
      
      #define UTIME_NOW       ((1l << 30) - 1l)
      #define UTIME_OMIT      ((1l << 30) - 2l)
      
      int
      main(void)
      {
        int status = 0;
      
        int fd = open("ttt", O_RDWR|O_CREAT|O_EXCL, 0666);
        if (fd == -1)
          error (1, errno, "failed to create test file \"ttt\"");
      
        struct stat64 st1;
        if (fstat64 (fd, &st1) != 0)
          error (1, errno, "fstat failed");
      
        struct timespec t[2];
        t[0].tv_sec = 0;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 0;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        struct stat64 st2;
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
          {
            puts ("atim not reset to zero");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim not reset to zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0] = st1.st_atim;
        t[1].tv_sec = 0;
        t[1].tv_nsec = UTIME_OMIT;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
            || st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
          {
            puts ("atim not set");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim changed from zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = UTIME_OMIT;
        t[1] = st1.st_mtim;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != st1.st_atim.tv_sec
            || st2.st_atim.tv_nsec != st1.st_atim.tv_nsec)
          {
            puts ("mtim changed from original time");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != st1.st_mtim.tv_sec
            || st2.st_mtim.tv_nsec != st1.st_mtim.tv_nsec)
          {
            puts ("mtim not set");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        sleep (2);
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = UTIME_NOW;
        t[1].tv_sec = 0;
        t[1].tv_nsec = UTIME_NOW;
        if (syscall(__NR_utimensat, AT_FDCWD, "ttt", t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        struct timeval tv;
        gettimeofday(&tv,NULL);
      
        if (st2.st_atim.tv_sec <= st1.st_atim.tv_sec
            || st2.st_atim.tv_sec > tv.tv_sec)
          {
            puts ("atim not set to NOW");
            status = 1;
          }
        if (st2.st_mtim.tv_sec <= st1.st_mtim.tv_sec
            || st2.st_mtim.tv_sec > tv.tv_sec)
          {
            puts ("mtim not set to NOW");
            status = 1;
          }
      
        if (symlink ("ttt", "tttsym") != 0)
          error (1, errno, "cannot create symlink");
      
        t[0].tv_sec = 0;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 0;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, AT_FDCWD, "tttsym", t, AT_SYMLINK_NOFOLLOW) != 0)
          error (1, errno, "utimensat failed");
      
        if (lstat64 ("tttsym", &st2) != 0)
          error (1, errno, "lstat failed");
      
        if (st2.st_atim.tv_sec != 0 || st2.st_atim.tv_nsec != 0)
          {
            puts ("symlink atim not reset to zero");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 0 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("symlink mtim not reset to zero");
            status = 1;
          }
        if (status != 0)
          goto out;
      
        t[0].tv_sec = 1;
        t[0].tv_nsec = 0;
        t[1].tv_sec = 1;
        t[1].tv_nsec = 0;
        if (syscall(__NR_utimensat, fd, NULL, t, 0) != 0)
          error (1, errno, "utimensat failed");
      
        if (fstat64 (fd, &st2) != 0)
          error (1, errno, "fstat failed");
      
        if (st2.st_atim.tv_sec != 1 || st2.st_atim.tv_nsec != 0)
          {
            puts ("atim not reset to one");
            status = 1;
          }
        if (st2.st_mtim.tv_sec != 1 || st2.st_mtim.tv_nsec != 0)
          {
            puts ("mtim not reset to one");
            status = 1;
          }
      
        if (status == 0)
           puts ("all OK");
      
       out:
        close (fd);
        unlink ("ttt");
        unlink ("tttsym");
      
        return status;
      }
      
      [akpm@linux-foundation.org: add missing i386 syscall table entry]
      Signed-off-by: NUlrich Drepper <drepper@redhat.com>
      Cc: Alexey Dobriyan <adobriyan@openvz.org>
      Cc: Michael Kerrisk <mtk-manpages@gmx.net>
      Cc: <linux-arch@vger.kernel.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1c710c89
    • J
      rcutorture: Remove redundant assignment to cur_ops in for loop · ade5fb81
      Josh Triplett 提交于
      The for loop in rcutorture_init uses the condition
      cur_ops = torture_ops[i], cur_ops
      but then makes the same assignment to cur_ops inside the loop.  Remove the
      redundant assignment inside the loop, and remove now-unnecessary braces.
      Signed-off-by: NJosh Triplett <josh@kernel.org>
      Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      ade5fb81
    • J
      rcutorture: style cleanup: avoid != NULL in boolean tests · c8e5b163
      Josh Triplett 提交于
      Signed-off-by: NJosh Triplett <josh@kernel.org>
      Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c8e5b163
    • A
      rcutorture: Use ARRAY_SIZE macro when appropriate · 788e770e
      Ahmed S. Darwish 提交于
      Use ARRAY_SIZE macro already defined in kernel.h
      Signed-off-by: NAhmed S. Darwish <darwish.07@gmail.com>
      Cc: "Paul E. McKenney" <paulmck@us.ibm.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      788e770e
    • S
      sched: align rq to cacheline boundary · c3396620
      Siddha, Suresh B 提交于
      Align the per cpu runqueue to the cacheline boundary.  This will minimize
      the number of cachelines touched during remote wakeup.
      Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Cc: Ravikiran G Thirumalai <kiran@scalex86.org>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      c3396620
    • D
      sched: redundant reschedule when set_user_nice() boosts a prio of a task from the "expired" array · bd53f96c
      Dmitry Adamushko 提交于
      - Make TASK_PREEMPTS_CURR(task, rq) return "true" only if the task's prio
        is higher than the current's one and the task is in the "active" array.
        This ensures we don't make redundant resched_task() calls when the task
        is in the "expired" array (as may happen now in set_user_prio(),
        rt_mutex_setprio() and pull_task() ) ;
      
      - generalise conditions for a call to resched_task() in set_user_nice(),
        rt_mutex_setprio() and sched_setscheduler()
      Signed-off-by: NDmitry Adamushko <dmitry.adamushko@gmail.com>
      Cc: Con Kolivas <kernel@kolivas.org>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      bd53f96c
    • S
      sched: optimize siblings status check logic in wake_idle() · 4953198b
      Siddha, Suresh B 提交于
      When a logical cpu 'x' already has more than one process running, then most
      likely the siblings of that cpu 'x' must be busy.  Otherwise the idle
      siblings would have likely(in most of the scenarios) picked up the extra
      load making the load on 'x' atmost one.
      
      Use this logic to eliminate the siblings status check and minimize the cache
      misses encountered on a heavily loaded system.
      Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      4953198b
    • E
      Speed up divides by cpu_power in scheduler · 5517d86b
      Eric Dumazet 提交于
      I noticed expensive divides done in try_to_wakeup() and
      find_busiest_group() on a bi dual core Opteron machine (total of 4 cores),
      moderatly loaded (15.000 context switch per second)
      
      oprofile numbers :
      
      CPU: AMD64 processors, speed 2600.05 MHz (estimated)
      Counted CPU_CLK_UNHALTED events (Cycles outside of halt state) with a unit
      mask of 0x00 (No unit mask) count 50000
      samples  %        symbol name
      ...
      613914    1.0498  try_to_wake_up
          834  0.0013 :ffffffff80227ae1:   div    %rcx
      77513  0.1191 :ffffffff80227ae4:   mov    %rax,%r11
      
      608893    1.0413  find_busiest_group
         1841  0.0031 :ffffffff802260bf:       div    %rdi
      140109  0.2394 :ffffffff802260c2:       test   %sil,%sil
      
      Some of these divides can use the reciprocal divides we introduced some
      time ago (currently used in slab AFAIK)
      
      We can assume a load will fit in a 32bits number, because with a
      SCHED_LOAD_SCALE=128 value, its still a theorical limit of 33554432
      
      When/if we reach this limit one day, probably cpus will have a fast
      hardware divide and we can zap the reciprocal divide trick.
      
      Ingo suggested to rename cpu_power to __cpu_power to make clear it should
      not be modified without changing its reciprocal value too.
      
      I did not convert the divide in cpu_avg_load_per_task(), because tracking
      nr_running changes may be not worth it ?  We could use a static table of 32
      reciprocal values but it would add a conditional branch and table lookup.
      
      [akpm@linux-foundation.org: !SMP build fix]
      Signed-off-by: NEric Dumazet <dada1@cosmosbay.com>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      5517d86b
    • S
      sched: dynticks idle load balancing · 46cb4b7c
      Siddha, Suresh B 提交于
      Fix the process idle load balancing in the presence of dynticks.  cpus for
      which ticks are stopped will sleep till the next event wakes it up.
      Potentially these sleeps can be for large durations and during which today,
      there is no periodic idle load balancing being done.
      
      This patch nominates an owner among the idle cpus, which does the idle load
      balancing on behalf of the other idle cpus.  And once all the cpus are
      completely idle, then we can stop this idle load balancing too.  Checks added
      in fast path are minimized.  Whenever there are busy cpus in the system, there
      will be an owner(idle cpu) doing the system wide idle load balancing.
      
      Open items:
      1. Intelligent owner selection (like an idle core in a busy package).
      2. Merge with rcu's nohz_cpu_mask?
      Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      46cb4b7c
    • S
      sched: fix idle load balancing in softirqd context · bdecea3a
      Siddha, Suresh B 提交于
      Periodic load balancing in recent kernels happen in the softirq.  In
      certain -rt configurations, these softirqs are handled in softirqd context.
       And hence the check for idle processor was always returning busy (as
      nr_running > 1).
      
      This patch captures the idle information at the tick and passes this info
      to softirq context through an element 'idle_at_tick' in rq.
      
      [kernel@kolivas.org: Fix reverse idle at tick logic]
      Signed-off-by: NSuresh Siddha <suresh.b.siddha@intel.com>
      Acked-by: NIngo Molnar <mingo@elte.hu>
      Cc: Thomas Gleixner <tglx@linutronix.de>
      Cc: Nick Piggin <nickpiggin@yahoo.com.au>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      bdecea3a
    • T
      ISDN: Spinlock initializer cleanup · 2bd7e20e
      Thomas Gleixner 提交于
      Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
      Cc: Karsten Keil <kkeil@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      2bd7e20e
    • M
      use mutex instead of semaphore in CAPI 2.0 interface · 9ea6e5d8
      Matthias Kaehlcke 提交于
      The CAPI 2.0 interface uses a semaphore as mutex.  Use the mutex API instead
      of the (binary) semaphore.
      Signed-off-by: NMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Karsten Keil <kkeil@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      9ea6e5d8
    • M
      sanitize linux/isdn_divertif.h for userspace · a7e27d5d
      Mike Frysinger 提交于
      the isdn_divertif contains kernel-only references so I've wrapped them in
      __KERNEL__ and add proper #include statements.
      Signed-off-by: NMike Frysinger <vapier@gentoo.org>
      Cc: Karsten Keil <kkeil@suse.de>
      Cc: David Woodhouse <dwmw2@infradead.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      a7e27d5d
    • M
      fix spinlock usage in hysdn_log_close() · 635244c5
      Matthias Kaehlcke 提交于
      Fix incorrect spinlock use in hysdn_log_close().  The function declared a
      spinlock on the stack and used it to 'protect' a shared driver structure.
      
      The patch simply removes the useless code.
      Signed-off-by: NMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Karsten Keil <kkeil@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      635244c5
    • A
      drivers/isdn/hardware/eicon/: remove unused header files · 13af68ee
      Armin Schindler 提交于
      As pointed out by Robert P.  J.  Day, here is a patch to remove unused
      header files from Eicon/Dialogic ISDN driver.
      Signed-off-by: NArmin Schindler <armin@melware.de>
      Acked-by: NKarsten Keil <kkeil@suse.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      13af68ee
    • A
    • J
      inode numbering: change libfs sb creation routines to avoid collisions with their root inodes · 1a1c9bb4
      Jeff Layton 提交于
      This patch makes it so that simple_fill_super and get_sb_pseudo assign their
      root inodes to be number 1.  It also fixes up a couple of callers of
      simple_fill_super that were passing in files arrays that had an index at
      number 1, and adds a warning for any caller that sends in such an array.
      
      It would have been nice to have made it so that it wasn't possible to make
      such a collision, but some callers need to be able to control what inode
      number their entries get, so I think this is the best that can be done.
      Signed-off-by: NJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      1a1c9bb4
    • J
      inode numbering: make static counters in new_inode and iunique be 32 bits · 866b04fc
      Jeff Layton 提交于
      The problems are:
      
      - on filesystems w/o permanent inode numbers, i_ino values can be larger
        than 32 bits, which can cause problems for some 32 bit userspace programs on
        a 64 bit kernel.  We can't do anything for filesystems that have actual
        >32-bit inode numbers, but on filesystems that generate i_ino values on the
        fly, we should try to have them fit in 32 bits.  We could trivially fix this
        by making the static counters in new_inode and iunique 32 bits, but...
      
      - many filesystems call new_inode and assume that the i_ino values they are
        given are unique.  They are not guaranteed to be so, since the static
        counter can wrap.  This problem is exacerbated by the fix for #1.
      
      - after allocating a new inode, some filesystems call iunique to try to get
        a unique i_ino value, but they don't actually add their inodes to the
        hashtable, and so they're still not guaranteed to be unique if that counter
        wraps.
      
      This patch set takes the simpler approach of simply using iunique and hashing
      the inodes afterward.  Christoph H.  previously mentioned that he thought that
      this approach may slow down lookups for filesystems that currently hash their
      inodes.
      
      The questions are:
      
      1) how much would this slow down lookups for these filesystems?
      2) is it enough to justify adding more infrastructure to avoid it?
      
      What might be best is to start with this approach and then only move to using
      IDR or some other scheme if these extra inodes in the hashtable prove to be
      problematic.
      
      I've done some cursory testing with this patch and the overhead of hashing and
      unhashing the inodes with pipefs is pretty low -- just a few seconds of system
      time added on to the creation and destruction of 10 million pipes (very
      similar to the overhead that the IDR approach would add).
      
      The hard thing to measure is what effect this has on other filesystems. I'm
      open to ways to try and gauge this.
      
      Again, I've only converted pipefs as an example. If this approach is
      acceptable then I'll start work on patches to convert other filesystems.
      
      With a pretty-much-worst-case microbenchmark provided by Eric Dumazet
      <dada1@cosmosbay.com>:
      
      hashing patch (pipebench):
      sys     1m15.329s
      sys     1m16.249s
      sys     1m17.169s
      
      unpatched (pipebench):
      sys     1m9.836s
      sys     1m12.541s
      sys     1m14.153s
      
      Which works out to 1.05642174294555027017.  So ~5-6% slowdown.
      
      This patch:
      
      When a 32-bit program that was not compiled with large file offsets does a
      stat and gets a st_ino value back that won't fit in the 32 bit field, glibc
      (correctly) generates an EOVERFLOW error.  We can't do anything about fs's
      with larger permanent inode numbers, but when we generate them on the fly, we
      ought to try and have them fit within a 32 bit field.
      
      This patch takes the first step toward this by making the static counters in
      these two functions be 32 bits.
      
      [jlayton@redhat.com: mention that it's only the case for 32bit, non-LFS stat]
      Signed-off-by: NJeff Layton <jlayton@redhat.com>
      Cc: Christoph Hellwig <hch@lst.de>
      Cc: Al Viro <viro@zeniv.linux.org.uk>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      866b04fc
    • J
      au1550 SPI controller driver · 63bd2359
      Jan Nikitenko 提交于
      Here is a driver for the Alchemy au1550 PSC (Programmable Serial
      Controller) in SPI master mode.
      
      It supports dma transfers using the Alchemy descriptor based dma controller
      for 4-8 bits per word SPI transfers.  For 9-24 bits per word transfers, pio
      irq based mode is used to avoid setup of dma channels from scratch on each
      number of bits per word change.
      
      Tested with au1550; this may also work on other MIPS Alchemy cpus, like
      au1200/au1210/au1250.  Used extensively with SD card connected via SPI;
      this handles 8.1MHz SPI clock transfers using dma without any problem (the
      highest SPI clock freq possible with au1550 running on 324MHz).
      
      The driver supports sharing of SPI bus by multiple devices.  All features
      of Alchemy SPI mode are supported (all SPI modes, msb/lsb first, bits per
      word in 4-24 range).
      
      As the SPI clock of the controller depends on main input clock that shall
      be configured externally, platform data structure for au1550 SPI controller
      driver contains mainclk_hz attribute to define the input clock rate.  From
      this value, dividers of the controller for SPI clock are set up for
      required frequency.
      Signed-off-by: NJan Nikitenko <jan.nikitenko@gmail.com>
      
      Whitespace and section fixups.  Remove partial workaround for platform
      setup bug in dma_mask setup; it couldn't work with multiple controllers.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      63bd2359
    • D
      SPI kerneldoc · 33e34dc6
      David Brownell 提交于
      Various documentation updates for the SPI infrastructure, to clarify things
      that may not have been clear, to cope with lack of editing, and fix
      omissions.
      
      Also, plug SPI into the kernel-api DocBook template, and fix all the
      resulting glitches in document generation.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: "Randy.Dunlap" <rdunlap@xenotime.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      33e34dc6
    • A
      /dev/spidevB.C interface · 814a8d50
      Andrea Paterniani 提交于
      Add a filesystem API for <linux/spi/spi.h> stack.  The initial version of
      this interface is purely synchronous.
      
      dbrownell@users.sourceforge.net:
      
       Cleaned up, bugfixed; much simplified; added preliminary documentation.
      
       Works with mdev given CONFIG_SYSFS_DEPRECATED; and presumably udev.
      
       Updated SPI_IOC_MESSAGE ioctl to full spi_message semantics, supporting
       groups of one or more transfers (each of which may be full duplex if
       desired).
      
       This is marked as EXPERIMENTAL with an explicit disclaimer that the API
       (notably the ioctls) is subject to change.
      Signed-off-by: NAndrea Paterniani <a.paterniani@swapp-eng.it>
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      814a8d50
    • D
      minor spi_butterfly cleanup · 735ce95e
      David Brownell 提交于
      Simplify the spi_butterfly driver by removing incomplete/unused support for
      the second SPI bus, implemented by the USI controller.  This should make
      this a clearer example of how to write a parport bitbang driver.
      Signed-off-by: NDavid Brownell <dbrownell@users.sourceforge.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      735ce95e
    • J
      8250: Remove commented out irq cruft · fef92c30
      Josh Boyer 提交于
      Remove some obviously old interrupt disable/enable code that has been
      commented out.
      Signed-off-by: NJosh Boyer <jwboyer@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      fef92c30
    • M
      use mutex instead of semaphore for misc char devices · 0e82d5b6
      Matthias Kaehlcke 提交于
      The misc character device driver uses a semaphore as mutex.  Use the mutex API
      instead of the (binary) semaphore.
      Signed-off-by: NMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      0e82d5b6
    • M
      use mutex instead of semaphore in hdaps driver · 6acc369a
      Matthias Kaehlcke 提交于
      The hdaps driver uses a semaphore as mutex.  Use the mutex API instead of the
      (binary) semaphore.
      Signed-off-by: NMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Robert Love <rlove@rlove.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      6acc369a
    • M
      use mutex instead of semaphore in TPM driver · d081d470
      Matthias Kaehlcke 提交于
      The TPM driver uses two semaphores as mutexes.  Use the mutex API instead of
      the (binary) semaphores.
      Signed-off-by: NMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Cc: Kylene Hall <kjhall@us.ibm.com>
      Cc: Marcel Selhorst <tpm@selhorst.net>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      d081d470
    • M
      use mutex instead of semaphore in RocketPort driver · 69f545ea
      Matthias Kaehlcke 提交于
      The RocketPort driver uses a semaphore as mutex.  Use the mutex API instead of
      the (binary) semaphore.
      Signed-off-by: NMatthias Kaehlcke <matthias.kaehlcke@gmail.com>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      69f545ea
    • S
      export hrtimer_forward · 6bdb6b62
      Stas Sergeev 提交于
      Other symbols of the hrtimers API are already exported.
      Signed-off-by: NStas Sergeev <stsp@aknet.ru>
      Acked-by: NThomas Gleixner <tglx@linutronix.de>
      Cc: Ingo Molnar <mingo@elte.hu>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      6bdb6b62
    • A
      Invalid return value of execve() resulting in oopses · b140f251
      Alexey Kuznetsov 提交于
      When elf loader fails to map executable (due to memory shortage or because
      binary is malformed), it can return 0.  Normally, this is invisible because
      process is killed with SIGKILL and it never returns to user space.
      
      But if exec() is called from kernel thread (hotplug, whatever)
      consequences are more interesting and vary depending on architecture.
      
      i386.   Nothing especially interesting, execve() just returns
              with "success"  :-)
      
      x86_64. Fake zero frame is used on way to caller, RSP/RIP are loaded
              with zeros, ergo... double fault.
      
      ia64.   Similar to i386, but r32...r95 are corrupted. Sometimes it
              oopses due to return to zero PC, sometimes it sees NaT in
              rXX and oopses due to NaT consumption.
      Signed-off-by: NAlexey Kuznetsov <alexey@openvz.org>
      Signed-off-by: NKirill Korotaev <dev@openvz.org>
      Signed-off-by: NPavel Emelianov <xemul@openvz.org>
      Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
      Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
      b140f251