커밋을 되 돌리는 패치와 "리버스 패치"의 차이점은 무엇입니까?


2

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 : 프리즈 블 블로킹 호출 사용)을 되돌립니다.

이 문제의 근본 원인을 찾기가 매우 어려우므로 문제가되는 커밋을 되돌리고 나중에 더 나은 방식으로 원래 문제를 해결하는 것이 가장 좋습니다.

질문 :

  1. 이 최신 커밋은 단순히 이전 패치를 되 돌리는 효과가있는 패치입니까 아니면 반대 패치입니까?
  2. 이것이 역 패치가 아니라고 가정하면 역 패치는 무엇입니까? 공급 동일한 이전 (5 월)을 투입하고 제안에 대한 패치 유틸리티 동작에 의존하는 반전 (아래 참조하고, "패치 노트 의 하단에 패치 보낸 사람에 대해"을 patch맨)?
  3. 이 최신 패치를 커널 소스에 적용하고 아래에 표시된 동작을 얻으려고하면 패치가 이미 적용되었다는 것을 의미하며이를 확인할 수 있으며 실제로 참조 freezable또는 고정이 없습니다. 내 소스에 포함하고 이것이 커널 관리자의 의도입니까?
  4. 나는 젠투 사용하고 소스 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 로그)를보고 배포 소스에있는 코드와 비교하십시오.


나는 이것을 SO에서 발견했다 : stackoverflow.com/questions/6441902/…
slm

답변:


3

이전 패치를 취소하는 패치입니다. 그것은 함께 할 수 patch -R -pX bad.patch다음 (X 패치 및 bad.patch에서 제거 할 디렉토리 레벨의 번호입니다 우리는 취소 할 패치입니다)git commit

"역전 된 패치"는 누군가가 실수 diff -u foo.c foo.c.orig대신 (foo.c가 최신 파일 인) 패치를 만드는 경우 입니다.diff -u foo.c.orig foo.c

"역전 또는 이전에 적용된 패치"오류는 패치가 이미 적용되었음을 나타냅니다. kernelsuspend.patch파일 내용을 모르면 더 구체적으로 말할 수 없습니다 .

커널 소스에 대한 .git 디렉토리가있는 git log경우 파일 이름 뒤에 명령 을 사용하여 단일 파일의 로그를 볼 수 있습니다 . 예 git log fs/eventpoll.c또는 심지어 git log -p fs/eventpoll.c.


kernelsuspend.patch 파일은 Q의 10 월 패치 일뿐입니다. git repo가 ​​없습니다. 실제로 컴파일 할 수 있도록 설치된 Gentoo-sources 패키지 일뿐입니다. 감사합니다!

1
그런 다음 원래 문제가있는 패치는 이미 취소되었습니다.
samiam

0

되 돌린 패치

로부터 자식-되돌리기 매뉴얼 페이지

기존 커밋이 하나 이상 있으면 관련 패치가 도입 한 변경 사항을 되돌리고이를 기록하는 새로운 커밋을 기록하십시오. 이를 위해서는 작업 트리가 깨끗해야합니다 (HEAD 커밋의 수정 사항 없음).

참고 : git revert는 일부 새로운 커밋을 기록하여 이전 커밋의 효과를 되 돌리는 데 사용됩니다 (종종 결함이있는 것). 작업 디렉토리에서 커밋되지 않은 모든 변경 사항을 제거하려면 git-reset (1), 특히 --hard 옵션이 표시되어야합니다. 다른 커밋에서 특정 파일을 추출하려면 git-checkout (1), 특히 git checkout-구문이 표시되어야합니다. 두 가지 모두 작업 디렉토리에서 커밋되지 않은 변경 사항을 무시하므로 이러한 대안을주의하십시오.

반전 된 패치

이 Drupal 페이지에서 : Reversing patch :

패치 테스트를 완료했거나 특정 패치로 인해 문제가 발생했는지 확인하려는 경우 패치를 되돌릴 수 있습니다. 또한 동일한 패치의 최신 업데이트 버전을 추가하기 전에 패치를 되돌려 야합니다. 패치를 되돌리려면 patch 명령을 -R 옵션과 함께 사용하십시오.

   patch -p1 -R < path/file.patch

패치가 -p0 옵션과 함께 적용된 경우 대신 사용하십시오.

또는:

   git apply -R path/file.patch

나는 그들이 git-revert를 사용하여 이것을 달성 할 수 있었지만 여전히이 경우 예상되는 최종 사용자 결과는 무엇입니까? .. 그 "고정"참조가 없어야합니다. 패치를 이미 적용한 경우에는 아무 것도 지정하지 않아도된다는 의미에서 "리버스 패치"란 무엇입니까? 패치가 이미 적용된 경우 동작은 대화식으로 리버스 (-R)를 요청하고 원하지 않는 것을 선택할 수 있습니다. 소스의 모든 패치를 적용하고 끝없이 되돌릴 수 있기 때문에이 경우 이것이 무엇을 의미하는지 구체적으로 알아야합니다. 감사합니다!

@ illuminÉ-나는 당신과 마찬가지로 혼란 스럽습니다. 나는 그것을 소화하려고 노력하고 있지만이 시점을 지나도 진행되지 않았습니다.
slm

어제 패치를 두 번 적용하여 정확히 동일한 커널 롤을 다시 컴파일했습니다. 나는 그것을 기억할 것이다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.