얼렁뚱땅 넘어가긴했네요.. ㅋㅋ
done_list가 필요하지 않은 데이터라는 걸 알아서,,
해제 부분은 잘 파고든거 같구요..
바빠서 언제 다시 정리할 수 있을지 잘 모르겠습니다.
우선 대충.... 써놓은거만 옮겨둡니다.
===========================================
<< 의문점 >>
배치는 무엇을 말하나....??
===========================================
<< 변수 >>
rcp->completed // 마지막 배치가 완료된 숫자...
rdp->passed_quiesc // There was a quiescent state since grace period.
rdp->qs_pending // Grace period already completed for this cpu.
cpus_empty 의 의미 : 모든 quienscent state를 지났으니, grace period를 종료한다.
done_list : old-data 를 의미.. 더 이상 필요로 되지 않는 데이터..
===========================================
<< 함수 >>
rcu_do_batch : donelist의 x 변수를 모든 레벨의 캐쉬에 등록한 다음,
donelist에 등록된 함수를 실행.. 리스트에 대해 반복 (최대 blimit만큼).
(list에 등록된 함수는 free역할을 하는 콜백함수이다.)
donelist에 남아있는 queue의 길이(qlen)을 갱신
queue가 남아있으면, donetail에 남은 리스트를 보관하고,
queue가 비어있게 되면, tasklet_schedule을 실행한다.
이 함수는 tacklet context에서 __rcu_process_callbacks에서 호출된다.
그리고 다시 그 함수는 tasklet_init 함수로 등록되어 있다.
call_rcu : 지정한 오브젝트의 삭제를 요청하는 함수.. (오브젝트의 정지상태에서)
force_quiescent_state : call_rcu에서 callback 함수 queue가 많은 경우 호출되는 함수
코드에서는 단순히 need_resched를 셋 함.
===========================================
<< 요약 >>
Grace Period 시작 : rcu_start_batch 를 호출..
(Grace Period = Quiescent Period)
그리고.. :
Period 시작을 BroadCase로 알려주지 않기 때문에...
rcu_check_quiescent_state 호출을 최소 두번이상 하는 것으로 각 시나리오 케이스를 진행함..
첫번째 호출시 Grace Period 시작으로 인지 하고 모든 CPU마스크를 셋한다.
두번째 호출에서는... 해당 CPU 마스크를 클리어해준다.
CPU마스크가 모두 클리어되었다면... Grace Period의 종료 작업이 이루어진다..
필요한 경우, Grace Period가 종료될 때 다음 Grace Period를 위해 rcu_start_batch(0)을 호출한다.
done_list가 필요하지 않은 데이터라는 걸 알아서,,
해제 부분은 잘 파고든거 같구요..
바빠서 언제 다시 정리할 수 있을지 잘 모르겠습니다.
우선 대충.... 써놓은거만 옮겨둡니다.
===========================================
<< 의문점 >>
배치는 무엇을 말하나....??
===========================================
<< 변수 >>
rcp->completed // 마지막 배치가 완료된 숫자...
rdp->passed_quiesc // There was a quiescent state since grace period.
rdp->qs_pending // Grace period already completed for this cpu.
cpus_empty 의 의미 : 모든 quienscent state를 지났으니, grace period를 종료한다.
done_list : old-data 를 의미.. 더 이상 필요로 되지 않는 데이터..
===========================================
<< 함수 >>
rcu_do_batch : donelist의 x 변수를 모든 레벨의 캐쉬에 등록한 다음,
donelist에 등록된 함수를 실행.. 리스트에 대해 반복 (최대 blimit만큼).
(list에 등록된 함수는 free역할을 하는 콜백함수이다.)
donelist에 남아있는 queue의 길이(qlen)을 갱신
queue가 남아있으면, donetail에 남은 리스트를 보관하고,
queue가 비어있게 되면, tasklet_schedule을 실행한다.
이 함수는 tacklet context에서 __rcu_process_callbacks에서 호출된다.
그리고 다시 그 함수는 tasklet_init 함수로 등록되어 있다.
call_rcu : 지정한 오브젝트의 삭제를 요청하는 함수.. (오브젝트의 정지상태에서)
force_quiescent_state : call_rcu에서 callback 함수 queue가 많은 경우 호출되는 함수
코드에서는 단순히 need_resched를 셋 함.
===========================================
<< 요약 >>
Grace Period 시작 : rcu_start_batch 를 호출..
(Grace Period = Quiescent Period)
그리고.. :
Period 시작을 BroadCase로 알려주지 않기 때문에...
rcu_check_quiescent_state 호출을 최소 두번이상 하는 것으로 각 시나리오 케이스를 진행함..
첫번째 호출시 Grace Period 시작으로 인지 하고 모든 CPU마스크를 셋한다.
두번째 호출에서는... 해당 CPU 마스크를 클리어해준다.
CPU마스크가 모두 클리어되었다면... Grace Period의 종료 작업이 이루어진다..
필요한 경우, Grace Period가 종료될 때 다음 Grace Period를 위해 rcu_start_batch(0)을 호출한다.
댓글 0
.