2013 년 5 월 6 일 이전 fs/eventpoll.c
에 Linux 커널 의 파일에는 다음 줄 # 1605 가있었습니다 .
if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS))
에 5 월 6 하는 커밋 의 변경이 (패치) :
From 1c441e921201d523b5a6036aea22b0b426bf1af2 Mon Sep 17 00:00:00 2001
From: Colin Cross <ccross@android.com>
Date: Mon, 06 May 2013 23:50:16 +0000
Subject: epoll: use freezable blocking call
Avoid waking up every thread sleeping in an epoll_wait call during
suspend and resume by calling a freezable blocking call. Previous
patches modified the freezer to avoid sending wakeups to threads
that are blocked in freezable blocking calls.
This call was selected to be converted to a freezable call because
it doesn't hold any locks or release any resources when interrupted
that might be needed by another freezing task or a kernel driver
during suspend, and is a common site where idle userspace tasks are
blocked.
Acked-by: Tejun Heo <tj@kernel.org>
Signed-off-by: Colin Cross <ccross@android.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
---
(limited to 'fs/eventpoll.c')
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index deecc72..0cff443 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -34,6 +34,7 @@
#include <linux/mutex.h>
#include <linux/anon_inodes.h>
#include <linux/device.h>
+#include <linux/freezer.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/mman.h>
@@ -1602,7 +1603,8 @@ fetch_events:
}
spin_unlock_irqrestore(&ep->lock, flags);
- if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS))
+ if (!freezable_schedule_hrtimeout_range(to, slack,
+ HRTIMER_MODE_ABS))
timed_out = 1;
spin_lock_irqsave(&ep->lock, flags);
--
cgit v0.9.2
그런 다음 2013 년 10 월 29 일에 문제가 발생한 후 "epoll : freezable blocking call 사용" 을 되돌리기 로 결정했습니다 . 여기에 패치가 있습니다.
From c511851de162e8ec03d62e7d7feecbdf590d881d Mon Sep 17 00:00:00 2001
From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Date: Tue, 29 Oct 2013 12:12:56 +0000
Subject: Revert "epoll: use freezable blocking call"
This reverts commit 1c441e921201 (epoll: use freezable blocking call)
which is reported to cause user space memory corruption to happen
after suspend to RAM.
Since it appears to be extremely difficult to root cause this
problem, it is best to revert the offending commit and try to address
the original issue in a better way later.
References: https://bugzilla.kernel.org/show_bug.cgi?id=61781
Reported-by: Natrio <natrio@list.ru>
Reported-by: Jeff Pohlmeyer <yetanothergeek@gmail.com>
Bisected-by: Leo Wolf <jclw@ymail.com>
Fixes: 1c441e921201 (epoll: use freezable blocking call)
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Cc: 3.11+ <stable@vger.kernel.org> # 3.11+
---
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 473e09d..810c28f 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -34,7 +34,6 @@
#include <linux/mutex.h>
#include <linux/anon_inodes.h>
#include <linux/device.h>
-#include <linux/freezer.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/mman.h>
@@ -1605,8 +1604,7 @@ fetch_events:
}
spin_unlock_irqrestore(&ep->lock, flags);
- if (!freezable_schedule_hrtimeout_range(to, slack,
- HRTIMER_MODE_ABS))
+ if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS))
timed_out = 1;
spin_lock_irqsave(&ep->lock, flags);
--
cgit v0.9.2
커밋에는 다음 설명이 수반됩니다.
이는 RAM 일시 중단 후 사용자 공간 메모리 손상이 발생하는 것으로보고 된 커밋 1c441e921201 (epoll : 프리즈 블 블로킹 호출 사용)을 되돌립니다.
이 문제의 근본 원인을 찾기가 매우 어려우므로 문제가되는 커밋을 되돌리고 나중에 더 나은 방식으로 원래 문제를 해결하는 것이 가장 좋습니다.
질문 :
- 이 최신 커밋은 단순히 이전 패치를 되 돌리는 효과가있는 패치입니까 아니면 반대 패치입니까?
- 이것이 역 패치가 아니라고 가정하면 역 패치는 무엇입니까? 공급 동일한 이전 (5 월)을 투입하고 제안에 대한 패치 유틸리티 동작에 의존하는 반전 (아래 참조하고, "패치 노트 의 하단에 패치 보낸 사람에 대해"을
patch
맨)? - 이 최신 패치를 커널 소스에 적용하고 아래에 표시된 동작을 얻으려고하면 패치가 이미 적용되었다는 것을 의미하며이를 확인할 수 있으며 실제로 참조
freezable
또는 고정이 없습니다. 내 소스에 포함하고 이것이 커널 관리자의 의도입니까? - 나는 젠투 사용하고 소스 3.10.25을하고 변경 내역을 나타냅니다
Linux patch 3.10.25 and the date is 21 Dec 2013
? 변경된 .c 파일 자체를 보지 않고이 패치가 이미 배포 소스에 적용되었는지 어떻게 알 수 있습니까? 12 월 21 일의 소스 변경 로그에서 버전 소개 날짜를보고이 패치가 10 월 이전에 커널 트리에 추가 되었기 때문에 적용되었다고 결론을 내릴 수 있습니까?
Q3 :
# patch -p1 < october29.patch
patching file fs/eventpoll.c
Reversed (or previously applied) patch detected! Assume -R? [n]
보어
기고자는 다음과 같이 설명했습니다.
"역전 된 패치"는 누군가가 올바른 diff -u foo.c.orig foo.c 대신 diff -u foo.c foo.c.orig (여기서 foo.c가 최신 파일 임)로 패치를 만드는 경우입니다.
patch
맨 페이지의 발신자를 패치하기 위해 참고에서 찾은 내용으로 인해 이것을 묻고있었습니다 .
사람들이 이미 패치를 적용했는지 궁금해하기 때문에 역 패치를 보내지 않도록주의하십시오.
즉, 역전 된 패치 는 설명과 같은 실수 나 변경을 롤백하는 "기술"의 결과 일 수 있지만 혼동을 유발하므로 권장되지 않는 결과 일 수 있습니다.
실제로 diff -u new.c old.c
여기에서 (실수) 시도 할 수 있습니다.
--- new.c 2014-02-01 21:37:55.616888434 -0500
+++ old.c 2014-02-01 21:37:41.430887944 -0500
@@ -34,6 +34,7 @@
#include <linux/mutex.h>
#include <linux/anon_inodes.h>
#include <linux/device.h>
+#include <linux/freezer.h>
#include <asm/uaccess.h>
#include <asm/io.h>
#include <asm/mman.h>
@@ -1604,7 +1605,8 @@
}
spin_unlock_irqrestore(&ep->lock, flags);
- if (!schedule_hrtimeout_range(to, slack, HRTIMER_MODE_ABS))
+ if (!freezable_schedule_hrtimeout_range(to, slack,
+ HRTIMER_MODE_ABS))
timed_out = 1;
spin_lock_irqsave(&ep->lock, flags);
... 이것은 원래 5 월 6 일 커밋입니다. 따라서 패치가 이미 적용된 경우 유틸리티 에서 역전 동작을 트리거 하는 원래 패치 를 제출하는 것과 같이 역전 patch
된 패치가 적용되어 초기 패치가 적용되지 않은 상태로 효과적으로 롤백됩니다.
궁극적으로 패치가 내 소스에 적용된 것은 의심 할 여지가 없습니다. 이것은eventpoll.c
git 커널 트리 의 최신 파일입니다. 'freezable'에 대한 참조가 없습니다. 내 소식통도 패치를 적용하려고하면 이전에 적용된 패치 메시지가 트리거됩니다. 의심의 여지없이 트리의 최신 코드 (저장소 복제본이있는 경우 git 로그)를보고 배포 소스에있는 코드와 비교하십시오.