-
[LINUX][KERNE][ISSUE] sysfs store() 무한으로 계속 write하는 이슈Linux/kernel 2023. 8. 3. 02:14
원인
- sysfs attribute를 만들고, shell에서 특정 값을 write하는데 쉘에서 응답이 없음. dmesg를 확인해보니, write가 계속 무한 루프를 돌고 있음.
원인 파악 과정
1. 리턴값을 정수 단위에서 아래로 구분.
- count 값보다 큰 경우 -> 정상 동작
- count 보다 엄청나게 큰 사이즈를 테스트 해보지는 않았다. buf 사이즈가 기본 PAGE_SIZE이기 때문에, count에 적당히 큰 값을 더해서 테스트했다.
- count 값과 같은 경우 -> 정상 동작
- count 값보다 작은 경우 -> 에러 발생.
- 만약 count 값보다 작거나 0 이라면, 무한 루프.
- 만약 음수를 리턴하면, Errno로 맵핑되는 문자열이 출력된다. 즉, 무한 루프를 돌지 않고 에러 메세지를 출력하고 종료한다.
- -EINVAL : bash: echo: write error: Invalid argument
- -ENDEV : bash: echo: write error: No such device
/* 정상 */ static ssize_t iic1602_string_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { return -ENODEV; } /* 정상 */ static ssize_t iic1602_string_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { return -EINVAL; } /* 정상 */ static ssize_t iic1602_string_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { return count; } /* 정상 */ static ssize_t iic1602_string_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) { return count+123; } /* 에러 */ static ssize_t iic1602_string_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { return 0; } /* 에러 */ static ssize_t iic1602_string_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) { return count-1; }
2. attribute를 등록하는 과정에 문제가 있을까 싶어 2가지로 등록을 해보았다.
- 그룹으로 등록. - sysfs_create_group() => 에러 발생.
- 단일 파일로 등록. - device_create_file() => 에러 발생.
2개 방식모두 무한 루프가 발생했다.
결론
일단 정확한 원인을 찾지는 못했다. 일단 확실하게 count가 동일하게 반환하는 것을 목표로 한다.
그리고 sysfs attribute의 show() / store() 함수 반환값에 의미는 아래의 링크를 참고하자.
'Linux > kernel' 카테고리의 다른 글
[리눅스 커널] Loadable Kernel Module(LKM) (0) 2023.08.03 [리눅스 커널] PM - Power Management Interface (2) 2023.08.03 [리눅스 커널] PM - Wakeup events framework (2) 2023.08.03 [리눅스 커널] PM - Linux legacy power management (0) 2023.03.01 [리눅스 커널] Interrupt - GICv2 part 1 (0) 2023.02.24 - count 값보다 큰 경우 -> 정상 동작