<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[USB 드라이버 read 구현 시 Internal Retry Loop vs Short Read 반환에 대한 설계 조언 부탁드립니다.]]></title><description><![CDATA[<p dir="auto">안녕하세요, 리눅스 커널 기반의 USB 디바이스 드라이버를 공부하고 있는 컴퓨터 공학과 학부생입니다.</p>
<p dir="auto">현재 <code>usb-skeleton.c</code>의 <code>skel_read()</code> 함수 동작을 분석하던 중,<br />
retry 로직에 일관성 없는 부분을 발견하여 조언을 구합니다.</p>
<h2>현재 동작 분석</h2>
<p dir="auto">스켈레톤 코드는 다음과 같이 동작합니다:</p>
<pre><code class="language-c">retry:
    if (dev-&gt;ongoing_read) {
        // O_NONBLOCK 체크 후 대기
        if (file-&gt;f_flags &amp; O_NONBLOCK)
            return -EAGAIN;
        wait_event_interruptible(dev-&gt;bulk_in_wait, (!dev-&gt;ongoing_read));
    }
    
    // 데이터 복사
    chunk = min(available, count);
    copy_to_user(buffer, dev-&gt;bulk_in_buffer, chunk);
    
    // 데이터 부족 시
    if (available &lt; count) {
        usb_do_read_io(dev, count - chunk);
        // 여기서 goto retry가 없음!
    }
    return chunk;
</code></pre>
<h2>의문점</h2>
<p dir="auto"><strong>처음 진입 시</strong>: <code>ongoing_read</code>가 있으면 대기 (또는 -EAGAIN 반환)<br />
<strong>데이터 부족 시</strong>: URB 제출 후 대기 없이 즉시 반환</p>
<p dir="auto">이 두 동작이 일관성이 없어 보입니다.</p>
<h2>제안하는 수정</h2>
<pre><code class="language-c">if (available &lt; count) {
    usb_do_read_io(dev, count - chunk);
    goto retry;  // &lt;- 추가
}
</code></pre>
<p dir="auto">이렇게 하면:</p>
<ul>
<li>O_NONBLOCK 처리가 retry 레이블에서 일관되게 처리됨</li>
<li>Blocking I/O 시 요청한 count를 최대한 채우려 시도</li>
<li><code>wait_event_interruptible</code>로 시그널 인터럽트 가능</li>
</ul>
<h2>질문</h2>
<ol>
<li>현재 동작이 의도적인 설계인가요, 아니면 교육용 단순화인가요?</li>
<li><code>goto retry</code> 추가 시 제가 놓치고 있는 문제가 있을까요?</li>
<li>USB Bulk transfer 특성상 Short Read를 강제해야 하는 이유가 있나요?</li>
</ol>
<p dir="auto">조언 부탁드립니다. 감사합니다!</p>
]]></description><link>https://kernelmeet.com/topic/5/usb-드라이버-read-구현-시-internal-retry-loop-vs-short-read-반환에-대한-설계-조언-부탁드립니다.</link><generator>RSS for Node</generator><lastBuildDate>Wed, 12 Aug 2026 18:03:01 GMT</lastBuildDate><atom:link href="https://kernelmeet.com/topic/5.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 29 Dec 2025 12:18:28 GMT</pubDate><ttl>60</ttl></channel></rss>