From eef18466d920985c37ed8d22a6557b609c6225a6 Mon Sep 17 00:00:00 2001 From: Simon Wilkinson Date: Mon, 26 Apr 2010 22:13:39 +0100 Subject: [PATCH] Linux: Tidy up freezer code Linux now provides try_to_freeze(), which can be used to replace all of our refrigerator code. This has been in the tree for a long time, and actually predates many of the changes we've been modifying our code to work with. So, use try_to_freeze wherever we can, and keep a simpler compatibility function for kernels which are too old to have it. Change-Id: Iec50f83382f46d2b17b43da815a75755ea916bc6 Reviewed-on: http://gerrit.openafs.org/1845 Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- acinclude.m4 | 2 +- src/afs/LINUX/osi_compat.h | 22 +++++++++++++++++ src/afs/LINUX/osi_sleep.c | 59 +++++++--------------------------------------- src/cf/linux-test4.m4 | 37 +++++++++++++++++++---------- 4 files changed, 55 insertions(+), 65 deletions(-) diff --git a/acinclude.m4 b/acinclude.m4 index 59aa9ab..6535a91 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -868,7 +868,6 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_SIGNAL_RLIM LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_EXIT_STATE LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TGID - LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TODO LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_THREAD_INFO LINUX_EXPORTS_TASKLIST_LOCK LINUX_GET_SB_HAS_STRUCT_VFSMOUNT @@ -876,6 +875,7 @@ case $AFS_SYSNAME in *_linux* | *_umlinux*) AC_CHECK_LINUX_HEADER([freezer.h]) LINUX_HAVE_SVC_ADDR_IN LINUX_REFRIGERATOR + LINUX_HAVE_TRY_TO_FREEZE LINUX_LINUX_KEYRING_SUPPORT LINUX_KEY_ALLOC_NEEDS_STRUCT_TASK LINUX_KEY_ALLOC_NEEDS_CRED diff --git a/src/afs/LINUX/osi_compat.h b/src/afs/LINUX/osi_compat.h index efdd13b..53d486f 100644 --- a/src/afs/LINUX/osi_compat.h +++ b/src/afs/LINUX/osi_compat.h @@ -9,6 +9,10 @@ #ifndef AFS_LINUX_OSI_COMPAT_H #define AFS_LINUX_OSI_COMPAT_H +#if defined(HAVE_LINUX_FREEZER_H) +# include +#endif + #ifndef DO_SYNC_READ static inline int do_sync_read(struct file *fp, char *buf, size_t count, loff_t *offp) { @@ -267,6 +271,24 @@ kernel_getsockopt(struct socket *sockp, int level, int name, char *val, return ret; } +#endif +#ifdef HAVE_TRY_TO_FREEZE +static inline void +afs_try_to_freeze() { +# ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE + try_to_freeze(PF_FREEZE); +# else + try_to_freeze(); +# endif +} +#else +static inline void +afs_try_to_freeze() { +# ifdef CONFIG_PM + if (current->flags & PF_FREEZE) { + refrigerator(PF_FREEZE); +# endif +} #endif diff --git a/src/afs/LINUX/osi_sleep.c b/src/afs/LINUX/osi_sleep.c index 45464d7..992f47a 100644 --- a/src/afs/LINUX/osi_sleep.c +++ b/src/afs/LINUX/osi_sleep.c @@ -14,9 +14,7 @@ #include "afs/sysincludes.h" /* Standard vendor system headers */ #include "afsincludes.h" /* Afs-based standard headers */ #include "afs/afs_stats.h" /* afs statistics */ -#if defined(HAVE_LINUX_FREEZER_H) -#include -#endif +#include "osi_compat.h" static char waitV, dummyV; @@ -183,28 +181,8 @@ afs_osi_SleepSig(void *event) AFS_ASSERT_GLOCK(); AFS_GUNLOCK(); schedule(); -#ifdef CONFIG_PM - if ( -#ifdef PF_FREEZE - current->flags & PF_FREEZE -#else -#if defined(STRUCT_TASK_STRUCT_HAS_TODO) - !current->todo -#else -#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO) - test_ti_thread_flag(current->thread_info, TIF_FREEZE) -#else - test_ti_thread_flag(task_thread_info(current), TIF_FREEZE) -#endif -#endif -#endif - ) -#ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE - refrigerator(PF_FREEZE); -#else - refrigerator(); -#endif -#endif + try_to_freeze(); + AFS_GLOCK(); if (signal_pending(current)) { retval = EINTR; @@ -278,33 +256,12 @@ afs_osi_TimedSleep(void *event, afs_int32 ams, int aintok) * from artifically increasing. */ AFS_GUNLOCK(); - if (aintok) { - if (schedule_timeout(ticks)) + if (schedule_timeout(ticks)) { + if (aintok) code = EINTR; - } else - schedule_timeout(ticks); -#ifdef CONFIG_PM - if ( -#ifdef PF_FREEZE - current->flags & PF_FREEZE -#else -#if defined(STRUCT_TASK_STRUCT_HAS_TODO) - !current->todo -#else -#if defined(STRUCT_TASK_STRUCT_HAS_THREAD_INFO) - test_ti_thread_flag(current->thread_info, TIF_FREEZE) -#else - test_ti_thread_flag(task_thread_info(current), TIF_FREEZE) -#endif -#endif -#endif - ) -#ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE - refrigerator(PF_FREEZE); -#else - refrigerator(); -#endif -#endif + } + + try_to_freeze(); AFS_GLOCK(); remove_wait_queue(&evp->cond, &wait); diff --git a/src/cf/linux-test4.m4 b/src/cf/linux-test4.m4 index cd1d643..a4d5b71 100644 --- a/src/cf/linux-test4.m4 +++ b/src/cf/linux-test4.m4 @@ -483,8 +483,10 @@ AC_DEFUN([LINUX_REFRIGERATOR], [ [refrigerator(PF_FREEZE);], ac_cv_linux_func_refrigerator_takes_pf_freeze=yes, ac_cv_linux_func_refrigerator_takes_pf_freeze=no)]) - AC_MSG_RESULT($ac_cv_linux_func_refrigerator_takes_pf_freeze)]) - + AC_MSG_RESULT($ac_cv_linux_func_refrigerator_takes_pf_freeze) + if test "x$ac_cv_linux_func_refrigerator_takes_pf_freeze" = "xyes"; then + AC_DEFINE([LINUX_REFRIGERATOR_TAKES_PF_FREEZE], 1, [define if your refrigerator takes PF_FREEZE]) + fi]) AC_DEFUN([LINUX_IOP_I_CREATE_TAKES_NAMEIDATA], [ AC_MSG_CHECKING([whether inode_operations.create takes a nameidata]) @@ -711,17 +713,6 @@ AC_DEFUN([LINUX_HAVE_D_ALLOC_ANON], [ AC_DEFINE([HAVE_LINUX_D_ALLOC_ANON], 1, [define if your kernel has d_alloc_anon()]) fi]) -AC_DEFUN([LINUX_SCHED_STRUCT_TASK_STRUCT_HAS_TODO], [ - AC_MSG_CHECKING([for todo in struct task_struct]) - AC_CACHE_VAL([ac_cv_linux_sched_struct_task_struct_has_todo], [ - AC_TRY_KBUILD( -[#include ], -[struct task_struct _tsk; -printk("%d\n", _tsk.todo);], - ac_cv_linux_sched_struct_task_struct_has_todo=yes, - ac_cv_linux_sched_struct_task_struct_has_todo=no)]) - AC_MSG_RESULT($ac_cv_linux_sched_struct_task_struct_has_todo)]) - AC_DEFUN([LINUX_INIT_WORK_HAS_DATA], [ AC_MSG_CHECKING([whether INIT_WORK has a _data argument]) AC_CACHE_VAL([ac_cv_linux_init_work_has_data], [ @@ -1220,5 +1211,25 @@ AC_DEFUN([LINUX_HAVE_KERNEL_SETSOCKOPT], [ AC_MSG_RESULT($ac_cv_linux_have_kernel_setsockopt) if test "x$ac_cv_linux_have_kernel_setsockopt" = "xyes"; then AC_DEFINE([HAVE_KERNEL_SETSOCKOPT], 1, [define if your kernel has the kernel_setsockopt function]) + +AC_DEFUN([LINUX_HAVE_TRY_TO_FREEZE], [ + AC_MSG_CHECKING([for try_to_freeze]) + AC_CACHE_VAL([ac_cv_linux_have_try_to_freeze], [ + AC_TRY_KBUILD( +[#include +#ifdef FREEZER_H_EXISTS +#include +#endif], +[#ifdef LINUX_REFRIGERATOR_TAKES_PF_FREEZE + try_to_freeze(PF_FREEZE); +#else + try_to_freeze(); +#endif +], + ac_cv_linux_have_try_to_freeze=yes, + ac_cv_linux_have_try_to_freeze=no)]) + AC_MSG_RESULT($ac_cv_linux_have_try_to_freeze) + if test "x$ac_cv_linux_have_try_to_freeze" = "xyes"; then + AC_DEFINE([HAVE_TRY_TO_FREEZE], 1, [define if your kernel has the try_to_freeze function]) fi]) -- 1.9.4