227 lines
7.9 KiB
JSON
227 lines
7.9 KiB
JSON
{
|
|
"version": "1.1",
|
|
"id": "virtio-balloon-inflate-deflate",
|
|
"title": "balloon target 은 VM Boundary 를 건너 driver 에 닿고 확보한 page 는 같은 경계를 되건너 온다",
|
|
"question": "Host 가 balloon target 을 바꾸면 그 요청은 어떤 순서로 어느 경계를 건너 Guest 안의 driver 까지 가고, 확보된 page 는 어떻게 Host 로 돌아오는가",
|
|
"type": "sequence",
|
|
"direction": "LR",
|
|
"audience": [
|
|
"Host RAM 압박에 ballooning 을 쓸지 판단하려는 사람",
|
|
"Guest 안의 메모리 압박을 Host 조치와 이어 보려는 사람"
|
|
],
|
|
"summary": "balloon target 조정은 Host Memory Management 에서 QEMU 쪽 device 와 virtqueue 를 지나 VM Boundary 를 넘어 Guest kernel 의 driver 까지 가고, driver 가 확보한 Guest page 는 같은 경계를 반대 방향으로 되건너 Host 의 회수 가능 backing 이 된다.",
|
|
"alt": "virtio-balloon Driver, virtqueue, QEMU virtio-balloon Device, Host Memory Management 네 참여자 사이의 순서도. 앞 세 메시지는 오른쪽에서 왼쪽으로 Guest 안으로 들어가고 뒤 세 메시지는 왼쪽에서 오른쪽으로 Host 로 돌아온다.",
|
|
"long_description": "참여자는 왼쪽부터 Guest kernel 의 virtio-balloon Driver, virtqueue, QEMU virtio-balloon Device, Host Memory Management 네 개다. 메시지는 위에서 아래로 읽는다. 1번은 Host Memory Management 가 QEMU 쪽 device 에 balloon target 조정을 보내는 것이고, 2번에서 그 요청이 virtqueue 로 내려가면서 VM Boundary 를 넘고, 3번에서 Guest kernel 의 driver 에 balloon target 이 닿는다. 여기서 방향이 바뀐다. 4번에서 driver 가 확보한 Guest page 를 virtqueue 에 올리고, 5번에서 그것이 다시 VM Boundary 를 넘어 QEMU 쪽 device 로 가고, 6번에서 device 가 Host Memory Management 에 회수 가능 backing 으로 넘긴다. target 을 올릴 때와 내릴 때 Guest 가 쓸 수 있는 memory 가 어느 쪽으로 움직이는지는 본문의 표가 맡는다.",
|
|
"source_context": {
|
|
"document": "docs/virtualization/final/document.md",
|
|
"document_sha256": "181e2b3cc8a45bae81e7e8193d026937c4d586ae4495d3b2c323eb7e6abcfadd",
|
|
"anchor": {
|
|
"kind": "heading",
|
|
"value": "65. virtio-balloon 구조",
|
|
"line": 3008
|
|
}
|
|
},
|
|
"composition": {
|
|
"profile": "sequence",
|
|
"diagram_only": true,
|
|
"reference_ids": [
|
|
"payment-approval-sequence"
|
|
],
|
|
"rationale": "이 절과 다음 절이 세운 것은 조각들의 나열이 아니라 balloon 요청이 지나는 차례와 그 차례가 VM Boundary 를 두 번 건넌다는 사실이다. two-zone-pipeline 으로 구역 둘을 그려 보니 같은 구역 안의 이음이 캔버스 맨 위로 튀어 올라가고 경계 라벨이 건너편 상자에 먹혔다. orchestrator-workers 는 QEMU 아래에 교체 가능한 워커들을 두는 그림이라 driver 가 Guest 안에 있다는 사실이 지워진다. sequence 는 참여자를 한 줄로 세우고 메시지에 번호를 붙이므로 경계를 두 번 건너는 왕복이 그대로 드러난다.",
|
|
"focus_node": "balloon-driver"
|
|
},
|
|
"groups": [],
|
|
"nodes": [
|
|
{
|
|
"id": "balloon-driver",
|
|
"label": "virtio-balloon Driver",
|
|
"kind": "driver",
|
|
"role": "participant",
|
|
"shape": "box",
|
|
"emphasis": "primary",
|
|
"details": [
|
|
"Guest Kernel"
|
|
],
|
|
"description": "Guest kernel 쪽 balloon driver. target 을 받아 Guest page 를 확보한다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3013,
|
|
"end_line": 3015
|
|
},
|
|
{
|
|
"start_line": 3046,
|
|
"end_line": 3046
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "virtqueue",
|
|
"label": "virtqueue",
|
|
"kind": "queue",
|
|
"role": "participant",
|
|
"shape": "box",
|
|
"description": "Guest 와 QEMU 가 balloon 요청을 주고받는 공유 큐. VM Boundary 바로 안쪽이다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3017,
|
|
"end_line": 3017
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "qemu-balloon-device",
|
|
"label": "QEMU virtio-balloon\nDevice",
|
|
"kind": "service",
|
|
"role": "participant",
|
|
"shape": "box",
|
|
"description": "Host 쪽 balloon device. 경계를 넘어온 내용을 Host memory management 로 넘긴다.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3022,
|
|
"end_line": 3022
|
|
},
|
|
{
|
|
"start_line": 3037,
|
|
"end_line": 3041
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "host-memory-management",
|
|
"label": "Host Memory\nManagement",
|
|
"kind": "service",
|
|
"role": "participant",
|
|
"shape": "box",
|
|
"description": "balloon target 을 정하는 쪽이자 회수 기회가 생기는 자리.",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3025,
|
|
"end_line": 3025
|
|
},
|
|
{
|
|
"start_line": 3034,
|
|
"end_line": 3037
|
|
}
|
|
],
|
|
"assumption": false
|
|
}
|
|
],
|
|
"edges": [
|
|
{
|
|
"id": "target-adjust",
|
|
"from": "host-memory-management",
|
|
"to": "qemu-balloon-device",
|
|
"label": "Balloon target 조정",
|
|
"kind": "control",
|
|
"order": 1,
|
|
"style": "solid",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3034,
|
|
"end_line": 3041
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "target-crosses-in",
|
|
"from": "qemu-balloon-device",
|
|
"to": "virtqueue",
|
|
"label": "VM Boundary",
|
|
"kind": "control",
|
|
"order": 2,
|
|
"style": "solid",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3017,
|
|
"end_line": 3022
|
|
},
|
|
{
|
|
"start_line": 3041,
|
|
"end_line": 3046
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "target-to-driver",
|
|
"from": "virtqueue",
|
|
"to": "balloon-driver",
|
|
"label": "Balloon target",
|
|
"kind": "control",
|
|
"order": 3,
|
|
"style": "solid",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3013,
|
|
"end_line": 3017
|
|
},
|
|
{
|
|
"start_line": 3043,
|
|
"end_line": 3046
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "pages-secured",
|
|
"from": "balloon-driver",
|
|
"to": "virtqueue",
|
|
"label": "Guest pages 확보",
|
|
"kind": "data",
|
|
"order": 4,
|
|
"style": "solid",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3046,
|
|
"end_line": 3050
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "pages-cross-out",
|
|
"from": "virtqueue",
|
|
"to": "qemu-balloon-device",
|
|
"label": "VM Boundary",
|
|
"kind": "data",
|
|
"order": 5,
|
|
"style": "solid",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3017,
|
|
"end_line": 3025
|
|
}
|
|
],
|
|
"assumption": false
|
|
},
|
|
{
|
|
"id": "reclaimable-backing",
|
|
"from": "qemu-balloon-device",
|
|
"to": "host-memory-management",
|
|
"label": "회수 가능 backing",
|
|
"kind": "data",
|
|
"order": 6,
|
|
"style": "solid",
|
|
"evidence": [
|
|
{
|
|
"start_line": 3022,
|
|
"end_line": 3028
|
|
},
|
|
{
|
|
"start_line": 3077,
|
|
"end_line": 3079
|
|
}
|
|
],
|
|
"assumption": false
|
|
}
|
|
],
|
|
"legend": [],
|
|
"metadata": {
|
|
"rationale": "sequence 로 고른 이유는 §65 의 구조가 §66 의 차례와 붙어야 뜻이 나기 때문이다. 구조만 그리면 화살표가 한 방향뿐이고, 차례만 적으면 경계가 어디인지 안 보인다. deflate 쪽 절(§68)은 prepare 가 잡아 온 문맥(L2986-L3083) 밖이라 그 방향은 그리지 않았고, target 을 올릴 때와 내릴 때 Guest usable memory 가 어느 쪽으로 가는지는 기록 본문의 표가 이미 맡고 있어 그림에 넣지 않았다. 노드 라벨의 줄바꿈은 렌더러가 22자까지만 접기 때문에 넣었다 — 접지 않으면 글자가 상자 밖으로 나간다."
|
|
}
|
|
}
|