응답하지 않는 커널 모듈 제거

응답하지 않는 커널 모듈 제거

문맥: 가끔 노트북이 절전 모드로 전환되지 않고 오류가 발생하는 경우가 있습니다.

Freezing of tasks failed after 20.008 seconds (0 tasks refusing to freeze, wq_busy=1)

나는 이것이 잘못된 작업 대기열(https://askubuntu.com/questions/692700/what-does-wq-busy-1-indicate-in-a-failure-to-suspension) 많은 고민 끝에 마침내 매직 't' SysRq의 출력을 확인했는데, 이는 memstick과 관련된 작업 대기열이 분명히 정지되었음을 보여주었습니다. 의 출력은 cat /proc/WORKER-PID/stack항상 이라는 함수에 갇혀 있습니다 memstick_set_rw_addr. IIUC 이 함수는 memstick이라는 커널 모듈에서 제공됩니다. 이 모듈은 이라는 다른 모듈에 필요하며 rtsx_pci_ms해당 모듈을 제거하려고 합니다. 이렇게 했지만 modprobe -r rtsx_pci_ms아무 것도 표시되지 않고 반환되지 않습니다(그리고 일단 실행되면 modprobe를 죽일 수도 없고 killall -KILL modprobeCtrl+C에 전혀 응답하지 않습니다). [그때 전원을 꺼야해서 지금은 아무것도 테스트할 수 없지만 일주일에 한두번 정도 이런 일이 일어나서 다시 다루겠습니다. ]

그래서 지금질문"modprobe -r"이 멈춘 경우 모듈이 수행 중인 작업을 강제로 종료하려면 어떻게 해야 합니까?

답변1

커널 코드를 종료하고 싶지 않으면 강제로 종료할 수 없습니다. 커널 코드는 주변 장치에 액세스 중이거나 잠금을 보유하고 있거나 해제해야 하는 일부 리소스를 할당했을 수 있으므로 언제든지 종료될 수 없습니다. 커널이 보유하고 있기 때문에 사용자 모드 코드가 종료될 수 있습니다. 이러한 모든 리소스가 프로세스를 나타내고 프로세스가 종료되면 정리되도록 합니다. 그러나 커널 내부에서는 각 코드 조각이 자체 정리를 처리해야 합니다.

일반적으로 커널 코드는 신호를 확인하고 신호가 수신되면 실행 중인 작업을 완전히 종료합니다. 그런데 커널 오류가 발생했습니다. 이 경우에는 운이 좋지 않습니다. 코드가 붙어 있으면 붙어 있는 것입니다. 중단된 코드는 프로세스의 시스템 호출 컨텍스트 내에서 실행되므로 해당 시스템 호출은 결코 반환되지 않습니다(커널 내부 상황이 어떻게든 자체적으로 수정되지 않는 한). 프로세스가 시스템 호출 중이므로 종료할 수 없습니다. KILL 시그널이 큐에 들어가고, 시스템 호출이 반환되면 프로세스는 즉시 종료되지만, 시스템 호출이 반환되지 않으면 프로세스가 중단됩니다.

관련 정보