Repository: koordinator-sh/koordinator

Issue:
[proposal] koordlet: Heterogeneous GPU device reporting
**What is your proposal**:
Introduce a heterogeneous GPU device reporting mechanism to koordlet.

**Why is this needed**:
Currently koordlet only supports NVIDIA GPU device reporting, as we extend the fine-grained device scheduling to GPUs of other vendors (such as Huawei Ascend), we need to introduce a general heterogeneous GPU device reporting mechanism to koordlet.

Hints from issue comments:
@zqzten: /assign @ZhuZhezz@koordinator-bot: @zqzten: GitHub didn't allow me to assign the following users: ZhuZhezz.

Note that only [koordinator-sh members](https://github.com/orgs/koordinator-sh/people), repo collaborators and people who have commented on this issue/PR can be assigned. Additionally, issues/PRs can only have 10 assignees at the same time.
For more information please see [the contributor guide](https://git.k8s.io/community/contributors/guide/first-contribution.md#issue-assignment-in-github)

<details>

In response to [this](https://github.com/koordinator-sh/koordinator/issues/2418#issuecomment-2820226231):

>/assign @ZhuZhezz


Instructions for interacting with me using PR comments are available [here](https://git.k8s.io/community/contributors/guide/pull-requests.md).  If you have questions or suggestions related to my behavior, please file an issue against the [kubernetes/test-infra](https://github.com/kubernetes/test-infra/issues/new?title=Prow%20issue:) repository.
</details>@ZhuZhezz: /assign@stale: This issue has been automatically marked as stale because it has not had recent activity.
This bot triages issues and PRs according to the following rules:
- After 90d of inactivity, `lifecycle/stale` is applied
- After 30d of inactivity since `lifecycle/stale` was applied, the issue is closed
You can:
- Mark this issue or PR as fresh with `/remove-lifecycle stale`
- Close this issue or PR with `/close`
Thank you for your contributions.
@zqzten: /remove-lifecycle stale

Solution patch:
diff --git a/apis/extension/cluster_colocation_profile.go b/apis/extension/cluster_colocation_profile.go
index 724f5dbf..20e16d36 100644
--- a/apis/extension/cluster_colocation_profile.go
+++ b/apis/extension/cluster_colocation_profile.go
@@ -22,6 +22,10 @@ import (
 
 const (
 	AnnotationSkipUpdateResource = "config.koordinator.sh/skip-update-resources"
+
+	// LabelControllerManaged indicates whether the colocation profile should be reconciled by the controller.
+	// If not specified, the controller only reconciles the profile if ReconcileByDefault is set to true.
+	LabelControllerManaged = "config.koordinator.sh/controller-managed"
 )
 
 func ShouldSkipUpdateResource(profile *configv1alpha1.ClusterColocationProfile) bool {
@@ -31,3 +35,7 @@ func ShouldSkipUpdateResource(profile *configv1alpha1.ClusterColocationProfile)
 	_, ok := profile.Annotations[AnnotationSkipUpdateResource]
 	return ok
 }
+
+func ShouldReconcileProfile(profile *configv1alpha1.ClusterColocationProfile) bool {
+	return profile != nil && profile.Labels != nil && profile.Labels[LabelControllerManaged] == "true"
+}
diff --git a/docs/images/GPU-device-reporting.svg b/docs/images/GPU-device-reporting.svg
new file mode 100644
index 00000000..ffca7a72
--- /dev/null
+++ b/docs/images/GPU-device-reporting.svg
@@ -0,0 +1,3 @@
+<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 4091.9756269881327 2079.9580832160173" width="8183.951253976265" height="4159.9161664320345"><!-- svg-source:excalidraw --><metadata></metadata><defs><symbol id="image-14721bba438dc5c68ff5c9a168f8091dcaff0009"><image href="data:image/png;base64,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" preserveAspectRatio="none" width="100%" height="100%"></image></symbol><symbol id="image-0b858fa0c556eaeb14b0626889e8a7c21e482120"><image href="data:image/png;base64,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" preserveAspectRatio="none" width="100%" height="100%"></image></symbol><symbol id="image-bd47b21b620a5e59c6d75605b842b6dcc528048c"><image href="data:image/png;base64,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" preserveAspectRatio="none" width="100%" height="100%"></image></symbol><symbol id="image-458ff5eba8b281ac15cb7329d5225f271705d0d2"><image href="data:image/png;base64,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" preserveAspectRatio="none" width="100%" height="100%"></image></symbol><symbol id="image-824088aec591dac2145046d068963f565b359fd0"><image href="data:image/png;base64,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" preserveAspectRatio="none" width="100%" height="100%"></image></symbol><style class="style-fonts">
+      @font-face { font-family: Comic Shanns; src: url(data:font/woff2;base64,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); }
+      @font-face { font-family: Virgil; src: url(data:font/woff2;base64,d09GMgABAAAAAAOsAAsAAAAABegAAANgAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAABmAAPBEICoQ0gzoLCgABNgIkAxAEIAWDHAcgG6MEUZQuSo7sLwXckMEb6CtDGFhSm9juYVCV6V2lie3ro/vZHOJrBCGwF0t/j9qS4BgnyGFj90k8fL8f7dz3ZdWaiGBJNXldGp3pS2OoRJO2CWuaRKtowiNp5X/G5T83A4N0UslbXGh8fSEKfWl1TjseyKenbXGCESVxEiTcdtDD+eeTnPzA/wqATkkd/qeT4x8CjiCBkJp3pDSRZ83PaOorqs3//l7rjnSk8s7S/2vCfe/DXIIaGBqVZrnjLJIDgltrxQ8aBvQeUBRJRFGeJh4GxnG6Ta+donREiEeEjAjPniJPe2IF6VyaBPZbtQqcn/2XFGUiyRAAcOLwrl2CVtQyqxfZmQA0HNkF4k16dCOQkKEVJdCKNgxKuZCcUlsrYEHbtUv3F4ztTSTIQSUy3OMdIoS/YXaCJ2Y9tNsn5gN4sMxGfZW+qBawzfx4DJngI8kx9IxdIADIB+rGp9zrsLQP8fx8RHPGxUAuOLVejpF3ncW4mcAG9ZEszcHRWH6kOMTggxDwPpBh0arHl0yLAUQZBMkVjQCg06pRIVFKpPrCS+plcj/P8yVez9D2AiZnua58GAIE7FzUyOX6LmvZbADM/gQyIwAh4KE/+aN0bijW/fc3Fn374+6DRxFjc5uPrrOLd1c25+Hoo/kw05wtjbF/vWuWPB8wemzr/fm5cjPj3TjY9Q+zcSicXcjXhq5b8apsjFCPWiz08G6E31+OGqqvJaob9MrFi66zaF8P3sucphQ/d+x+Kavd6Q9riS63QEoyHAsOKm/sfLLZY85OEjV2vUw97uasuoanR3WmZ29Lf9gSCe58QUwFtUfd2VnWjKn2b3xjPuDuptK45Uo7FlgKKU3qnW7fbTxdcY2P0S1VFhDIWPhnWXFCX4DZD3h/eu8F4Pu1f6/Fh755ApUSCP4pFv0HW1YRbIc8doL4X5U2ATKWdCCQ+6wECSGwBQAqnIQSeRUWHwVCrTtI6t1C5qgicu1uFDq5LLEGHLWlZsOWXbqyNRuadi2pGbempm7LgX1Co9Gkh6b6WKYUxMXrwVMp8bDJYzaO3BOX5QjdSVMjEQcOddVs2bCpQahcoRIKTT4iXNYlnHKgqUZY0LZPGG/oG4vNOLCqpksvDNm1S3jV1RPXplljC1wtCQoDCsoAAA==); }</style></defs><rect x="0" y="0" width="4091.9756269881327" height="2079.9580832160173" fill="#ffffff"></rect><g stroke-linecap="round" transform="translate(881.4602875382589 1456.0367081877366) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C104.09 0, 208.17 0, 317.98 0 M0 0 C65.88 0, 131.76 0, 317.98 0 M317.98 0 C317.98 21.67, 317.98 43.33, 317.98 83.74 M317.98 0 C317.98 26.79, 317.98 53.58, 317.98 83.74 M317.98 83.74 C220.23 83.74, 122.48 83.74, 0 83.74 M317.98 83.74 C211.39 83.74, 104.79 83.74, 0 83.74 M0 83.74 C0 52.08, 0 20.41, 0 0 M0 83.74 C0 54.7, 0 25.66, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1000.8495697648214 1475.4068253752366) rotate(0 39.5999755859375 22.5)"><text x="39.5999755859375" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">NVML</text></g><g transform="translate(859.5153985216566 1308.208049187734) rotate(0 188.09988403320312 22.5)"><text x="188.09988403320312" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get infos from NVML</text></g><g stroke-linecap="round"><g transform="translate(1048.3141362761344 1540.7769425627366) rotate(0 0.015052430968353292 93.89482764572858)"><path d="M0 0 C0.01 31.3, 0.03 156.49, 0.03 187.79" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(1048.3141362761344 1540.7769425627366) rotate(0 0.015052430968353292 93.89482764572858)"><path d="M-8.52 164.3 C-6.8 169.03, -5.08 173.76, 0.03 187.79" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(1048.3141362761344 1540.7769425627366) rotate(0 0.015052430968353292 93.89482764572858)"><path d="M8.58 164.3 C6.86 169.03, 5.13 173.76, 0.03 187.79" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g transform="translate(859.5153986769255 1600.5592871877361) rotate(0 217.79986572265625 22.5)"><text x="217.79986572265625" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get infos from drivers</text></g><g stroke-linecap="round" transform="translate(889.8326855382584 246.9189001877353) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C123.19 0, 246.38 0, 317.98 0 M0 0 C74.54 0, 149.08 0, 317.98 0 M317.98 0 C317.98 27.42, 317.98 54.84, 317.98 83.74 M317.98 0 C317.98 21.7, 317.98 43.4, 317.98 83.74 M317.98 83.74 C230.39 83.74, 142.81 83.74, 0 83.74 M317.98 83.74 C216.47 83.74, 114.96 83.74, 0 83.74 M0 83.74 C0 57.42, 0 31.09, 0 0 M0 83.74 C0 60.28, 0 36.82, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(910.2220287999771 266.2890173752353) rotate(0 138.59991455078125 22.5)"><text x="138.59991455078125" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">metric advisor</text></g><g stroke-linecap="round"><g transform="translate(1048.5397009053013 1225.8794806895949) rotate(0 -0.19360889747804322 111.13501973859775)"><path d="M0 0 C-0.06 37.05, -0.32 185.23, -0.39 222.27" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(1048.5397009053013 1225.8794806895949) rotate(0 -0.19360889747804322 111.13501973859775)"><path d="M-8.9 198.76 C-6.34 205.83, -3.78 212.89, -0.39 222.27" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(1048.5397009053013 1225.8794806895949) rotate(0 -0.19360889747804322 111.13501973859775)"><path d="M8.2 198.79 C5.62 205.85, 3.04 212.91, -0.39 222.27" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(2632.174582538257 246.91890018773393) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C80.39 0, 160.78 0, 317.98 0 M0 0 C66.18 0, 132.37 0, 317.98 0 M317.98 0 C317.98 31.38, 317.98 62.76, 317.98 83.74 M317.98 0 C317.98 23.99, 317.98 47.98, 317.98 83.74 M317.98 83.74 C213.61 83.74, 109.25 83.74, 0 83.74 M317.98 83.74 C230.52 83.74, 143.07 83.74, 0 83.74 M0 83.74 C0 64.96, 0 46.19, 0 0 M0 83.74 C0 53.49, 0 23.24, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2642.663931903491 266.2890173752339) rotate(0 148.49990844726562 22.5)"><text x="148.49990844726562" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">states informer</text></g><g stroke-linecap="round"><g transform="translate(1215.6271671632603 569.4723862640271) rotate(0 296.5658987393035 121.44770188468124)"><path d="M0 0 C98.86 40.48, 494.28 202.41, 593.13 242.9 M0 0 C98.86 40.48, 494.28 202.41, 593.13 242.9" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1215.6271671632603 569.4723862640271) rotate(0 296.5658987393035 121.44770188468124)"><path d="M568.15 241.91 C577.99 242.3, 587.83 242.69, 593.13 242.9 M568.15 241.91 C575.06 242.18, 581.96 242.45, 593.13 242.9" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1215.6271671632603 569.4723862640271) rotate(0 296.5658987393035 121.44770188468124)"><path d="M574.63 226.08 C581.92 232.7, 589.21 239.33, 593.13 242.9 M574.63 226.08 C579.75 230.73, 584.86 235.38, 593.13 242.9" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(2249.691543434743 586.5735461877352) rotate(0 98.99993896484375 22.5)"><text x="98.99993896484375" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">read cache</text></g><g stroke-linecap="round" transform="translate(3857.999189407532 770.4579638287041) rotate(0 91.60515356803626 52.34580203887799)"><path d="M26.17 0 C72.62 0, 119.06 0, 157.04 0 M26.17 0 C67.82 0, 109.47 0, 157.04 0 M157.04 0 C174.49 0, 183.21 8.72, 183.21 26.17 M157.04 0 C174.49 0, 183.21 8.72, 183.21 26.17 M183.21 26.17 C183.21 40.24, 183.21 54.31, 183.21 78.52 M183.21 26.17 C183.21 40.23, 183.21 54.3, 183.21 78.52 M183.21 78.52 C183.21 95.97, 174.49 104.69, 157.04 104.69 M183.21 78.52 C183.21 95.97, 174.49 104.69, 157.04 104.69 M157.04 104.69 C108.08 104.69, 59.13 104.69, 26.17 104.69 M157.04 104.69 C113.15 104.69, 69.27 104.69, 26.17 104.69 M26.17 104.69 C8.72 104.69, 0 95.97, 0 78.52 M26.17 104.69 C8.72 104.69, 0 95.97, 0 78.52 M0 78.52 C0 59.29, 0 40.06, 0 26.17 M0 78.52 C0 62.57, 0 46.61, 0 26.17 M0 26.17 C0 8.72, 8.72 0, 26.17 0 M0 26.17 C0 8.72, 8.72 0, 26.17 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(3889.148364582008 799.9024774755726) rotate(0 60.45597839355469 22.901288392009064)"><text x="60.45597839355469" y="32.061803748812636" font-family="Comic Shanns, Segoe UI Emoji" font-size="36.64206142721444px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Device</text></g><g stroke-linecap="round"><g transform="translate(3940.613209659252 495.23311244082925) rotate(0 5.1438175166786095 134.27375794921795)"><path d="M0 0 C-42.62 20.24, -79.67 40.34, -106.29 51.33 M0 0 C-23.37 11.93, -45.63 23.49, -106.29 51.33 M-106.29 51.33 C-113.9 90.56, -122.91 128.07, -131.07 172.94 M-106.29 51.33 C-115.88 97.09, -125.41 141.84, -131.07 172.94 M-131.07 172.94 C-111.32 198.59, -94.25 220.75, -54.36 268.67 M-131.07 172.94 C-106.8 203.78, -82.84 234.16, -54.36 268.67 M-54.36 268.67 C-6.28 269.21, 41.01 271.27, 64.99 271.43 M-54.36 268.67 C-8.96 268.18, 35.88 268.65, 64.99 271.43 M64.99 271.43 C82.36 244.59, 105.71 220.01, 141.36 173.35 M64.99 271.43 C80.08 251.8, 96.18 231.35, 141.36 173.35 M141.36 173.35 C138.2 151.61, 134.87 127.86, 121.64 61.81 M141.36 173.35 C135.73 140.81, 129.69 109.18, 121.64 61.81 M121.64 61.81 C86.95 40.01, 50.34 22.96, 2.26 -2.88 M121.64 61.81 C92.18 45.82, 63.73 31.31, 2.26 -2.88" stroke="#aaa" stroke-width="4" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(3943.5668562892715 492.9086693784707) rotate(0 1.205844351408814 135.25554141647376)" fill-rule="evenodd"><path d="M-0.61 -1.17 L-106.47 50.45 L-131.93 171.17 L-58.7 268.17 L61.2 269.72 L137.2 170.95 L110.93 49.54 L-0.37 1.43" stroke="none" stroke-width="0" fill="#228be6" fill-rule="evenodd"></path><path d="M0 0 C-32.57 17.36, -70.09 33.74, -107.72 51.85 M0 0 C-39.27 19.82, -77.14 36.41, -107.72 51.85 M-107.72 51.85 C-112.81 80.29, -117.32 106.06, -133.85 172.84 M-107.72 51.85 C-117.61 95.36, -126.9 138.37, -133.85 172.84 M-133.85 172.84 C-114.62 199.65, -91.41 225.1, -59.89 268.9 M-133.85 172.84 C-116.54 193.34, -100.82 212.81, -59.89 268.9 M-59.89 268.9 C-22.65 270.12, 12.5 271.52, 59.89 270.51 M-59.89 268.9 C-11.48 269.05, 35.37 271.51, 59.89 270.51 M59.89 270.51 C83.71 243.45, 102.36 214.61, 136.26 172.44 M59.89 270.51 C77.08 248.65, 93.72 226.35, 136.26 172.44 M136.26 172.44 C126.64 126.01, 115 76.55, 109.73 51.45 M136.26 172.44 C127.85 136.12, 120.01 97.42, 109.73 51.45 M109.73 51.45 C86.27 40.74, 64.64 29.68, 0 0 M109.73 51.45 C75.15 35.09, 40.43 19.28, 0 0 M0 0 C0 0, 0 0, 0 0 M0 0 C0 0, 0 0, 0 0" stroke="#fff" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(3878.769925208031 557.9828169695897) rotate(0 63.0946060493261 67.10515989582132)"><path d="M-0.98 1.17 L126.61 -1.87 L125.62 132.63 L-1.95 134.29" stroke="none" stroke-width="0" fill="#fff"></path><path d="M0 0 C38.63 0.34, 81.84 -2.27, 126.19 0 M0 0 C42.52 -2.15, 84.06 -0.56, 126.19 0 M126.19 0 C127.59 49.47, 127.29 99.71, 126.19 134.21 M126.19 0 C125.02 49.79, 125.38 98.44, 126.19 134.21 M126.19 134.21 C77.61 132.52, 26.65 136.24, 0 134.21 M126.19 134.21 C88.87 134.08, 49.67 135.21, 0 134.21 M0 134.21 C0.3 99.19, 0.78 62.66, 0 0 M0 134.21 C-1.15 99.43, -0.96 61.83, 0 0" stroke="#228be6" stroke-width="4" fill="none"></path></g><g stroke-linecap="round" transform="translate(3924.0318900470484 538.1883746698591) rotate(0 17.761024177336367 19.637137634211513)"><path d="M13.4 0.13 C16.78 -0.94, 21.73 0.48, 25.17 2.47 C28.61 4.45, 32.37 8.22, 34.02 12.04 C35.67 15.86, 36.14 21.4, 35.08 25.37 C34.01 29.34, 30.84 33.55, 27.65 35.84 C24.46 38.14, 19.72 39.59, 15.93 39.14 C12.15 38.68, 7.53 36.13, 4.95 33.1 C2.37 30.07, 0.77 25.23, 0.44 20.98 C0.11 16.72, 0.76 11.07, 2.99 7.59 C5.22 4.11, 12 1.21, 13.82 0.1 C15.64 -1.02, 13.88 0.52, 13.9 0.89 M17.88 0.33 C21.49 0.38, 25.89 2.94, 28.91 5.59 C31.93 8.25, 35.25 12.09, 36 16.26 C36.75 20.43, 35.43 26.94, 33.42 30.6 C31.42 34.27, 27.6 37.13, 23.97 38.25 C20.34 39.37, 15.33 38.78, 11.64 37.31 C7.94 35.84, 3.61 32.99, 1.8 29.44 C-0.01 25.89, -0.11 20.18, 0.79 16 C1.69 11.81, 4.29 7.06, 7.17 4.32 C10.06 1.58, 16.19 0.31, 18.13 -0.43 C20.07 -1.17, 18.67 -0.42, 18.82 -0.12" stroke="none" stroke-width="0" fill="#fff"></path><path d="M14.37 0.53 C17.74 -0.61, 22.12 -0.15, 25.47 1.84 C28.82 3.83, 32.95 8.48, 34.48 12.47 C36.02 16.45, 35.85 21.84, 34.71 25.77 C33.57 29.7, 30.83 33.85, 27.67 36.06 C24.51 38.28, 19.51 39.61, 15.73 39.05 C11.96 38.49, 7.59 35.81, 5.01 32.68 C2.43 29.54, 0.42 24.43, 0.25 20.26 C0.07 16.08, 1.51 10.88, 3.96 7.62 C6.42 4.36, 13.04 1.87, 14.98 0.68 C16.92 -0.5, 15.53 0.34, 15.58 0.52 M14.42 0.7 C17.89 -0.49, 23.29 -0.16, 26.57 1.81 C29.85 3.78, 32.78 8.46, 34.1 12.52 C35.43 16.57, 35.6 22.09, 34.51 26.12 C33.41 30.15, 30.61 34.42, 27.52 36.71 C24.44 39, 19.76 40.53, 16.03 39.86 C12.3 39.2, 7.75 36.05, 5.15 32.72 C2.56 29.4, 0.77 23.96, 0.47 19.92 C0.17 15.87, 1.15 11.81, 3.35 8.45 C5.56 5.09, 12.01 0.94, 13.71 -0.25 C15.41 -1.44, 13.43 0.98, 13.54 1.31" stroke="#fff" stroke-width="4" fill="none"></path></g><g stroke-linecap="round" transform="translate(3984.6198999423104 612.3401449961943) rotate(0 20.022800651904618 13.034300001109386)"><path d="M16.37 0.65 C20.37 0.2, 26.45 0.81, 30.25 2.2 C34.04 3.59, 37.74 6.46, 39.15 9.02 C40.56 11.58, 40.27 14.98, 38.72 17.54 C37.18 20.1, 33.62 23, 29.89 24.36 C26.15 25.71, 20.47 26.18, 16.31 25.67 C12.16 25.16, 7.74 23.49, 4.95 21.28 C2.16 19.07, -0.38 15.25, -0.4 12.4 C-0.43 9.55, 1.92 6.19, 4.8 4.16 C7.69 2.14, 14.77 0.88, 16.9 0.23 C19.03 -0.42, 17.44 0.13, 17.56 0.26 M16.29 0.71 C20.47 -0.01, 27.21 -0.17, 31.09 1.28 C34.97 2.74, 38.2 6.71, 39.58 9.45 C40.96 12.19, 40.95 15.31, 39.37 17.72 C37.8 20.14, 34.07 22.49, 30.14 23.93 C26.21 25.37, 20.02 26.77, 15.8 26.38 C11.57 25.99, 7.37 23.84, 4.8 21.59 C2.22 19.34, 0.38 15.8, 0.37 12.87 C0.37 9.94, 1.91 6.19, 4.76 3.99 C7.61 1.78, 15.31 0.32, 17.48 -0.38 C19.65 -1.08, 17.74 -0.48, 17.79 -0.22" stroke="none" stroke-width="0" fill="#fff"></path><path d="M17.48 -0.3 C21.49 -0.69, 27.93 0.93, 31.57 2.6 C35.2 4.27, 38.1 7.1, 39.28 9.71 C40.46 12.31, 40.36 15.73, 38.65 18.23 C36.95 20.73, 32.91 23.5, 29.05 24.7 C25.18 25.9, 19.65 26.15, 15.48 25.43 C11.31 24.72, 6.56 22.66, 4.04 20.42 C1.51 18.19, 0.08 14.7, 0.35 12.03 C0.62 9.36, 2.71 6.4, 5.67 4.4 C8.63 2.41, 15.85 0.83, 18.12 0.06 C20.39 -0.7, 19.28 -0.46, 19.31 -0.17 M20.86 -0.37 C24.84 -0.47, 29.86 1.61, 32.98 3.6 C36.09 5.58, 38.81 8.77, 39.55 11.54 C40.29 14.31, 39.49 17.78, 37.43 20.2 C35.38 22.62, 31.22 25.26, 27.22 26.06 C23.23 26.86, 17.49 26.21, 13.46 24.99 C9.43 23.78, 5.29 21.06, 3.06 18.79 C0.82 16.52, -0.61 14.12, 0.07 11.36 C0.75 8.61, 3.86 4.07, 7.15 2.25 C10.44 0.43, 17.61 0.89, 19.81 0.44 C22 -0.01, 20.3 -0.48, 20.33 -0.44" stroke="#fff" stroke-width="4" fill="none"></path></g><g stroke-linecap="round" transform="translate(3855.637623557708 610.6929532378122) rotate(0 23.941003757436192 14.753108792464445)"><path d="M18.66 0.75 C23.45 -0.12, 30.57 0.58, 35.12 1.95 C39.67 3.31, 44.01 6.1, 45.96 8.95 C47.92 11.81, 48.36 16.08, 46.85 19.08 C45.33 22.08, 41.14 25.26, 36.89 26.98 C32.64 28.69, 26.5 29.81, 21.35 29.36 C16.2 28.91, 9.53 26.66, 5.98 24.28 C2.42 21.9, 0.26 18.15, 0.01 15.09 C-0.23 12.03, 1.32 8.43, 4.49 5.95 C7.65 3.47, 16.4 1.18, 19 0.2 C21.61 -0.78, 20.05 -0.14, 20.12 0.06 M27.15 -0.54 C32.24 -0.4, 38.22 2.74, 41.79 5.11 C45.35 7.48, 48.19 10.73, 48.53 13.7 C48.86 16.67, 46.98 20.25, 43.79 22.91 C40.6 25.56, 34.39 28.72, 29.4 29.64 C24.4 30.55, 18.31 29.88, 13.81 28.42 C9.31 26.95, 4.6 23.9, 2.42 20.87 C0.23 17.83, -0.73 13.37, 0.71 10.22 C2.15 7.07, 6.65 3.77, 11.06 1.98 C15.48 0.18, 24.57 -0.23, 27.21 -0.54 C29.85 -0.86, 26.97 -0.2, 26.89 0.1" stroke="none" stroke-width="0" fill="#228be6"></path><path d="M24.99 0.37 C29.95 0.38, 36.06 1.97, 39.89 3.99 C43.72 6.02, 47.2 9.43, 47.98 12.51 C48.76 15.59, 47.27 19.79, 44.57 22.46 C41.87 25.13, 36.65 27.56, 31.77 28.52 C26.89 29.48, 20.07 29.34, 15.3 28.2 C10.53 27.05, 5.61 24.33, 3.15 21.66 C0.69 18.99, -0.39 15.26, 0.53 12.19 C1.45 9.11, 4.42 5.29, 8.65 3.2 C12.89 1.1, 22.95 -0.01, 25.93 -0.39 C28.91 -0.78, 26.57 0.52, 26.52 0.91 M25.6 0.52 C30.33 0.72, 36.65 2.61, 40.37 4.82 C44.08 7.03, 47.25 10.63, 47.9 13.79 C48.55 16.95, 47.1 21.27, 44.27 23.76 C41.45 26.24, 35.89 28.05, 30.95 28.68 C26.01 29.32, 19.43 28.68, 14.63 27.55 C9.83 26.42, 4.49 24.75, 2.15 21.9 C-0.19 19.05, -0.63 13.55, 0.6 10.44 C1.82 7.33, 5.32 5.1, 9.52 3.25 C13.72 1.4, 23.14 -0.08, 25.79 -0.66 C28.43 -1.25, 25.56 -0.63, 25.39 -0.26" stroke="#228be6" stroke-width="4" fill="none"></path></g><g stroke-linecap="round" transform="translate(3927.970826860572 662.8301532422502) rotate(0 16.61515164976663 20.05276923247584)"><path d="M20.8 0.89 C24.12 1.53, 27.9 4.71, 29.97 8.11 C32.04 11.52, 33.46 17.06, 33.23 21.33 C33 25.6, 30.99 30.64, 28.59 33.74 C26.19 36.85, 22.43 39.54, 18.83 39.96 C15.23 40.37, 10.01 38.68, 6.99 36.23 C3.96 33.78, 1.64 29.3, 0.65 25.28 C-0.34 21.26, -0.36 15.97, 1.03 12.09 C2.41 8.21, 5.64 3.96, 8.96 1.99 C12.28 0.01, 18.97 0.43, 20.95 0.23 C22.92 0.04, 20.85 0.53, 20.8 0.85 M20.31 0.94 C23.68 1.54, 27.95 4.18, 30.18 7.32 C32.42 10.46, 33.95 15.38, 33.74 19.78 C33.53 24.18, 31.25 30.3, 28.91 33.71 C26.57 37.12, 23.09 39.64, 19.69 40.26 C16.28 40.88, 11.65 39.76, 8.48 37.42 C5.32 35.08, 1.85 30.39, 0.7 26.22 C-0.46 22.05, 0.13 16.46, 1.55 12.41 C2.97 8.37, 6.12 3.98, 9.22 1.93 C12.32 -0.13, 18.35 0.33, 20.17 0.08 C21.99 -0.17, 20.22 0.17, 20.15 0.45" stroke="none" stroke-width="0" fill="#228be6"></path><path d="M13.54 0.6 C16.82 -0.49, 21.95 0.39, 25.1 2.44 C28.25 4.49, 31.17 8.91, 32.43 12.91 C33.69 16.91, 33.81 22.42, 32.63 26.44 C31.44 30.46, 28.39 34.82, 25.33 37.04 C22.26 39.26, 17.78 40.34, 14.23 39.76 C10.68 39.19, 6.5 36.8, 4.05 33.56 C1.6 30.32, -0.43 24.77, -0.47 20.33 C-0.5 15.88, 1.52 10.17, 3.83 6.91 C6.14 3.65, 11.66 1.75, 13.39 0.77 C15.12 -0.21, 14.06 0.69, 14.21 1.01 M14.37 0.82 C17.73 0.08, 22.71 1.45, 25.81 3.8 C28.92 6.16, 31.91 10.96, 33 14.94 C34.09 18.91, 33.73 23.92, 32.33 27.64 C30.93 31.35, 27.89 35.14, 24.6 37.24 C21.32 39.35, 16.17 41.26, 12.61 40.28 C9.05 39.3, 5.38 34.86, 3.22 31.38 C1.06 27.91, -0.58 23.72, -0.35 19.44 C-0.11 15.15, 2.17 8.99, 4.62 5.67 C7.08 2.36, 12.83 0.41, 14.38 -0.44 C15.93 -1.29, 13.91 0.16, 13.9 0.58" stroke="#228be6" stroke-width="4" fill="none"></path></g><g transform="translate(3904.73365114682 690.5245688784807) rotate(0 35.127198526835855 29.25318890487233)"><text x="35.127198526835755" y="41.23529508030792" font-family="Virgil, Segoe UI Emoji" font-size="46.805102247795595px" fill="#fff" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">crd</text></g><g stroke-linecap="round" transform="translate(896.6486515382567 517.787818187734) rotate(0 158.9892578125 50)"><path d="M0 0 C71.78 0, 143.55 0, 317.98 0 M0 0 C115.38 0, 230.77 0, 317.98 0 M317.98 0 C317.98 31.01, 317.98 62.03, 317.98 100 M317.98 0 C317.98 39.03, 317.98 78.06, 317.98 100 M317.98 100 C215.25 100, 112.52 100, 0 100 M317.98 100 C229.71 100, 141.43 100, 0 100 M0 100 C0 69.97, 0 39.94, 0 0 M0 100 C0 75.44, 0 50.87, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(966.5379642823973 522.787818187734) rotate(0 89.09994506835938 45)"><text x="89.09994506835938" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">resource</text><text x="89.09994506835938" y="76.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">collector</text></g><g stroke-linecap="round" transform="translate(889.1269545382565 1139.4242661877352) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C88.03 0, 176.05 0, 317.98 0 M0 0 C65.95 0, 131.89 0, 317.98 0 M317.98 0 C317.98 26.52, 317.98 53.03, 317.98 83.74 M317.98 0 C317.98 23.41, 317.98 46.81, 317.98 83.74 M317.98 83.74 C235.53 83.74, 153.08 83.74, 0 83.74 M317.98 83.74 C227.56 83.74, 137.15 83.74, 0 83.74 M0 83.74 C0 57.24, 0 30.73, 0 0 M0 83.74 C0 66.89, 0 50.05, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(919.4162916964597 1158.7943833752352) rotate(0 128.69992065429688 22.5)"><text x="128.69992065429688" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">GPU collector</text></g><g stroke-linecap="round"><g transform="translate(1049.6500276764273 890.1842160208262) rotate(0 0.18050743712046824 122.37219172253936)"><path d="M0 0 C0.06 40.79, 0.3 203.95, 0.36 244.74 M0 0 C0.06 40.79, 0.3 203.95, 0.36 244.74" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1049.6500276764273 890.1842160208262) rotate(0 0.18050743712046824 122.37219172253936)"><path d="M-8.22 221.26 C-5.07 229.89, -1.92 238.51, 0.36 244.74 M-8.22 221.26 C-5.37 229.07, -2.51 236.88, 0.36 244.74" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1049.6500276764273 890.1842160208262) rotate(0 0.18050743712046824 122.37219172253936)"><path d="M8.88 221.24 C5.75 229.87, 2.62 238.51, 0.36 244.74 M8.88 221.24 C6.05 229.06, 3.21 236.87, 0.36 244.74" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(1055.6379090621704 332.703207958381) rotate(0 -43.684454274813106 92.04230511467654)"><path d="M0 0 C-14.56 30.68, -72.81 153.4, -87.37 184.08 M0 0 C-14.56 30.68, -72.81 153.4, -87.37 184.08" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1055.6379090621704 332.703207958381) rotate(0 -43.684454274813106 92.04230511467654)"><path d="M-85.02 159.2 C-85.57 165, -86.12 170.8, -87.37 184.08 M-85.02 159.2 C-85.73 166.67, -86.43 174.15, -87.37 184.08" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1055.6379090621704 332.703207958381) rotate(0 -43.684454274813106 92.04230511467654)"><path d="M-69.57 166.53 C-73.72 170.62, -77.87 174.72, -87.37 184.08 M-69.57 166.53 C-74.92 171.8, -80.26 177.07, -87.37 184.08" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(1053.3489140132551 331.6591345627353) rotate(0 42.468747199087375 91.79143356927102)"><path d="M0 0 C14.16 30.6, 70.78 152.99, 84.94 183.58 M0 0 C14.16 30.6, 70.78 152.99, 84.94 183.58" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1053.3489140132551 331.6591345627353) rotate(0 42.468747199087375 91.79143356927102)"><path d="M67.31 165.85 C73.32 171.89, 79.32 177.94, 84.94 183.58 M67.31 165.85 C71.27 169.83, 75.22 173.81, 84.94 183.58" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1053.3489140132551 331.6591345627353) rotate(0 42.468747199087375 91.79143356927102)"><path d="M82.83 158.67 C83.55 167.16, 84.27 175.65, 84.94 183.58 M82.83 158.67 C83.31 164.26, 83.78 169.85, 84.94 183.58" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(1121.2085358890727 395.2716261458977) rotate(0 168.29989624023438 22.5)"><text x="168.29989624023438" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get device infos </text></g><g transform="translate(761.7035280694508 386.2373981004421) rotate(0 118.7999267578125 22.5)"><text x="118.7999267578125" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get metrics </text></g><g stroke-linecap="round" transform="translate(898.0313838022594 788.4255319559315) rotate(0 158.9892578125 50)"><path d="M0 0 C91.12 0, 182.25 0, 317.98 0 M0 0 C81.59 0, 163.19 0, 317.98 0 M317.98 0 C317.98 36.71, 317.98 73.43, 317.98 100 M317.98 0 C317.98 28.39, 317.98 56.79, 317.98 100 M317.98 100 C239.79 100, 161.6 100, 0 100 M317.98 100 C235.18 100, 152.37 100, 0 100 M0 100 C0 66.12, 0 32.25, 0 0 M0 100 C0 60.15, 0 20.29, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(967.9206965464 793.4255319559315) rotate(0 89.09994506835938 45)"><text x="89.09994506835938" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">device</text><text x="89.09994506835938" y="76.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">collector</text></g><g stroke-linecap="round"><g transform="translate(1056.9823423335692 620.1091523180344) rotate(0 0 82.89922970898965)"><path d="M0 0 C0 27.63, 0 138.17, 0 165.8 M0 0 C0 27.63, 0 138.17, 0 165.8" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1056.9823423335692 620.1091523180344) rotate(0 0 82.89922970898965)"><path d="M-8.55 142.31 C-6.78 147.18, -5 152.06, 0 165.8 M-8.55 142.31 C-6.75 147.25, -4.95 152.2, 0 165.8" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1056.9823423335692 620.1091523180344) rotate(0 0 82.89922970898965)"><path d="M8.55 142.31 C6.78 147.18, 5 152.06, 0 165.8 M8.55 142.31 C6.75 147.25, 4.95 152.2, 0 165.8" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(1817.969906961429 774.8102349074388) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 L317.98 0 L317.98 83.74 L0 83.74" stroke="none" stroke-width="0" fill="#e9ecef"></path><path d="M0 0 C98.57 0, 197.15 0, 317.98 0 M0 0 C92.56 0, 185.12 0, 317.98 0 M317.98 0 C317.98 27.3, 317.98 54.6, 317.98 83.74 M317.98 0 C317.98 31.22, 317.98 62.44, 317.98 83.74 M317.98 83.74 C227.57 83.74, 137.17 83.74, 0 83.74 M317.98 83.74 C236.13 83.74, 154.28 83.74, 0 83.74 M0 83.74 C0 51.13, 0 18.51, 0 0 M0 83.74 C0 62.8, 0 41.86, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1884.5592013950227 799.1803520949388) rotate(0 92.39996337890625 17.5)"><text x="92.39996337890625" y="24.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="28px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">metric cache</text></g><g transform="translate(945.8384855382574 1729.5665978541938) rotate(0 102.52235069362723 102.52235069362723)"><use href="#image-824088aec591dac2145046d068963f565b359fd0" width="205" height="205" opacity="1"></use></g><g transform="translate(1419.6453495920905 588.5104284584618) rotate(1.0172443856616242 108.89993286132812 22.5)"><text x="108.89993286132812" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">write cache</text></g><g stroke-linecap="round" transform="translate(2635.6554378616893 523.7027286069774) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C83.45 0, 166.9 0, 317.98 0 M0 0 C121.52 0, 243.03 0, 317.98 0 M317.98 0 C317.98 29.85, 317.98 59.71, 317.98 83.74 M317.98 0 C317.98 30.75, 317.98 61.5, 317.98 83.74 M317.98 83.74 C191 83.74, 64.03 83.74, 0 83.74 M317.98 83.74 C206.48 83.74, 94.97 83.74, 0 83.74 M0 83.74 C0 61.94, 0 40.13, 0 0 M0 83.74 C0 55.67, 0 27.6, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2646.144787166955 547.3776694349958) rotate(0 148.49990844726562 22.5)"><text x="148.49990844726562" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">device reporter</text></g><g stroke-linecap="round"><g transform="translate(2139.638996484431 817.4134378980243) rotate(0 246.25289534126387 -122.67947898009902)"><path d="M0 0 C82.08 -40.89, 410.42 -204.47, 492.51 -245.36 M0 0 C82.08 -40.89, 410.42 -204.47, 492.51 -245.36" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2139.638996484431 817.4134378980243) rotate(0 246.25289534126387 -122.67947898009902)"><path d="M475.29 -227.23 C479.15 -231.29, 483.01 -235.36, 492.51 -245.36 M475.29 -227.23 C480.88 -233.12, 486.47 -239.01, 492.51 -245.36" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2139.638996484431 817.4134378980243) rotate(0 246.25289534126387 -122.67947898009902)"><path d="M467.67 -242.54 C473.23 -243.17, 478.8 -243.8, 492.51 -245.36 M467.67 -242.54 C475.73 -243.45, 483.8 -244.37, 492.51 -245.36" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(2791.749174646411 331.6591345627344) rotate(0 1.3746553063829197 100.85926743613095)"><path d="M0 0 C0.46 33.62, 2.29 168.1, 2.75 201.72 M0 0 C0.46 33.62, 2.29 168.1, 2.75 201.72" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2791.749174646411 331.6591345627344) rotate(0 1.3746553063829197 100.85926743613095)"><path d="M-6.12 178.34 C-2.59 187.66, 0.95 196.98, 2.75 201.72 M-6.12 178.34 C-2.76 187.2, 0.6 196.05, 2.75 201.72" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2791.749174646411 331.6591345627344) rotate(0 1.3746553063829197 100.85926743613095)"><path d="M10.98 178.11 C7.7 187.52, 4.42 196.93, 2.75 201.72 M10.98 178.11 C7.86 187.05, 4.74 196, 2.75 201.72" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(3245.864622192905 1100.039100629766) rotate(0 305.2477333472907 -153.38652446029664)"><path d="M0 0 C101.75 -51.13, 508.75 -255.64, 610.5 -306.77" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(3245.864622192905 1100.039100629766) rotate(0 305.2477333472907 -153.38652446029664)"><path d="M593.34 -288.58 C598.31 -293.85, 603.27 -299.11, 610.5 -306.77" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(3245.864622192905 1100.039100629766) rotate(0 305.2477333472907 -153.38652446029664)"><path d="M585.67 -303.87 C592.85 -304.71, 600.04 -305.55, 610.5 -306.77" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g transform="translate(3427.6391089757344 840.5721201877359) rotate(333.1720927257138 165.7351279270988 28.974684198127306)"><text x="165.73512792709795" y="40.56455787737846" font-family="Comic Shanns, Segoe UI Emoji" font-size="46.359494717003955px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">create device</text></g><g transform="translate(1973.26859023231 1702.738140116301) rotate(0 133.34232117594001 133.34232117594001)"><use href="#image-458ff5eba8b281ac15cb7329d5225f271705d0d2" width="267" height="267" opacity="1"></use></g><g transform="translate(2267.460423025568 1694.040216619448) rotate(0 144.46517188541657 144.4651718854161)"><use href="#image-bd47b21b620a5e59c6d75605b842b6dcc528048c" width="289" height="289" opacity="1"></use></g><g transform="translate(2597.3481494582156 1733.7224326556725) rotate(0 110.70300671923906 110.70300671923906)"><use href="#image-0b858fa0c556eaeb14b0626889e8a7c21e482120" width="221" height="221" opacity="1"></use></g><g stroke-linecap="round" transform="translate(2181.300138248498 1446.5587820587753) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 L317.98 0 L317.98 83.74 L0 83.74" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M0 0 C97.66 0, 195.31 0, 317.98 0 M0 0 C112.53 0, 225.05 0, 317.98 0 M317.98 0 C317.98 21.47, 317.98 42.93, 317.98 83.74 M317.98 0 C317.98 32.3, 317.98 64.61, 317.98 83.74 M317.98 83.74 C229.14 83.74, 140.31 83.74, 0 83.74 M317.98 83.74 C252.09 83.74, 186.19 83.74, 0 83.74 M0 83.74 C0 60.53, 0 37.32, 0 0 M0 83.74 C0 63.94, 0 44.13, 0 0" stroke="#f08c00" stroke-width="2" fill="none"></path></g><g transform="translate(2193.9894540443966 1453.4288992462753) rotate(0 146.29994201660156 35)"><text x="146.29994201660156" y="24.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="28px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">/etc/kubernetes/koo</text><text x="146.29994201660156" y="59.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="28px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">rdlet/device-infos/</text></g><g stroke-linecap="round" transform="translate(1636.476158255089 1134.9285987129797) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 L317.98 0 L317.98 83.74 L0 83.74" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M0 0 C81.48 0, 162.96 0, 317.98 0 M0 0 C79.84 0, 159.67 0, 317.98 0 M317.98 0 C317.98 22.22, 317.98 44.44, 317.98 83.74 M317.98 0 C317.98 19.31, 317.98 38.62, 317.98 83.74 M317.98 83.74 C225.19 83.74, 132.4 83.74, 0 83.74 M317.98 83.74 C224.18 83.74, 130.38 83.74, 0 83.74 M0 83.74 C0 52.61, 0 21.49, 0 0 M0 83.74 C0 53.71, 0 23.68, 0 0" stroke="#f08c00" stroke-width="2" fill="none"></path></g><g transform="translate(1666.7654954132922 1154.2987159004797) rotate(0 128.69992065429688 22.5)"><text x="128.69992065429688" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">XPU collector</text></g><g stroke-linecap="round"><g transform="translate(1801.0844994102772 1225.7334254432153) rotate(0 263.6155766873817 109.41737930778027)"><path d="M0 0 C87.87 36.47, 439.36 182.36, 527.23 218.83" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(1801.0844994102772 1225.7334254432153) rotate(0 263.6155766873817 109.41737930778027)"><path d="M502.26 217.73 C509.44 218.05, 516.63 218.36, 527.23 218.83" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(1801.0844994102772 1225.7334254432153) rotate(0 263.6155766873817 109.41737930778027)"><path d="M508.81 201.93 C514.11 206.8, 519.41 211.66, 527.23 218.83" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(2337.2689780092805 1531.7115602344784) rotate(0 1.3369673281013092 71.451720892725)"><path d="M0 0 C0.45 23.82, 2.23 119.09, 2.67 142.9" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(2337.2689780092805 1531.7115602344784) rotate(0 1.3369673281013092 71.451720892725)"><path d="M8.99 23.33 C5.42 14.06, 1.85 4.8, 0 0" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(2337.2689780092805 1531.7115602344784) rotate(0 1.3369673281013092 71.451720892725)"><path d="M-8.11 23.65 C-4.89 14.26, -1.67 4.86, 0 0" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g transform="translate(1501.1174492510618 1308.2080495438431) rotate(0 257.39984130859375 22.5)"><text x="257.39984130859375" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get device infos from file</text></g><g stroke-linecap="round"><g transform="translate(1040.0528713804342 889.4255319559315) rotate(0 371.79347970765957 121.75103871208194)"><path d="M0 0 C123.93 40.58, 619.66 202.92, 743.59 243.5 M0 0 C123.93 40.58, 619.66 202.92, 743.59 243.5" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1040.0528713804342 889.4255319559315) rotate(0 371.79347970765957 121.75103871208194)"><path d="M718.6 244.32 C726.73 244.05, 734.86 243.79, 743.59 243.5 M718.6 244.32 C725.69 244.09, 732.78 243.85, 743.59 243.5" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1040.0528713804342 889.4255319559315) rotate(0 371.79347970765957 121.75103871208194)"><path d="M723.92 228.07 C730.32 233.09, 736.72 238.11, 743.59 243.5 M723.92 228.07 C729.5 232.45, 735.08 236.83, 743.59 243.5" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask><g transform="translate(2111.3146753698056 1600.559286714668) rotate(0 227.69985961914062 22.5)"><text x="227.69985961914062" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">third party wrtie file </text></g><g stroke-linecap="round" transform="translate(10 10) rotate(0 1791.6871182691302 1029.9790416080086)"><path d="M32 0 C1163.05 0, 2294.09 0, 3551.37 0 M3551.37 0 C3572.71 0, 3583.37 10.67, 3583.37 32 M3583.37 32 C3583.37 623.69, 3583.37 1215.38, 3583.37 2027.96 M3583.37 2027.96 C3583.37 2049.29, 3572.71 2059.96, 3551.37 2059.96 M3551.37 2059.96 C2633.4 2059.96, 1715.43 2059.96, 32 2059.96 M32 2059.96 C10.67 2059.96, 0 2049.29, 0 2027.96 M0 2027.96 C0 1256.25, 0 484.54, 0 32 M0 32 C0 10.67, 10.67 0, 32 0" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(1694.8260475382594 64.99346915473961) rotate(0 186.64794921875 53.02977233935462)"><text x="0" y="74.24168127509647" font-family="Comic Shanns, Segoe UI Emoji" font-size="84.8476357429674px" fill="#1e1e1e" text-anchor="start" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">Koordlet</text></g><g stroke-linecap="round" transform="translate(3198.2859005361934 64.993468904373) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C70.37 0, 140.75 0, 317.98 0 M0 0 C83.39 0, 166.78 0, 317.98 0 M317.98 0 C317.98 21, 317.98 41.99, 317.98 83.74 M317.98 0 C317.98 31.09, 317.98 62.19, 317.98 83.74 M317.98 83.74 C229.61 83.74, 141.25 83.74, 0 83.74 M317.98 83.74 C191.31 83.74, 64.65 83.74, 0 83.74 M0 83.74 C0 60.04, 0 36.34, 0 0 M0 83.74 C0 64.15, 0 44.56, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(3258.2752193238885 88.6684097323905) rotate(0 98.99993896484375 22.5)"><text x="98.99993896484375" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">old module</text></g><g stroke-linecap="round" transform="translate(3198.285900154562 148.7337033126546) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 L317.98 0 L317.98 83.74 L0 83.74" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M0 0 C66.19 0, 132.39 0, 317.98 0 M0 0 C81.7 0, 163.4 0, 317.98 0 M317.98 0 C317.98 23.68, 317.98 47.35, 317.98 83.74 M317.98 0 C317.98 33.28, 317.98 66.55, 317.98 83.74 M317.98 83.74 C226.51 83.74, 135.04 83.74, 0 83.74 M317.98 83.74 C218.91 83.74, 119.85 83.74, 0 83.74 M0 83.74 C0 62.74, 0 41.75, 0 0 M0 83.74 C0 66.45, 0 49.16, 0 0" stroke="#f08c00" stroke-width="2" fill="none"></path></g><g transform="translate(3258.27521894225 172.4086441406721) rotate(0 98.99993896484375 22.5)"><text x="98.99993896484375" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">new module</text></g><g transform="translate(898.0313833560649 671.7178321768733) rotate(0 148.49990844726562 22.5)"><text x="148.49990844726562" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">collect  infos </text></g><g stroke-linecap="round" transform="translate(2848.8832313432176 1055.7160701592265) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C77.36 0, 154.72 0, 317.98 0 M0 0 C69.01 0, 138.01 0, 317.98 0 M317.98 0 C317.98 28.16, 317.98 56.33, 317.98 83.74 M317.98 0 C317.98 25.05, 317.98 50.11, 317.98 83.74 M317.98 83.74 C202.21 83.74, 86.44 83.74, 0 83.74 M317.98 83.74 C191 83.74, 64.03 83.74, 0 83.74 M0 83.74 C0 50.89, 0 18.04, 0 0 M0 83.74 C0 62.5, 0 41.26, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(2869.272574544968 1079.391010987244) rotate(0 138.59991455078125 22.5)"><text x="138.59991455078125" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">device builder</text></g><g stroke-linecap="round" transform="translate(2454.135713430798 1055.7160704005491) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 L317.98 0 L317.98 83.74 L0 83.74" stroke="none" stroke-width="0" fill="#ffec99"></path><path d="M0 0 C95.59 0, 191.18 0, 317.98 0 M0 0 C113.87 0, 227.74 0, 317.98 0 M317.98 0 C317.98 22.42, 317.98 44.85, 317.98 83.74 M317.98 0 C317.98 31.73, 317.98 63.45, 317.98 83.74 M317.98 83.74 C200.99 83.74, 84 83.74, 0 83.74 M317.98 83.74 C250 83.74, 182.03 83.74, 0 83.74 M0 83.74 C0 58.02, 0 32.3, 0 0 M0 83.74 C0 52.92, 0 22.1, 0 0" stroke="#f08c00" stroke-width="2" fill="none"></path></g><g transform="translate(2474.5250566325485 1075.0861872285668) rotate(0 138.59991455078125 22.5)"><text x="138.59991455078125" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">device checker</text></g><g stroke-linecap="round" transform="translate(2393.6828305382624 1008.4674640424628) rotate(0 425.07133149999936 89.11872398947526)"><path d="M32 0 C261.76 0, 491.52 0, 818.14 0 M818.14 0 C839.48 0, 850.14 10.67, 850.14 32 M850.14 32 C850.14 74.18, 850.14 116.36, 850.14 146.24 M850.14 146.24 C850.14 167.57, 839.48 178.24, 818.14 178.24 M818.14 178.24 C616.14 178.24, 414.13 178.24, 32 178.24 M32 178.24 C10.67 178.24, 0 167.57, 0 146.24 M0 146.24 C0 101.34, 0 56.44, 0 32 M0 32 C0 10.67, 10.67 0, 32 0" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g stroke-linecap="round"><g transform="translate(2863.909681043955 1186.9118447874253) rotate(0 -263.00523753215566 128.82816946818548)"><path d="M0 0 C-87.67 42.94, -438.34 214.71, -526.01 257.66" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(2863.909681043955 1186.9118447874253) rotate(0 -263.00523753215566 128.82816946818548)"><path d="M-508.67 239.64 C-513.81 244.98, -518.95 250.32, -526.01 257.66" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(2863.909681043955 1186.9118447874253) rotate(0 -263.00523753215566 128.82816946818548)"><path d="M-501.15 255 C-508.52 255.79, -515.88 256.57, -526.01 257.66" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(2794.61661148824 606.3776694349954) rotate(0 -0.11380663630734489 200.73471098546952)"><path d="M0 0 C-0.04 66.91, -0.19 334.56, -0.23 401.47" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(2794.61661148824 606.3776694349954) rotate(0 -0.11380663630734489 200.73471098546952)"><path d="M-8.76 377.97 C-5.62 386.64, -2.47 395.31, -0.23 401.47" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(2794.61661148824 606.3776694349954) rotate(0 -0.11380663630734489 200.73471098546952)"><path d="M8.34 377.98 C5.18 386.64, 2.02 395.31, -0.23 401.47" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g transform="translate(2632.1745824764766 1321.2417738589575) rotate(0 267.2998352050781 22.5)"><text x="267.2998352050781" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#f08c00" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get device status from file</text></g><g stroke-linecap="round" transform="translate(217.81008684623885 1457.0367073871248) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C109.54 0, 219.09 0, 317.98 0 M0 0 C79.1 0, 158.2 0, 317.98 0 M317.98 0 C317.98 27.61, 317.98 55.22, 317.98 83.74 M317.98 0 C317.98 20.88, 317.98 41.77, 317.98 83.74 M317.98 83.74 C219.26 83.74, 120.55 83.74, 0 83.74 M317.98 83.74 C233.89 83.74, 149.81 83.74, 0 83.74 M0 83.74 C0 53.98, 0 24.22, 0 0 M0 83.74 C0 62.31, 0 40.87, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(307.4993873833482 1476.4068245746248) rotate(0 69.29995727539062 22.5)"><text x="69.29995727539062" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">ghw.PCI</text></g><g transform="translate(188.50293672612315 1308.2080493871226) rotate(0 178.19989013671875 22.5)"><text x="178.19989013671875" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">get infos from PCI</text></g><g stroke-linecap="round"><g transform="translate(375.2891593714594 1541.7769417621248) rotate(0 -0.6913224807394727 87.81240221188727)"><path d="M0 0 C-0.23 29.27, -1.15 146.35, -1.38 175.62" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(375.2891593714594 1541.7769417621248) rotate(0 -0.6913224807394727 87.81240221188727)"><path d="M-9.75 152.07 C-7.99 157.01, -6.24 161.95, -1.38 175.62" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(375.2891593714594 1541.7769417621248) rotate(0 -0.6913224807394727 87.81240221188727)"><path d="M7.35 152.2 C5.52 157.11, 3.69 162.02, -1.38 175.62" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g stroke-linecap="round"><g transform="translate(376.83235292753307 1225.6176830891218) rotate(0 0.08340765324464883 110.47054978511142)"><path d="M0 0 C0.03 36.82, 0.14 184.12, 0.17 220.94" stroke="#1e1e1e" stroke-width="2.5" fill="none" stroke-dasharray="8 10"></path></g><g transform="translate(376.83235292753307 1225.6176830891218) rotate(0 0.08340765324464883 110.47054978511142)"><path d="M-8.4 197.46 C-6.27 203.3, -4.14 209.14, 0.17 220.94" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g><g transform="translate(376.83235292753307 1225.6176830891218) rotate(0 0.08340765324464883 110.47054978511142)"><path d="M8.7 197.44 C6.58 203.29, 4.45 209.13, 0.17 220.94" stroke="#1e1e1e" stroke-width="2.5" fill="none"></path></g></g><mask></mask><g stroke-linecap="round" transform="translate(220.10739284624287 1139.4242663871237) rotate(0 158.9892578125 41.8701171875)"><path d="M0 0 C106.17 0, 212.34 0, 317.98 0 M0 0 C115.76 0, 231.52 0, 317.98 0 M317.98 0 C317.98 17.87, 317.98 35.75, 317.98 83.74 M317.98 0 C317.98 31.31, 317.98 62.63, 317.98 83.74 M317.98 83.74 C204.24 83.74, 90.51 83.74, 0 83.74 M317.98 83.74 C252.95 83.74, 187.92 83.74, 0 83.74 M0 83.74 C0 52.07, 0 20.4, 0 0 M0 83.74 C0 51.3, 0 18.86, 0 0" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(240.49673610796162 1158.7943835746237) rotate(0 138.59991455078125 22.5)"><text x="138.59991455078125" y="31.5" font-family="Comic Shanns, Segoe UI Emoji" font-size="36px" fill="#1e1e1e" text-anchor="middle" style="white-space: pre;" direction="ltr" dominant-baseline="alphabetic">RDMA collector</text></g><g transform="translate(257.58352889174057 1720.999734684754) rotate(0 117.5056538232584 117.5056538232584)"><use href="#image-14721bba438dc5c68ff5c9a168f8091dcaff0009" width="235" height="235" opacity="1"></use></g><g stroke-linecap="round"><g transform="translate(1046.5266235512572 889.4255319559315) rotate(0 -330.5482993943151 120.80309017060245)"><path d="M0 0 C-110.18 40.27, -550.91 201.34, -661.1 241.61 M0 0 C-110.18 40.27, -550.91 201.34, -661.1 241.61" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1046.5266235512572 889.4255319559315) rotate(0 -330.5482993943151 120.80309017060245)"><path d="M-641.97 225.51 C-649.38 231.74, -656.78 237.98, -661.1 241.61 M-641.97 225.51 C-648.97 231.4, -655.98 237.3, -661.1 241.61" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g><g transform="translate(1046.5266235512572 889.4255319559315) rotate(0 -330.5482993943151 120.80309017060245)"><path d="M-636.1 241.57 C-645.78 241.59, -655.46 241.6, -661.1 241.61 M-636.1 241.57 C-645.25 241.59, -654.4 241.6, -661.1 241.61" stroke="#1e1e1e" stroke-width="2" fill="none"></path></g></g><mask></mask></svg>
\ No newline at end of file
diff --git a/docs/proposals/koordlet/20250425-heterogeneous-GPU-device-reporting.md b/docs/proposals/koordlet/20250425-heterogeneous-GPU-device-reporting.md
new file mode 100644
index 00000000..9a46a421
--- /dev/null
+++ b/docs/proposals/koordlet/20250425-heterogeneous-GPU-device-reporting.md
@@ -0,0 +1,223 @@
+---
+title: Heterogeneous GPU device reporting
+authors:
+  - "@ZhuZhezz"
+reviewers:
+  - "@zqzten"
+  - "@ZiMengSheng"
+  - "@hormes"
+creation-date: 2025-04-25
+last-updated: 2025-04-25
+status: provisional
+---
+
+# Heterogeneous GPU device reporting
+
+## Summary
+
+This proposal introduces a heterogeneous GPU device reporting mechanism to koordlet, particularly for GPU devices with dynamic virtualization. The main goal is to decouple device awareness from Koordlet, maitain a clean Koordlet architecture and facilitate integration for third-party vendors.
+
+## Motivation
+For now, Koordlet is able to report NVIDIA GPU from NVML. But for third-party GPU devices, there is no standard way. If third-party GPU devices are integrated into Koordlet, it will introduce vendor-specific logic and SDK, such as DCML(Ascend Card) and IXML(Iluvatar Card). Meanwhile, we need to address the cgo dependencies issue. This will make Koordlet hard to maintain and more complex.
+
+This PR proposes a mechanism to report devices, and makes Koordlet more extensible and maintainable.
+
+### Goals
+
+- Introduce a mechanism for reporting heterogeneous GPU devices.
+- Allow Koordlet integrates third-party GPU devices quickly.
+- Keep Koordlet architecture clean.
+
+### Non-Goals
+- Currently, unified solutions for device allocation on Node side would not be provided. Instead, existing vendor-specific device plugins would be reused and adaption for different device plugins would be done in scheduler to simplify the process of integration and usage.
+
+## Proposal
+
+### Architecture
+![image](/docs/images/GPU-device-reporting.svg)
+
+### Implementation Details
+
+- Thirty-party vendors write [device infos](#Device-Infos-Formate-In-File) into directory `/etc/kubernetes/koordlet/device-infos/`. Examples:[Device Infos Exampels](#Device-Infos-Examples).
+- Koordlet will read the device infos from the directory and report them to apiserver.
+  - The topology infos from directory will be synced to the annotation of the Device.
+  - The status from directory will be synced to the "Healthy" condition of the Device.
+  - The vendor and model from directory will be synced to the labels of the Device.
+```yaml
+apiVersion: scheduling.koordinator.sh/v1alpha1
+kind: Device
+metadata:
+  labels:
+    # Existing label
+    node.koordinator.sh/gpu-partition-policy: "Honor"
+    node.koordinator.sh/gpu-model: Tesla-T4 # Ascend-910B/Ascend-310P3
+    # New label
+    node.koordinator.sh/gpu-vendor: nvidia # huawei/cambricon/
+  annotations:
+    # The topology from device infos will be synced to the annotation of the Device.
+    scheduling.koordinator.sh/gpu-partitions: |
+      {
+        "1": [
+                {
+                  "minors": [
+                      0
+                  ],
+                  "gpuLinkType": "NVLink",
+                  "ringBusBandwidth": "400Gi",
+                  "allocationScore": "1"
+                }
+        ],
+        "4": [
+                {
+                    "minors": [
+                       0,1,2,3 
+                    ],
+                    # This is the topology of the Ascend910B.
+                    # https://www.hiascend.com/doc_center/source/zh/mindx-dl/50rc1/ref/dl_affinity_0002.html
+                    "gpuLinkType": "HCCS",
+                    "allocationScore": "1"
+                }
+        ]
+      }
+  name: node-1
+spec:
+  devices:
+  - health: true
+    id: GPU-fd971b33-4891-fd2e-ed42-ce6adf324615
+    minor: 0
+    resources:
+      koordinator.sh/gpu-core: "100"
+      koordinator.sh/gpu-memory: 15Gi
+      koordinator.sh/gpu-memory-ratio: "100"
+    topology:
+      busID: 0000:3b:00.0
+      nodeID: 0
+      pcieID: pci0000:3a
+      socketID: -1
+    type: gpu
+    # Add Healthy condition
+    conditions:
+    - lastTransitionTime: "2025-04-25T10:00:00Z"
+      status: "True"
+      type: Healthy
+  - health: true
+    id: GPU-0ca35a5f-551e-91e4-f3a3-c9b103afe1db
+    minor: 1
+    resources:
+      koordinator.sh/gpu-core: "100"
+      koordinator.sh/gpu-memory: 15Gi
+      koordinator.sh/gpu-memory-ratio: "100"
+    topology:
+      busID: 0000:3b:01.0
+      nodeID: 0
+      pcieID: pci0000:3a
+      socketID: -1
+    type: gpu
+    # Add Healthy condition
+    conditions:
+    - lastTransitionTime: "2025-04-25T10:00:00Z"
+      message: "XID 74: Nvlink Error"
+      reason: "NvlinkError"
+      status: "False"
+      type: Healthy
+
+```
+
+- Add the featuregate to enable the heterogeneous GPU device reporting. It is not recommended to enable both feature gates at the same time.
+```GO
+// Accelerators enables GPU related feature in koordlet. Only Nvidia GPUs supported.
+    Accelerators featuregate.Feature = "Accelerator"
+// XAccelerators enables heterogeneous GPU devices reporting.
+    Accelerators featuregate.Feature = "XAccelerators"
+``` 
+
+### Device Infos Formate In File
+```Go
+type DeviceInfo struct {
+    Vendor string `json:"vendor"`
+    Model string `json:"model"` 
+    UUID string `json:"uuid"`//the Identifier of the device
+    Minor string `json:"minor"`// /dev/xxx0
+    Resources map[string]string `json:"resourece,omitempty"`
+    Topology *DeviceTopology `json:"topology,omitempty"`
+    Status *DeviceStatus `json:"status,omitempty"`
+}
+
+type DeviceTopology struct {
+    P2PLinks []DeviceP2PLink `json:"p2pLinks,omitempty"`
+}
+
+type DeviceP2PLink struct {
+	PeerMinor  string `json:"peerMinor"`
+	Type DeviceP2PLinkType `json:"type"`
+}
+
+type DeviceP2PLinkType string //like nvlink/hccs
+
+type DeviceStatus {
+    Healthy bool `json:"healthy"`
+    ErrCode string `json:"errCode,omitempty"`
+    ErrMessage string `json:"errMessage,omitempty"`
+}
+```
+### Device Infos Examples
+- NVIDIA: Tesla-T4
+```json
+{
+    "vendor": "nvidia",
+    "model": "Tesla-T4",
+    "uuid": "GPU-0ca35a5f-551e-91e4-f3a3-c9b103afe1db",
+    "minor": "1",
+    "resources": {
+        "koordinator.sh/gpu-memory": "15Gi",
+        "koordinator.sh/gpu-core": "100"
+    },
+    "topology": {
+        "p2pLinks": [
+            {
+                "peerMinor": "1,2,3",
+                "type": "NVLink"
+            }
+        ]
+    },
+    "status": {
+        "healthy": false,
+        "errCode": "XID 74",
+        "errMessage": "Nvlink Error"
+    }
+}
+```
+
+- HUAWEI: Ascend-910B
+```json
+{
+    "vendor": "huawei",
+    "model": "Ascend-910B",
+    // vdieId
+    "uuid": "185011D4-21104518-A0C4ED94-14CC040A-56102003",
+    "minor": "0",
+// https://www.hiascend.com/document/detail/zh/mindx-dl/600/clusterscheduling/clusterscheduling/cpaug/mxdlug_021.html
+    "resources": {
+        "huawei.com/npu-core": "32",
+        "hauwei.com/npu-cpu": "14",
+        "koordinator.sh/gpu-memory": "32Gi",
+        "huawei.com/npu-vpc": "16",
+        "huawei.com/npu-vdec": "16",
+        "huawei.com/npu-jpegd": "16",
+        "huawei.com/npu-pngd": "24",
+        "huawei.com/npu-jpege": "8"
+    },
+    "topology": {
+        "p2pLinks": [
+            {
+                "peerMinor": "1,2,3",
+                "type": "HCCS"
+            }
+        ]
+    },
+    "status": {
+        "healthy": true
+    }
+}
+```
+
diff --git a/pkg/controller/colocationprofile/colocationprofile_controller.go b/pkg/controller/colocationprofile/colocationprofile_controller.go
index 06976283..e2fb1963 100644
--- a/pkg/controller/colocationprofile/colocationprofile_controller.go
+++ b/pkg/controller/colocationprofile/colocationprofile_controller.go
@@ -33,6 +33,7 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/client"
 
 	configv1alpha1 "github.com/koordinator-sh/koordinator/apis/config/v1alpha1"
+	"github.com/koordinator-sh/koordinator/apis/extension"
 	"github.com/koordinator-sh/koordinator/pkg/features"
 	utilfeature "github.com/koordinator-sh/koordinator/pkg/util/feature"
 )
@@ -40,6 +41,7 @@ import (
 const Name = "colocationprofile"
 
 var (
+	ReconcileByDefault     = false
 	ReconcileInterval      = 30 * time.Second
 	ForceUpdatePodDuration = 5 * time.Minute
 	ExpirePodCacheDuration = 10 * time.Minute
@@ -81,6 +83,14 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
 		return ctrl.Result{}, nil
 	}
 
+	profileEnabled := extension.ShouldReconcileProfile(profile)
+	klog.V(5).InfoS("reconcile for clusterColocationProfile",
+		"profile", profile.Name, "defaultEnabled", ReconcileByDefault, "profileEnabled", profileEnabled)
+	if !ReconcileByDefault && !profileEnabled {
+		// should not handle the profile
+		return ctrl.Result{}, nil
+	}
+
 	podList, err := r.listPodsForProfile(profile)
 	if err != nil {
 		klog.ErrorS(err, "failed to list pods for ClusterColocationProfile", "profile", profile.Name)
@@ -149,6 +159,7 @@ func (r *Reconciler) SetupWithManager(mgr ctrl.Manager) error {
 }
 
 func InitFlags(fs *flag.FlagSet) {
+	pflag.BoolVar(&ReconcileByDefault, "colocation-profile-reconcile-by-default", ReconcileByDefault, "Whether the colocation-profile controller reconciles ClusterColocationProfile by default.")
 	pflag.DurationVar(&ReconcileInterval, "colocation-profile-reconcile-interval", ReconcileInterval, "The interval to reconcile ClusterColocationProfile.")
 	pflag.DurationVar(&ForceUpdatePodDuration, "colocation-profile-force-update-pod-duration", ForceUpdatePodDuration, "The duration for colocation-profile controller to force update pods.")
 	pflag.DurationVar(&ExpirePodCacheDuration, "colocation-profile-expire-pod-cache-duration", ExpirePodCacheDuration, "The duration for colocation-profile controller to expire pod cache.")
diff --git a/pkg/features/features.go b/pkg/features/features.go
index 9bd3a341..09b1c9b4 100644
--- a/pkg/features/features.go
+++ b/pkg/features/features.go
@@ -90,6 +90,9 @@ const (
 
 	// ColocationProfileController enables the reconciliation for ClusterColocationProfile.
 	ColocationProfileController featuregate.Feature = "ColocationProfileController"
+
+	// ValidatePodDeviceResource enables validate pod device resource
+	ValidatePodDeviceResource featuregate.Feature = "ValidatePodDeviceResource"
 )
 
 var defaultFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
@@ -110,8 +113,9 @@ var defaultFeatureGates = map[featuregate.Feature]featuregate.FeatureSpec{
 	DisableDefaultQuota:                    {Default: false, PreRelease: featuregate.Alpha},
 	SupportParentQuotaSubmitPod:            {Default: false, PreRelease: featuregate.Alpha},
 	EnableQuotaAdmission:                   {Default: false, PreRelease: featuregate.Alpha},
-	EnableSyncGPUSharedResource:            {Default: true, PreRelease: featuregate.Alpha},
+	EnableSyncGPUSharedResource:            {Default: false, PreRelease: featuregate.Alpha},
 	ColocationProfileController:            {Default: false, PreRelease: featuregate.Alpha},
+	ValidatePodDeviceResource:              {Default: false, PreRelease: featuregate.Alpha},
 }
 
 const (
diff --git a/pkg/scheduler/plugins/elasticquota/core/group_quota_manager.go b/pkg/scheduler/plugins/elasticquota/core/group_quota_manager.go
index 212a7bc3..872c7a52 100644
--- a/pkg/scheduler/plugins/elasticquota/core/group_quota_manager.go
+++ b/pkg/scheduler/plugins/elasticquota/core/group_quota_manager.go
@@ -418,7 +418,7 @@ func (gqm *GroupQuotaManager) UpdateQuota(quota *v1alpha1.ElasticQuota) error {
 	// update the local quotaInfo's crd
 	if localQuotaInfo, exist := gqm.quotaInfoMap[quotaName]; exist {
 		if !localQuotaInfo.IsQuotaChange(newQuotaInfo) &&
-			!gqm.isQuotaUpdated(localQuotaInfo, newQuotaInfo, quota) {
+			!gqm.isQuotaUpdatedNoLock(localQuotaInfo, newQuotaInfo, quota) {
 			return nil
 		}
 
diff --git a/pkg/scheduler/plugins/elasticquota/core/hook_plugin.go b/pkg/scheduler/plugins/elasticquota/core/hook_plugin.go
index f248f29e..7f326f0a 100644
--- a/pkg/scheduler/plugins/elasticquota/core/hook_plugin.go
+++ b/pkg/scheduler/plugins/elasticquota/core/hook_plugin.go
@@ -290,7 +290,7 @@ func (gqm *GroupQuotaManager) runPodUpdateHooks(quotaName string, oldPod, newPod
 	}
 }
 
-func (gqm *GroupQuotaManager) isQuotaUpdated(oldQuotaInfo, newQuotaInfo *QuotaInfo,
+func (gqm *GroupQuotaManager) isQuotaUpdatedNoLock(oldQuotaInfo, newQuotaInfo *QuotaInfo,
 	newQuota *v1alpha1.ElasticQuota) bool {
 	for _, hook := range gqm.hookPlugins {
 		if hook.IsQuotaUpdated(oldQuotaInfo, newQuotaInfo, newQuota) {
@@ -299,3 +299,35 @@ func (gqm *GroupQuotaManager) isQuotaUpdated(oldQuotaInfo, newQuotaInfo *QuotaIn
 	}
 	return false
 }
+
+// IsQuotaUpdated checks if the quota has been updated from the hook plugins' perspective.
+func (gqm *GroupQuotaManager) IsQuotaUpdated(oldQuotaInfo, newQuotaInfo *QuotaInfo,
+	newQuota *v1alpha1.ElasticQuota) bool {
+	gqm.hierarchyUpdateLock.RLock()
+	defer gqm.hierarchyUpdateLock.RUnlock()
+	return gqm.isQuotaUpdatedNoLock(oldQuotaInfo, newQuotaInfo, newQuota)
+}
+
+// ResetQuotasForHookPlugins resets quotas with pre-update and post-update hooks
+func (gqm *GroupQuotaManager) ResetQuotasForHookPlugins(quotas map[string]*v1alpha1.ElasticQuota) {
+	if len(gqm.hookPlugins) == 0 {
+		return
+	}
+	startTime := time.Now()
+	defer func() {
+		klog.Infof("reset hook plugins for tree %s, took %v", gqm.GetTreeID(), time.Since(startTime))
+	}()
+
+	gqm.hierarchyUpdateLock.Lock()
+	defer gqm.hierarchyUpdateLock.Unlock()
+
+	for quotaName, quotaInfo := range gqm.quotaInfoMap {
+		quota := quotas[quotaInfo.Name]
+		if quota == nil {
+			klog.Warningf("skip resetting inconsistent quota %s for hook plugins", quotaName)
+			continue
+		}
+		hookState := gqm.runPreQuotaUpdateHooks(nil, quotaInfo, quota)
+		gqm.runPostQuotaUpdateHooks(nil, quotaInfo, quota, hookState)
+	}
+}
diff --git a/pkg/scheduler/plugins/elasticquota/quota_handler.go b/pkg/scheduler/plugins/elasticquota/quota_handler.go
index 8427743c..89b1bb47 100644
--- a/pkg/scheduler/plugins/elasticquota/quota_handler.go
+++ b/pkg/scheduler/plugins/elasticquota/quota_handler.go
@@ -83,7 +83,7 @@ func (g *Plugin) OnQuotaUpdate(oldObj, newObj interface{}) {
 	if oldQuotaInfo != nil {
 		// quota spec not change. return
 		newQuotaInfo := core.NewQuotaInfoFromQuota(newQuota)
-		if !oldQuotaInfo.IsQuotaChange(newQuotaInfo) {
+		if !oldQuotaInfo.IsQuotaChange(newQuotaInfo) && !mgr.IsQuotaUpdated(oldQuotaInfo, newQuotaInfo, newQuota) {
 			klog.V(5).Infof("OnQuotaUpdateFunc success: %v, tree: %v, quota not change", newQuota.Name, treeID)
 			return
 		}
@@ -125,10 +125,10 @@ func (g *Plugin) OnQuotaDelete(obj interface{}) {
 }
 
 func (g *Plugin) ReplaceQuotas(objs []interface{}) error {
-	quotas := make([]*schedulerv1alpha1.ElasticQuota, 0, len(objs))
+	quotas := make(map[string]*schedulerv1alpha1.ElasticQuota, len(objs))
 	for _, obj := range objs {
 		quota := obj.(*schedulerv1alpha1.ElasticQuota)
-		quotas = append(quotas, quota)
+		quotas[quota.Name] = quota
 	}
 
 	start := time.Now()
@@ -160,8 +160,10 @@ func (g *Plugin) ReplaceQuotas(objs []interface{}) error {
 	}
 
 	g.groupQuotaManager.ResetQuota()
+	g.groupQuotaManager.ResetQuotasForHookPlugins(quotas)
 	for _, mgr := range g.groupQuotaManagersForQuotaTree {
 		mgr.ResetQuota()
+		mgr.ResetQuotasForHookPlugins(quotas)
 	}
 
 	return nil
diff --git a/pkg/scheduler/plugins/loadaware/load_aware.go b/pkg/scheduler/plugins/loadaware/load_aware.go
index df0bc1c6..ad163807 100644
--- a/pkg/scheduler/plugins/loadaware/load_aware.go
+++ b/pkg/scheduler/plugins/loadaware/load_aware.go
@@ -182,7 +182,7 @@ func (p *Plugin) Filter(ctx context.Context, state *framework.CycleState, pod *c
 		klog.ErrorS(err, "GetEstimatedUsed failed!", "node", node.Name)
 		return nil
 	}
-	return filterNodeUsage(usageThresholds, estimatedUsed, allocatable, prodPod, filterProfile)
+	return filterNodeUsage(node.Name, pod, usageThresholds, estimatedUsed, allocatable, prodPod, filterProfile)
 }
 
 func (p *Plugin) ScoreExtensions() framework.ScoreExtensions {
@@ -282,10 +282,12 @@ func (p *Plugin) GetEstimatedUsed(nodeName string, nodeMetric *slov1alpha1.NodeM
 			}
 		}
 	}
+	klog.V(6).Infof("GetEstimatedUsed: node %s, pod %s, estimatedUsed %+v, assignedPodEstimatedUsed %+v, estimatedPods: %+v",
+		nodeName, klog.KObj(pod), estimatedUsed, assignedPodEstimatedUsed, estimatedPods)
 	return estimatedUsed, nil
 }
 
-func filterNodeUsage(usageThresholds, estimatedUsed map[corev1.ResourceName]int64, allocatable corev1.ResourceList, prodPod bool, filterProfile *usageThresholdsFilterProfile) *framework.Status {
+func filterNodeUsage(nodeName string, pod *corev1.Pod, usageThresholds, estimatedUsed map[corev1.ResourceName]int64, allocatable corev1.ResourceList, prodPod bool, filterProfile *usageThresholdsFilterProfile) *framework.Status {
 	for resourceName, value := range usageThresholds {
 		if value == 0 {
 			continue
@@ -303,6 +305,8 @@ func filterNodeUsage(usageThresholds, estimatedUsed map[corev1.ResourceName]int6
 		if !prodPod && filterProfile.AggregatedUsage != nil {
 			reason = ErrReasonAggregatedUsageExceedThreshold
 		}
+		klog.V(5).InfoS("failed to filter node usage for pod", "pod", klog.KObj(pod), "node", nodeName,
+			"resource", resourceName, "total", total, "usage", usage, "threshold", value)
 		return framework.NewStatus(framework.Unschedulable, fmt.Sprintf(reason, resourceName))
 	}
 	return nil
diff --git a/pkg/scheduler/plugins/loadaware/service.go b/pkg/scheduler/plugins/loadaware/service.go
new file mode 100644
index 00000000..5ea19bee
--- /dev/null
+++ b/pkg/scheduler/plugins/loadaware/service.go
@@ -0,0 +1,61 @@
+/*
+Copyright 2022 The Koordinator Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package loadaware
+
+import (
+	"net/http"
+	"time"
+
+	"github.com/gin-gonic/gin"
+	corev1 "k8s.io/api/core/v1"
+
+	"github.com/koordinator-sh/koordinator/pkg/scheduler/frameworkext/services"
+)
+
+var _ services.APIServiceProvider = &Plugin{}
+
+type NodeAssignInfoData struct {
+	Pods []PodAssignInfoData `json:"pods,omitempty"`
+}
+
+type PodAssignInfoData struct {
+	Timestamp time.Time   `json:"timestamp,omitempty"`
+	Pod       *corev1.Pod `json:"pod,omitempty"`
+}
+
+func (p *Plugin) RegisterEndpoints(group *gin.RouterGroup) {
+	group.GET("/node/:nodeName", func(c *gin.Context) {
+		nodeName := c.Param("nodeName")
+		assignInfo := p.podAssignCache.getPodsAssignInfoOnNode(nodeName)
+		if len(assignInfo) == 0 {
+			c.JSON(http.StatusOK, &NodeAssignInfoData{})
+			return
+		}
+
+		resp := &NodeAssignInfoData{
+			Pods: make([]PodAssignInfoData, 0, len(assignInfo)),
+		}
+		for i := range assignInfo {
+			resp.Pods = append(resp.Pods, PodAssignInfoData{
+				Timestamp: assignInfo[i].timestamp,
+				Pod:       assignInfo[i].pod,
+			})
+		}
+
+		c.JSON(http.StatusOK, resp)
+	})
+}
diff --git a/pkg/webhook/pod/validating/verify_device_resource.go b/pkg/webhook/pod/validating/verify_device_resource.go
index a14c9dbb..0a5535ca 100644
--- a/pkg/webhook/pod/validating/verify_device_resource.go
+++ b/pkg/webhook/pod/validating/verify_device_resource.go
@@ -26,9 +26,15 @@ import (
 	"sigs.k8s.io/controller-runtime/pkg/webhook/admission"
 
 	"github.com/koordinator-sh/koordinator/apis/extension"
+	"github.com/koordinator-sh/koordinator/pkg/features"
+	utilfeature "github.com/koordinator-sh/koordinator/pkg/util/feature"
 )
 
 func (h *PodValidatingHandler) deviceResourceValidatingPod(ctx context.Context, req admission.Request) (bool, string, error) {
+	if !utilfeature.DefaultFeatureGate.Enabled(features.ValidatePodDeviceResource) {
+		return true, "", nil
+	}
+
 	newPod := &corev1.Pod{}
 	var allErrs field.ErrorList
 	switch req.Operation {



Test patch:
diff --git a/pkg/controller/colocationprofile/colocationprofile_controller_test.go b/pkg/controller/colocationprofile/colocationprofile_controller_test.go
index 070179d1..e0dfe25b 100644
--- a/pkg/controller/colocationprofile/colocationprofile_controller_test.go
+++ b/pkg/controller/colocationprofile/colocationprofile_controller_test.go
@@ -52,6 +52,9 @@ func TestReconciler_Reconcile(t *testing.T) {
 	testProfile := &configv1alpha1.ClusterColocationProfile{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: "test-profile",
+			Labels: map[string]string{
+				extension.LabelControllerManaged: "true",
+			},
 		},
 		Spec: configv1alpha1.ClusterColocationProfileSpec{
 			Selector: &metav1.LabelSelector{
@@ -423,7 +426,27 @@ func TestReconciler_Reconcile(t *testing.T) {
 		assert.NoError(t, err)
 		assert.Equal(t, ctrl.Result{RequeueAfter: ReconcileInterval}, result)
 
-		// skip reconcile for profile
+		// skip reconcile for profile not managed by controller
+		gotProfile = &configv1alpha1.ClusterColocationProfile{}
+		err = r.Client.Get(context.TODO(), client.ObjectKey{Name: testProfile.Name}, gotProfile)
+		assert.NoError(t, err)
+		testProfile4 := gotProfile.DeepCopy()
+		delete(testProfile4.Labels, extension.LabelControllerManaged)
+		err = r.Client.Patch(context.TODO(), testProfile4, client.MergeFrom(gotProfile))
+		assert.NoError(t, err)
+		gotProfile = &configv1alpha1.ClusterColocationProfile{}
+		err = r.Client.Get(context.TODO(), client.ObjectKey{Name: testProfile.Name}, gotProfile)
+		assert.NoError(t, err)
+		r.podUpdateCache.Delete(getPodUpdateKey(gotProfile, testPod))
+		result, err = r.Reconcile(context.TODO(), ctrl.Request{
+			NamespacedName: types.NamespacedName{
+				Name: testProfile.Name,
+			},
+		})
+		assert.NoError(t, err)
+		assert.Equal(t, ctrl.Result{}, result)
+
+		// skip reconcile for deleted profile
 		err = r.Client.Delete(context.TODO(), testProfile3)
 		assert.NoError(t, err)
 		result, err = r.Reconcile(context.TODO(), ctrl.Request{
diff --git a/pkg/controller/colocationprofile/colocationprofile_util_test.go b/pkg/controller/colocationprofile/colocationprofile_util_test.go
index 20936046..e3d7d048 100644
--- a/pkg/controller/colocationprofile/colocationprofile_util_test.go
+++ b/pkg/controller/colocationprofile/colocationprofile_util_test.go
@@ -40,6 +40,9 @@ func Test_listPodsForProfile(t *testing.T) {
 	testProfileForNothing := &configv1alpha1.ClusterColocationProfile{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: "test-profile",
+			Labels: map[string]string{
+				extension.LabelControllerManaged: "true",
+			},
 		},
 		Spec: configv1alpha1.ClusterColocationProfileSpec{
 			Selector: nil,
@@ -59,6 +62,9 @@ func Test_listPodsForProfile(t *testing.T) {
 	testProfile := &configv1alpha1.ClusterColocationProfile{
 		ObjectMeta: metav1.ObjectMeta{
 			Name: "test-profile",
+			Labels: map[string]string{
+				extension.LabelControllerManaged: "true",
+			},
 		},
 		Spec: configv1alpha1.ClusterColocationProfileSpec{
 			Selector: &metav1.LabelSelector{
@@ -207,6 +213,9 @@ func Test_updatePodByClusterColocationProfile(t *testing.T) {
 			profile: &configv1alpha1.ClusterColocationProfile{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "test-profile",
+					Labels: map[string]string{
+						extension.LabelControllerManaged: "true",
+					},
 				},
 				Spec: configv1alpha1.ClusterColocationProfileSpec{
 					NamespaceSelector: &metav1.LabelSelector{
@@ -318,6 +327,9 @@ func Test_updatePodByClusterColocationProfile(t *testing.T) {
 			profile: &configv1alpha1.ClusterColocationProfile{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "test-profile",
+					Labels: map[string]string{
+						extension.LabelControllerManaged: "true",
+					},
 				},
 				Spec: configv1alpha1.ClusterColocationProfileSpec{
 					NamespaceSelector: &metav1.LabelSelector{
@@ -436,6 +448,10 @@ func Test_updatePodByClusterColocationProfile(t *testing.T) {
 			profile: &configv1alpha1.ClusterColocationProfile{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "test-profile",
+
+					Labels: map[string]string{
+						extension.LabelControllerManaged: "true",
+					},
 				},
 				Spec: configv1alpha1.ClusterColocationProfileSpec{
 					Selector: &metav1.LabelSelector{},
@@ -549,6 +565,10 @@ func Test_updatePodByClusterColocationProfile(t *testing.T) {
 			profile: &configv1alpha1.ClusterColocationProfile{
 				ObjectMeta: metav1.ObjectMeta{
 					Name: "test-profile",
+
+					Labels: map[string]string{
+						extension.LabelControllerManaged: "true",
+					},
 				},
 				Spec: configv1alpha1.ClusterColocationProfileSpec{
 					NamespaceSelector: &metav1.LabelSelector{
diff --git a/pkg/scheduler/plugins/elasticquota/core/hook_plugin_test.go b/pkg/scheduler/plugins/elasticquota/core/hook_plugin_test.go
index 553598c1..d32c27fd 100644
--- a/pkg/scheduler/plugins/elasticquota/core/hook_plugin_test.go
+++ b/pkg/scheduler/plugins/elasticquota/core/hook_plugin_test.go
@@ -18,6 +18,7 @@ package core
 
 import (
 	"fmt"
+	"sync"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -153,7 +154,7 @@ func TestPrePostQuotaUpdateHooks(t *testing.T) {
 		assert.True(t, ok, "Storage should contain mockHookValue")
 		assert.Equal(t, "testValue", value, "Storage value should match")
 	}
-	mockHook.PreQuotaUpdateValidateFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
+	mockHook.SetPreQuotaUpdateValidateFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
 		state *QuotaUpdateState) {
 		validateInputParametersFn(oldQuotaInfo, newQuotaInfo, quota, state)
 		updateStateFn(state)
@@ -161,8 +162,8 @@ func TestPrePostQuotaUpdateHooks(t *testing.T) {
 		assert.NotNil(t, gqm.GetQuotaInfoReader().GetQuotaInfoNoLock(parentQuota.Name), "parent should not be nil")
 		assert.Nil(t, gqm.GetQuotaInfoReader().GetQuotaInfoNoLock(q1.Name), "q1 should be nil")
 		assert.Equal(t, 0, len(gqm.GetQuotaInfoReader().GetChildQuotaInfosNoLock(parentQuota.Name)))
-	}
-	mockHook.PostQuotaUpdateValidateFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
+	})
+	mockHook.SetPostQuotaUpdateValidateFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
 		state *QuotaUpdateState) {
 		validateInputParametersFn(oldQuotaInfo, newQuotaInfo, quota, state)
 		validateStateUpdated(state)
@@ -171,29 +172,29 @@ func TestPrePostQuotaUpdateHooks(t *testing.T) {
 			"parent should not be nil")
 		assert.NotNil(t, gqm.GetQuotaInfoReader().GetQuotaInfoNoLock(q1.Name), "q1 should not be nil")
 		assert.Equal(t, 1, len(gqm.GetQuotaInfoReader().GetChildQuotaInfosNoLock(parentQuota.Name)))
-	}
+	})
 	err = gqm.UpdateQuota(q1)
 	assert.NoError(t, err, "UpdateQuota should succeed")
-	assert.True(t, mockHook.PreQuotaUpdateCalled, "PreQuotaUpdate should be called")
-	assert.True(t, mockHook.PostQuotaUpdateCalled, "PostQuotaUpdate should be called")
+	assert.True(t, mockHook.IsPreQuotaUpdateCalled(), "PreQuotaUpdate should be called")
+	assert.True(t, mockHook.IsPostQuotaUpdateCalled(), "PostQuotaUpdate should be called")
 
 	// validate Update operation: PreQuotaUpdate and PostQuotaUpdate hooks should not be called when quota has not been updated
 	mockHook.Reset()
 	err = gqm.UpdateQuota(q1)
 	assert.NoError(t, err, "UpdateQuota should succeed")
-	assert.False(t, mockHook.PreQuotaUpdateCalled, "PreQuotaUpdate should not be called")
-	assert.False(t, mockHook.PostQuotaUpdateCalled, "PostQuotaUpdate should not be called")
+	assert.False(t, mockHook.IsPreQuotaUpdateCalled(), "PreQuotaUpdate should not be called")
+	assert.False(t, mockHook.IsPostQuotaUpdateCalled(), "PostQuotaUpdate should not be called")
 
 	// validate Update operation: PreQuotaUpdate and PostQuotaUpdate hooks should be called
 	// (decision is made by hook plugin) even when quota has not been updated.
 	mockHook.Reset()
-	mockHook.IsQuotaUpdatedFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
+	mockHook.SetIsQuotaUpdatedFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
 		return true
-	}
+	})
 	err = gqm.UpdateQuota(q1)
 	assert.NoError(t, err, "UpdateQuota should succeed")
-	assert.True(t, mockHook.PreQuotaUpdateCalled, "PreQuotaUpdate should be called")
-	assert.True(t, mockHook.PostQuotaUpdateCalled, "PostQuotaUpdate should be called")
+	assert.True(t, mockHook.IsPreQuotaUpdateCalled(), "PreQuotaUpdate should be called")
+	assert.True(t, mockHook.IsPostQuotaUpdateCalled(), "PostQuotaUpdate should be called")
 
 	// validate Update operation: spec.max is updated
 	mockHook.Reset()
@@ -212,20 +213,20 @@ func TestPrePostQuotaUpdateHooks(t *testing.T) {
 		assert.True(t, updatedQ1 == quota, "should be new quota")
 		assert.NotNil(t, state, "State should not be nil")
 	}
-	mockHook.PreQuotaUpdateValidateFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
+	mockHook.SetPreQuotaUpdateValidateFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
 		state *QuotaUpdateState) {
 		validateInputParametersFn(oldQuotaInfo, newQuotaInfo, quota, state)
 		updateStateFn(state)
-	}
-	mockHook.PostQuotaUpdateValidateFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
+	})
+	mockHook.SetPostQuotaUpdateValidateFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
 		state *QuotaUpdateState) {
 		validateInputParametersFn(oldQuotaInfo, newQuotaInfo, quota, state)
 		validateStateUpdated(state)
-	}
+	})
 	err = gqm.UpdateQuota(updatedQ1)
 	assert.NoError(t, err, "UpdateQuota should succeed")
-	assert.True(t, mockHook.PreQuotaUpdateCalled, "PreQuotaUpdate should be called")
-	assert.True(t, mockHook.PostQuotaUpdateCalled, "PostQuotaUpdate should be called")
+	assert.True(t, mockHook.IsPreQuotaUpdateCalled(), "PreQuotaUpdate should be called")
+	assert.True(t, mockHook.IsPostQuotaUpdateCalled(), "PostQuotaUpdate should be called")
 
 	// validate Delete operation
 	mockHook.Reset()
@@ -238,16 +239,16 @@ func TestPrePostQuotaUpdateHooks(t *testing.T) {
 		assert.True(t, updatedQ1 == quota, "Quota should match")
 		assert.NotNil(t, state, "State should not be nil")
 	}
-	mockHook.PreQuotaUpdateValidateFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
+	mockHook.SetPreQuotaUpdateValidateFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
 		state *QuotaUpdateState) {
 		validateInputParametersFn(oldQuotaInfo, newQuotaInfo, quota, state)
 		updateStateFn(state)
-	}
-	mockHook.PostQuotaUpdateValidateFn = func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
+	})
+	mockHook.SetPostQuotaUpdateValidateFn(func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota,
 		state *QuotaUpdateState) {
 		validateInputParametersFn(oldQuotaInfo, newQuotaInfo, quota, state)
 		validateStateUpdated(state)
-	}
+	})
 }
 
 // TestOnPodUpdateHook tests the OnPodUpdateHook method
@@ -266,38 +267,38 @@ func TestOnPodUpdateHook(t *testing.T) {
 	pod1 := schetesting.MakePod().Name("pod1").Label(extension.LabelQuotaName, q1.Name).Containers(
 		[]v1.Container{schetesting.MakeContainer().Name("0").Resources(map[v1.ResourceName]string{
 			v1.ResourceCPU: "2"}).Obj()}).Node("node0").Obj()
-	mockHook.OnPodUpdatedValidateFn = func(quotaName string, oldPod, newPod *v1.Pod) {
+	mockHook.SetOnPodUpdatedValidateFn(func(quotaName string, oldPod, newPod *v1.Pod) {
 		assert.Equal(t, q1.Name, quotaName, "Quota name should match")
 		assert.Nil(t, oldPod, "Old pod should be nil for create operation")
 		assert.NotNil(t, newPod, "New pod should not be nil")
 		assert.True(t, pod1 == newPod, "New pod should match")
-	}
+	})
 	gqm.OnPodAdd(q1.Name, pod1)
-	assert.True(t, mockHook.OnPodUpdatedCalled, "OnPodUpdated should be called")
+	assert.True(t, mockHook.IsOnPodUpdatedCalled(), "OnPodUpdated should be called")
 
 	// validate Pod Update operation
 	mockHook.Reset()
 	updatedPod1 := pod1.DeepCopy()
-	mockHook.OnPodUpdatedValidateFn = func(quotaName string, oldPod, newPod *v1.Pod) {
+	mockHook.SetOnPodUpdatedValidateFn(func(quotaName string, oldPod, newPod *v1.Pod) {
 		assert.Equal(t, q1.Name, quotaName, "Quota name should match")
 		assert.NotNil(t, oldPod, "Old pod should not be nil")
 		assert.True(t, pod1 == oldPod, "Old pod should match")
 		assert.NotNil(t, newPod, "New pod should not be nil")
 		assert.True(t, updatedPod1 == newPod, "New pod should match")
-	}
+	})
 	gqm.OnPodUpdate(q1.Name, q1.Name, updatedPod1, pod1)
-	assert.True(t, mockHook.OnPodUpdatedCalled, "OnPodUpdated should be called")
+	assert.True(t, mockHook.IsOnPodUpdatedCalled(), "OnPodUpdated should be called")
 
 	// validate Pod Delete operation
 	mockHook.Reset()
-	mockHook.OnPodUpdatedValidateFn = func(quotaName string, oldPod, newPod *v1.Pod) {
+	mockHook.SetOnPodUpdatedValidateFn(func(quotaName string, oldPod, newPod *v1.Pod) {
 		assert.Equal(t, q1.Name, quotaName, "Quota name should match")
 		assert.NotNil(t, oldPod, "Old pod should not be nil")
 		assert.True(t, updatedPod1 == oldPod, "Old pod should match")
 		assert.Nil(t, newPod, "New pod should be nil for delete operation")
-	}
+	})
 	gqm.OnPodDelete(q1.Name, updatedPod1)
-	assert.True(t, mockHook.OnPodUpdatedCalled, "OnPodUpdated should be called")
+	assert.True(t, mockHook.IsOnPodUpdatedCalled(), "OnPodUpdated should be called")
 
 	// validate Pod Reserve operation
 	unassignedPod := pod1.DeepCopy()
@@ -305,25 +306,25 @@ func TestOnPodUpdateHook(t *testing.T) {
 	gqm.OnPodAdd(q1.Name, unassignedPod)
 
 	mockHook.Reset()
-	mockHook.OnPodUpdatedValidateFn = func(quotaName string, oldPod, newPod *v1.Pod) {
+	mockHook.SetOnPodUpdatedValidateFn(func(quotaName string, oldPod, newPod *v1.Pod) {
 		assert.Equal(t, q1.Name, quotaName, "Quota name should match")
 		assert.Nil(t, oldPod, "Old pod should be nil for reserve operation")
 		assert.NotNil(t, newPod, "New pod should not be nil")
 		assert.True(t, unassignedPod == newPod, "New pod should match")
-	}
+	})
 	gqm.ReservePod(q1.Name, unassignedPod)
-	assert.True(t, mockHook.OnPodUpdatedCalled, "OnPodUpdated should be called")
+	assert.True(t, mockHook.IsOnPodUpdatedCalled(), "OnPodUpdated should be called")
 
 	// validate Pod UnReserve operation
 	mockHook.Reset()
-	mockHook.OnPodUpdatedValidateFn = func(quotaName string, oldPod, newPod *v1.Pod) {
+	mockHook.SetOnPodUpdatedValidateFn(func(quotaName string, oldPod, newPod *v1.Pod) {
 		assert.Equal(t, q1.Name, quotaName, "Quota name should match")
 		assert.NotNil(t, oldPod, "Old pod should not be nil")
 		assert.True(t, unassignedPod == oldPod, "Old pod should match")
 		assert.Nil(t, newPod, "New pod should be nil for unreserve operation")
-	}
+	})
 	gqm.UnreservePod(q1.Name, unassignedPod)
-	assert.True(t, mockHook.OnPodUpdatedCalled, "OnPodUpdated should be called")
+	assert.True(t, mockHook.IsOnPodUpdatedCalled(), "OnPodUpdated should be called")
 }
 
 func initGQMForTesting(t *testing.T) *GroupQuotaManager {
@@ -351,60 +352,146 @@ var _ QuotaHookPlugin = &MockHookPlugin{}
 // MockHookPlugin is a mock implementation of QuotaHookPlugin
 type MockHookPlugin struct {
 	key                      string
-	PreQuotaUpdateCalled     bool
-	PreQuotaUpdateValidateFn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState)
+	preQuotaUpdateQuotas     []string
+	preQuotaUpdateValidateFn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState)
 
-	IsQuotaUpdatedFn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool
+	isQuotaUpdatedFn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool
 
-	PostQuotaUpdateCalled     bool
-	PostQuotaUpdateValidateFn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState)
+	postQuotaUpdateQuotas     []string
+	postQuotaUpdateValidateFn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState)
 
-	OnPodUpdatedCalled     bool
-	OnPodUpdatedValidateFn func(quotaName string, oldPod, newPod *v1.Pod)
+	onPodUpdatedCalled     bool
+	onPodUpdatedValidateFn func(quotaName string, oldPod, newPod *v1.Pod)
+
+	sync.RWMutex
 }
 
 func (m *MockHookPlugin) Reset() {
-	m.PreQuotaUpdateCalled = false
-	m.PreQuotaUpdateValidateFn = nil
-	m.IsQuotaUpdatedFn = nil
-	m.PostQuotaUpdateCalled = false
-	m.PostQuotaUpdateValidateFn = nil
-	m.OnPodUpdatedCalled = false
-	m.OnPodUpdatedValidateFn = nil
+	m.Lock()
+	defer m.Unlock()
+
+	m.preQuotaUpdateQuotas = nil
+	m.preQuotaUpdateValidateFn = nil
+	m.isQuotaUpdatedFn = nil
+	m.postQuotaUpdateQuotas = nil
+	m.postQuotaUpdateValidateFn = nil
+	m.onPodUpdatedCalled = false
+	m.onPodUpdatedValidateFn = nil
+}
+
+// Helper methods to safely set function fields with write lock protection
+func (m *MockHookPlugin) SetPreQuotaUpdateValidateFn(fn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState)) {
+	m.Lock()
+	defer m.Unlock()
+	m.preQuotaUpdateValidateFn = fn
+}
+
+func (m *MockHookPlugin) SetIsQuotaUpdatedFn(fn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool) {
+	m.Lock()
+	defer m.Unlock()
+	m.isQuotaUpdatedFn = fn
+}
+
+func (m *MockHookPlugin) SetPostQuotaUpdateValidateFn(fn func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState)) {
+	m.Lock()
+	defer m.Unlock()
+	m.postQuotaUpdateValidateFn = fn
+}
+
+func (m *MockHookPlugin) SetOnPodUpdatedValidateFn(fn func(quotaName string, oldPod, newPod *v1.Pod)) {
+	m.Lock()
+	defer m.Unlock()
+	m.onPodUpdatedValidateFn = fn
 }
 
 func (m *MockHookPlugin) GetKey() string {
+	m.RLock()
+	defer m.RUnlock()
 	return m.key
 }
 
 func (m *MockHookPlugin) IsQuotaUpdated(oldQuotaInfo, newQuotaInfo *QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
-	if m.IsQuotaUpdatedFn != nil {
-		return m.IsQuotaUpdatedFn(oldQuotaInfo, newQuotaInfo, newQuota)
+	m.RLock()
+	isQuotaUpdatedFn := m.isQuotaUpdatedFn
+	m.RUnlock()
+
+	if isQuotaUpdatedFn != nil {
+		return isQuotaUpdatedFn(oldQuotaInfo, newQuotaInfo, newQuota)
 	}
 	return false
 }
 
 func (m *MockHookPlugin) PreQuotaUpdate(oldQuotaInfo *QuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState) {
-	m.PreQuotaUpdateCalled = true
-	if m.PreQuotaUpdateValidateFn != nil {
-		m.PreQuotaUpdateValidateFn(oldQuotaInfo, newQuotaInfo, quota, state)
+	m.Lock()
+	m.preQuotaUpdateQuotas = append(m.preQuotaUpdateQuotas, quota.Name)
+	validateFn := m.preQuotaUpdateValidateFn
+	m.Unlock()
+
+	if validateFn != nil {
+		validateFn(oldQuotaInfo, newQuotaInfo, quota, state)
 	}
 }
 
 func (m *MockHookPlugin) PostQuotaUpdate(oldQuotaInfo *QuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState) {
-	m.PostQuotaUpdateCalled = true
-	if m.PostQuotaUpdateValidateFn != nil {
-		m.PostQuotaUpdateValidateFn(oldQuotaInfo, newQuotaInfo, quota, state)
+	m.Lock()
+	m.postQuotaUpdateQuotas = append(m.postQuotaUpdateQuotas, quota.Name)
+	validateFn := m.postQuotaUpdateValidateFn
+	m.Unlock()
+
+	if validateFn != nil {
+		validateFn(oldQuotaInfo, newQuotaInfo, quota, state)
 	}
 }
 
 func (m *MockHookPlugin) OnPodUpdated(quotaName string, oldPod, newPod *v1.Pod) {
-	m.OnPodUpdatedCalled = true
-	if m.OnPodUpdatedValidateFn != nil {
-		m.OnPodUpdatedValidateFn(quotaName, oldPod, newPod)
+	m.Lock()
+	m.onPodUpdatedCalled = true
+	validateFn := m.onPodUpdatedValidateFn
+	m.Unlock()
+
+	if validateFn != nil {
+		validateFn(quotaName, oldPod, newPod)
 	}
 }
 
+// Safe getter methods for boolean fields
+func (m *MockHookPlugin) IsPreQuotaUpdateCalled() bool {
+	m.RLock()
+	defer m.RUnlock()
+	return len(m.preQuotaUpdateQuotas) > 0
+}
+
+func (m *MockHookPlugin) IsPostQuotaUpdateCalled() bool {
+	m.RLock()
+	defer m.RUnlock()
+	return len(m.postQuotaUpdateQuotas) > 0
+}
+
+func (m *MockHookPlugin) IsOnPodUpdatedCalled() bool {
+	m.RLock()
+	defer m.RUnlock()
+	return m.onPodUpdatedCalled
+}
+
+// Safe getter methods for slice fields
+func (m *MockHookPlugin) GetPreQuotaUpdateQuotas() []string {
+	m.RLock()
+	defer m.RUnlock()
+	// Return a copy to prevent external modification
+	result := make([]string, len(m.preQuotaUpdateQuotas))
+	copy(result, m.preQuotaUpdateQuotas)
+	return result
+}
+
+func (m *MockHookPlugin) GetPostQuotaUpdateQuotas() []string {
+	m.RLock()
+	defer m.RUnlock()
+	// Return a copy to prevent external modification
+	result := make([]string, len(m.postQuotaUpdateQuotas))
+	copy(result, m.postQuotaUpdateQuotas)
+	return result
+}
+
 // The following methods of MockHookPlugin are tested in the plugin package instead of this file
 
 func (m *MockHookPlugin) UpdateQuotaStatus(_, _ *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota {
@@ -414,3 +501,98 @@ func (m *MockHookPlugin) UpdateQuotaStatus(_, _ *v1alpha1.ElasticQuota) *v1alpha
 func (m *MockHookPlugin) CheckPod(quotaName string, pod *v1.Pod) error {
 	return nil
 }
+
+func TestResetQuotasForHookPlugins(t *testing.T) {
+	gqm := initGQMForTesting(t)
+	hookPlugins := gqm.GetHookPlugins()
+	assert.Equal(t, 1, len(hookPlugins))
+	mockHook := hookPlugins[0].(*MetricsWrapper).GetPlugin().(*MockHookPlugin)
+
+	// create test quotas and add them to GQM
+	parentQuota := CreateQuota("test-parent", extension.RootQuotaName, 100, 100, 0, 0, false, false)
+	err := gqm.UpdateQuota(parentQuota)
+	assert.NoError(t, err, "UpdateQuota should succeed")
+
+	q1 := CreateQuota("q1", parentQuota.Name, 40, 40, 20, 20, false, false)
+	err = gqm.UpdateQuota(q1)
+	assert.NoError(t, err, "UpdateQuota should succeed")
+
+	q2 := CreateQuota("q2", parentQuota.Name, 30, 30, 10, 10, false, false)
+	err = gqm.UpdateQuota(q2)
+	assert.NoError(t, err, "UpdateQuota should succeed")
+
+	validateHookParameters := func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState) {
+		assert.Nil(t, oldQuotaInfo, "Old quota info should be nil for reset operation")
+		assert.NotNil(t, newQuotaInfo, "New quota info should not be nil")
+		assert.NotNil(t, quota, "Quota should not be nil")
+		assert.NotNil(t, state, "State should not be nil")
+	}
+	quotaUpdateValidateFn := func(oldQuotaInfo, newQuotaInfo *QuotaInfo, quota *v1alpha1.ElasticQuota, state *QuotaUpdateState) {
+		validateHookParameters(oldQuotaInfo, newQuotaInfo, quota, state)
+	}
+	resetHookFn := func() {
+		mockHook.Reset()
+		mockHook.SetPreQuotaUpdateValidateFn(quotaUpdateValidateFn)
+		mockHook.SetPostQuotaUpdateValidateFn(quotaUpdateValidateFn)
+	}
+
+	// Test case 1: Reset with all quotas present
+	resetHookFn()
+	quotas := map[string]*v1alpha1.ElasticQuota{
+		parentQuota.Name: parentQuota,
+		q1.Name:          q1,
+		q2.Name:          q2,
+	}
+
+	gqm.ResetQuotasForHookPlugins(quotas)
+
+	// validate that hooks were called for all quotas
+	preUpdateQuotas := mockHook.GetPreQuotaUpdateQuotas()
+	postUpdateQuotas := mockHook.GetPostQuotaUpdateQuotas()
+	assert.Equal(t, 3, len(preUpdateQuotas), "PreQuotaUpdate should be called for all 3 quotas")
+	assert.Equal(t, 3, len(postUpdateQuotas), "PostQuotaUpdate should be called for all 3 quotas")
+
+	// validate that the correct quotas were processed
+	expectedQuotas := []string{parentQuota.Name, q1.Name, q2.Name}
+	for _, quota := range expectedQuotas {
+		assert.Contains(t, preUpdateQuotas, quota, "Quota %s should be in preUpdateQuotas", quota)
+		assert.Contains(t, postUpdateQuotas, quota, "Quota %s should be in postUpdateQuotas", quota)
+	}
+
+	// Test case 2: Reset with missing quota (should skip inconsistent quota)
+	resetHookFn()
+
+	// Remove one quota from the input map
+	quotasWithMissing := map[string]*v1alpha1.ElasticQuota{
+		parentQuota.Name: parentQuota,
+		q1.Name:          q1,
+		// q2 is missing
+	}
+
+	gqm.ResetQuotasForHookPlugins(quotasWithMissing)
+
+	// validate that hooks were called only for present quotas
+	preUpdateQuotas = mockHook.GetPreQuotaUpdateQuotas()
+	postUpdateQuotas = mockHook.GetPostQuotaUpdateQuotas()
+	assert.Equal(t, 2, len(preUpdateQuotas), "PreQuotaUpdate should be called for 2 present quotas")
+	assert.Equal(t, 2, len(postUpdateQuotas), "PostQuotaUpdate should be called for 2 present quotas")
+
+	// validate that only present quotas were processed
+	expectedQuotas = []string{parentQuota.Name, q1.Name}
+	for _, quota := range expectedQuotas {
+		assert.Contains(t, preUpdateQuotas, quota, "Quota %s should be in preUpdateQuotas", quota)
+		assert.Contains(t, postUpdateQuotas, quota, "Quota %s should be in postUpdateQuotas", quota)
+	}
+
+	// Test case 3: Reset with empty quotas map
+	resetHookFn()
+
+	emptyQuotas := map[string]*v1alpha1.ElasticQuota{}
+	gqm.ResetQuotasForHookPlugins(emptyQuotas)
+
+	// validate that no hooks were called
+	preUpdateQuotas = mockHook.GetPreQuotaUpdateQuotas()
+	postUpdateQuotas = mockHook.GetPostQuotaUpdateQuotas()
+	assert.Equal(t, 0, len(preUpdateQuotas), "No PreQuotaUpdate quotas expected")
+	assert.Equal(t, 0, len(postUpdateQuotas), "No PostQuotaUpdate quotas expected")
+}
diff --git a/pkg/scheduler/plugins/elasticquota/hook_plugin_test.go b/pkg/scheduler/plugins/elasticquota/hook_plugin_test.go
index c94953dd..09cea0f2 100644
--- a/pkg/scheduler/plugins/elasticquota/hook_plugin_test.go
+++ b/pkg/scheduler/plugins/elasticquota/hook_plugin_test.go
@@ -19,13 +19,16 @@ package elasticquota
 import (
 	"context"
 	"fmt"
+	"sync"
 	"testing"
 	"time"
 
 	"github.com/stretchr/testify/assert"
 	v1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/apimachinery/pkg/labels"
+	quotav1 "k8s.io/apiserver/pkg/quota/v1"
 	"k8s.io/kubernetes/pkg/scheduler/framework"
 	schetesting "k8s.io/kubernetes/pkg/scheduler/testing"
 
@@ -65,7 +68,7 @@ func TestUpdateQuotaStatusHook(t *testing.T) {
 
 	// validate OnQuotaStatusUpdated
 	mockHook := gqm.GetHookPlugins()[0].(*core.MetricsWrapper).GetPlugin().(*MockHookPlugin)
-	mockHook.UpdateQuotaStatusValidateFn = func(oldQuota, newQuota *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota {
+	mockHook.SetUpdateQuotaStatusValidateFn(func(oldQuota, newQuota *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota {
 		assert.NotNil(t, oldQuota, "Old quota should not be nil")
 		if oldQuota.Name == q1.Name {
 			// update quota
@@ -75,9 +78,9 @@ func TestUpdateQuotaStatusHook(t *testing.T) {
 			return updatedQuota
 		}
 		return nil
-	}
+	})
 	ctrl.syncElasticQuotaStatusWorker()
-	assert.True(t, mockHook.UpdateQuotaStatusCalled, "UpdateQuotaStatus should be called")
+	assert.True(t, mockHook.IsUpdateQuotaStatusCalled(), "UpdateQuotaStatus should be called")
 
 	eq, err := suit.client.SchedulingV1alpha1().ElasticQuotas(q1.Namespace).Get(
 		context.TODO(), q1.Name, metav1.GetOptions{})
@@ -99,9 +102,9 @@ func TestCheckPodHook(t *testing.T) {
 
 	// validate CheckPod
 	mockHook := gqm.GetHookPlugins()[0].(*core.MetricsWrapper).GetPlugin().(*MockHookPlugin)
-	mockHook.CheckPodFn = func(quotaName string, pod *v1.Pod) error {
+	mockHook.SetCheckPodFn(func(quotaName string, pod *v1.Pod) error {
 		return fmt.Errorf("test error")
-	}
+	})
 
 	// validate Pod Create operation: add pod with assigned node
 	pod1 := schetesting.MakePod().Name("pod1").Label(extension.LabelQuotaName, q1.Name).Containers(
@@ -112,6 +115,149 @@ func TestCheckPodHook(t *testing.T) {
 	assert.Equal(t, "CheckPod failed for hook plugin mockPlugin, err: test error", status.Message())
 }
 
+// TestUpdateQuota_IsQuotaUpdated tests the IsQuotaUpdated condition in UpdateQuota method
+func TestUpdateQuota_IsQuotaUpdated(t *testing.T) {
+	// init plugin and gqm
+	_, plugin := initPluginSuit(t)
+	gqm := plugin.groupQuotaManager
+	assert.Equal(t, 1, len(gqm.GetHookPlugins()))
+
+	// init quota
+	q1 := CreateQuota2("q1", extension.RootQuotaName, 10, 10, 0, 0, 0, 0, false, "")
+	plugin.OnQuotaAdd(q1)
+
+	// get mock hook plugin
+	mockHook := gqm.GetHookPlugins()[0].(*core.MetricsWrapper).GetPlugin().(*MockHookPlugin)
+
+	// test case 1: quota has no changes and IsQuotaUpdated returns false
+	// PreQuotaUpdate and PostQuotaUpdate should not be called
+	mockHook.Reset()
+	mockHook.SetIsQuotaUpdatedFn(func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
+		return false
+	})
+
+	// update with the same quota (no changes)
+	plugin.OnQuotaUpdate(q1, q1)
+	assert.Equal(t, 0, len(mockHook.GetPreQuotaUpdateQuotas()), "PreQuotaUpdate should not be called when quota unchanged and IsQuotaUpdated returns false")
+	assert.Equal(t, 0, len(mockHook.GetPostQuotaUpdateQuotas()), "PostQuotaUpdate should not be called when quota unchanged and IsQuotaUpdated returns false")
+
+	// test case 2: quota has no changes but IsQuotaUpdated returns true
+	// PreQuotaUpdate and PostQuotaUpdate should be called
+	mockHook.Reset()
+	mockHook.SetIsQuotaUpdatedFn(func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
+		// verify that the hook receives correct parameters
+		assert.NotNil(t, oldQuotaInfo, "oldQuotaInfo should not be nil")
+		assert.NotNil(t, newQuotaInfo, "newQuotaInfo should not be nil")
+		assert.NotNil(t, newQuota, "newQuota should not be nil")
+		assert.Equal(t, oldQuotaInfo.Name, newQuotaInfo.Name, "newQuotaInfo name should match")
+		assert.Equal(t, newQuotaInfo.Name, newQuota.Name, "newQuota name should match")
+		return true
+	})
+
+	// validation functions for PreQuotaUpdate and PostQuotaUpdate
+	validateHookParameters := func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState) {
+		assert.NotNil(t, oldQuotaInfo, "oldQuotaInfo should not be nil")
+		assert.NotNil(t, newQuotaInfo, "newQuotaInfo should not be nil")
+		assert.NotNil(t, quota, "quota should not be nil")
+		assert.NotNil(t, state, "state should not be nil")
+	}
+
+	mockHook.SetPreQuotaUpdateValidateFn(validateHookParameters)
+	mockHook.SetPostQuotaUpdateValidateFn(validateHookParameters)
+
+	// update with the same quota (no changes), but IsQuotaUpdated returns true
+	plugin.OnQuotaUpdate(q1, q1)
+	assert.True(t, len(mockHook.GetPreQuotaUpdateQuotas()) > 0,
+		"PreQuotaUpdate should be called when IsQuotaUpdated returns true")
+	assert.True(t, len(mockHook.GetPostQuotaUpdateQuotas()) > 0,
+		"PostQuotaUpdate should be called when IsQuotaUpdated returns true")
+
+	// test case 3: quota has changes, IsQuotaUpdated should not affect the result
+	// PreQuotaUpdate and PostQuotaUpdate should be called regardless of IsQuotaUpdated return value
+	mockHook.Reset()
+	mockHook.SetIsQuotaUpdatedFn(func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
+		return false // Even if this returns false, hooks should still be called because quota has changes
+	})
+
+	// create a modified quota
+	q1Modified := q1.DeepCopy()
+	q1Modified.Spec.Max = v1.ResourceList{
+		v1.ResourceCPU:    resource.MustParse("20"),
+		v1.ResourceMemory: resource.MustParse("20Gi"),
+	}
+
+	validateHookParameters = func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo,
+		quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState) {
+		assert.NotNil(t, oldQuotaInfo, "oldQuotaInfo should not be nil")
+		assert.NotNil(t, newQuotaInfo, "newQuotaInfo should not be nil")
+		assert.NotNil(t, quota, "quota should not be nil")
+		assert.NotNil(t, state, "state should not be nil")
+		assert.Equal(t, q1Modified.Name, quota.Name, "quota name should match")
+		// verify that the new quota has the updated max values
+		assert.True(t, quotav1.Equals(newQuotaInfo.CalculateInfo.Max, q1Modified.Spec.Max),
+			"newQuotaInfo should have updated max values")
+	}
+	mockHook.SetPreQuotaUpdateValidateFn(validateHookParameters)
+	mockHook.SetPostQuotaUpdateValidateFn(validateHookParameters)
+
+	// update with modified quota
+	plugin.OnQuotaUpdate(q1, q1Modified)
+	assert.True(t, len(mockHook.GetPreQuotaUpdateQuotas()) > 0, "PreQuotaUpdate should be called when quota has changes")
+	assert.True(t, len(mockHook.GetPostQuotaUpdateQuotas()) > 0, "PostQuotaUpdate should be called when quota has changes")
+}
+
+func TestReplaceQuotasWithHookPlugins(t *testing.T) {
+	// register a mock hook plugin factory for testing
+	core.RegisterHookPluginFactory("mockFactory",
+		func(qiProvider *core.QuotaInfoReader, key, args string) (core.QuotaHookPlugin, error) {
+			return &MockHookPlugin{key: key}, nil
+		})
+
+	// create test suit with hook plugin configuration
+	suit := newPluginTestSuit(t, nil,
+		func(elasticQuotaArgs *config.ElasticQuotaArgs) {
+			elasticQuotaArgs.HookPlugins = []config.HookPluginConf{
+				{
+					Key:        "mockPlugin",
+					FactoryKey: "mockFactory",
+				},
+			}
+		})
+	p, err := suit.proxyNew(suit.elasticQuotaArgs, suit.Handle)
+	assert.Nil(t, err)
+	plugin := p.(*Plugin)
+
+	// prepare test quotas
+	quotas := []interface{}{
+		CreateQuota2("test1", extension.RootQuotaName, 100, 200, 40, 80, 1, 1, true, ""),
+		CreateQuota2("test2", extension.RootQuotaName, 200, 400, 80, 160, 1, 1, true, ""),
+		CreateQuota2("test11", "test1", 100, 200, 40, 80, 1, 1, false, ""),
+	}
+
+	// ReplaceQuotas will conflict with QuotaEventHandler. sleep 1 seconds to avoid it.
+	time.Sleep(time.Second)
+	// call ReplaceQuotas which should trigger ResetQuotasForHookPlugins
+	err = plugin.ReplaceQuotas(quotas)
+	assert.Nil(t, err)
+
+	// verify hook plugins were called
+	hookPlugins := plugin.groupQuotaManager.GetHookPlugins()
+	assert.Equal(t, 1, len(hookPlugins))
+
+	mockHook := hookPlugins[0].(*core.MetricsWrapper).GetPlugin().(*MockHookPlugin)
+
+	// verify that the quotas were processed correctly
+	expectedQuotaNames := []string{"test1", "test2", "test11"}
+	preQuotas := mockHook.GetPreQuotaUpdateQuotas()
+	postQuotas := mockHook.GetPostQuotaUpdateQuotas()
+	for _, expectedName := range expectedQuotaNames {
+		assert.Contains(t, preQuotas, expectedName,
+			"Quota %s should be processed in PreQuotaUpdate", expectedName)
+		assert.Contains(t, postQuotas, expectedName,
+			"Quota %s should be processed in PostQuotaUpdate", expectedName)
+	}
+}
+
 func initPluginSuit(t *testing.T) (*pluginTestSuit, *Plugin) {
 	core.RegisterHookPluginFactory("mockFactory",
 		func(qiProvider *core.QuotaInfoReader, key, args string) (core.QuotaHookPlugin, error) {
@@ -139,46 +285,164 @@ var _ core.QuotaHookPlugin = &MockHookPlugin{}
 type MockHookPlugin struct {
 	key string
 
-	UpdateQuotaStatusCalled     bool
-	UpdateQuotaStatusValidateFn func(oldQuota, newQuota *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota
+	updateQuotaStatusCalled     bool
+	updateQuotaStatusValidateFn func(oldQuota, newQuota *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota
+
+	checkPodCalled bool
+	checkPodFn     func(quotaName string, pod *v1.Pod) error
 
-	CheckPodCalled bool
-	CheckPodFn     func(quotaName string, pod *v1.Pod) error
+	preQuotaUpdateQuotas     []string
+	preQuotaUpdateValidateFn func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState)
+
+	postQuotaUpdateQuotas     []string
+	postQuotaUpdateValidateFn func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState)
+
+	isQuotaUpdatedFn func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool
+
+	sync.RWMutex
 }
 
 func (m *MockHookPlugin) Reset() {
-	m.CheckPodCalled = false
+	m.Lock()
+	defer m.Unlock()
+
+	m.updateQuotaStatusCalled = false
+	m.checkPodCalled = false
+	m.preQuotaUpdateQuotas = nil
+	m.postQuotaUpdateQuotas = nil
+	m.preQuotaUpdateValidateFn = nil
+	m.postQuotaUpdateValidateFn = nil
+	m.isQuotaUpdatedFn = nil
+}
+
+// Helper methods to safely set function fields with write lock protection
+func (m *MockHookPlugin) SetUpdateQuotaStatusValidateFn(fn func(oldQuota, newQuota *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota) {
+	m.Lock()
+	defer m.Unlock()
+	m.updateQuotaStatusValidateFn = fn
+}
+
+func (m *MockHookPlugin) SetCheckPodFn(fn func(quotaName string, pod *v1.Pod) error) {
+	m.Lock()
+	defer m.Unlock()
+	m.checkPodFn = fn
+}
+
+func (m *MockHookPlugin) SetIsQuotaUpdatedFn(fn func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool) {
+	m.Lock()
+	defer m.Unlock()
+	m.isQuotaUpdatedFn = fn
+}
+
+func (m *MockHookPlugin) SetPreQuotaUpdateValidateFn(fn func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState)) {
+	m.Lock()
+	defer m.Unlock()
+	m.preQuotaUpdateValidateFn = fn
+}
+
+func (m *MockHookPlugin) SetPostQuotaUpdateValidateFn(fn func(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState)) {
+	m.Lock()
+	defer m.Unlock()
+	m.postQuotaUpdateValidateFn = fn
 }
 
 func (m *MockHookPlugin) GetKey() string {
+	m.RLock()
+	defer m.RUnlock()
 	return m.key
 }
 
 func (m *MockHookPlugin) UpdateQuotaStatus(oldQuota, newQuota *v1alpha1.ElasticQuota) *v1alpha1.ElasticQuota {
-	m.UpdateQuotaStatusCalled = true
-	if m.UpdateQuotaStatusValidateFn != nil {
-		return m.UpdateQuotaStatusValidateFn(oldQuota, newQuota)
+	m.Lock()
+	m.updateQuotaStatusCalled = true
+	validateFn := m.updateQuotaStatusValidateFn
+	m.Unlock()
+
+	if validateFn != nil {
+		return validateFn(oldQuota, newQuota)
 	}
 	return nil
 }
 
 func (m *MockHookPlugin) CheckPod(quotaName string, pod *v1.Pod) error {
-	return m.CheckPodFn(quotaName, pod)
+	m.Lock()
+	m.checkPodCalled = true
+	checkFn := m.checkPodFn
+	m.Unlock()
+
+	if checkFn != nil {
+		return checkFn(quotaName, pod)
+	}
+	return nil
 }
 
 // The following methods of MockHookPlugin are tested in the core package instead of this file
 
-func (m *MockHookPlugin) IsQuotaUpdated(_, _ *core.QuotaInfo, _ *v1alpha1.ElasticQuota) bool {
+func (m *MockHookPlugin) IsQuotaUpdated(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, newQuota *v1alpha1.ElasticQuota) bool {
+	m.RLock()
+	isQuotaUpdatedFn := m.isQuotaUpdatedFn
+	m.RUnlock()
+
+	if isQuotaUpdatedFn != nil {
+		return isQuotaUpdatedFn(oldQuotaInfo, newQuotaInfo, newQuota)
+	}
 	return false
 }
 
-func (m *MockHookPlugin) PreQuotaUpdate(_ *core.QuotaInfo, _ *core.QuotaInfo, _ *v1alpha1.ElasticQuota,
-	_ *core.QuotaUpdateState) {
+func (m *MockHookPlugin) PreQuotaUpdate(oldQuotaInfo, newQuotaInfo *core.QuotaInfo,
+	quota *v1alpha1.ElasticQuota, state *core.QuotaUpdateState) {
+	m.Lock()
+	m.preQuotaUpdateQuotas = append(m.preQuotaUpdateQuotas, quota.Name)
+	validateFn := m.preQuotaUpdateValidateFn
+	m.Unlock()
+
+	if validateFn != nil {
+		validateFn(oldQuotaInfo, newQuotaInfo, quota, state)
+	}
 }
 
-func (m *MockHookPlugin) PostQuotaUpdate(_ *core.QuotaInfo, _ *core.QuotaInfo, _ *v1alpha1.ElasticQuota,
-	_ *core.QuotaUpdateState) {
+func (m *MockHookPlugin) PostQuotaUpdate(oldQuotaInfo, newQuotaInfo *core.QuotaInfo, quota *v1alpha1.ElasticQuota,
+	state *core.QuotaUpdateState) {
+	m.Lock()
+	m.postQuotaUpdateQuotas = append(m.postQuotaUpdateQuotas, quota.Name)
+	validateFn := m.postQuotaUpdateValidateFn
+	m.Unlock()
+
+	if validateFn != nil {
+		validateFn(oldQuotaInfo, newQuotaInfo, quota, state)
+	}
 }
 
 func (m *MockHookPlugin) OnPodUpdated(_ string, _, _ *v1.Pod) {
 }
+
+func (m *MockHookPlugin) IsUpdateQuotaStatusCalled() bool {
+	m.RLock()
+	defer m.RUnlock()
+	return m.updateQuotaStatusCalled
+}
+
+func (m *MockHookPlugin) IsCheckPodCalled() bool {
+	m.RLock()
+	defer m.RUnlock()
+	return m.checkPodCalled
+}
+
+// Safe getter methods for slice fields
+func (m *MockHookPlugin) GetPreQuotaUpdateQuotas() []string {
+	m.RLock()
+	defer m.RUnlock()
+	// Return a copy to prevent external modification
+	result := make([]string, len(m.preQuotaUpdateQuotas))
+	copy(result, m.preQuotaUpdateQuotas)
+	return result
+}
+
+func (m *MockHookPlugin) GetPostQuotaUpdateQuotas() []string {
+	m.RLock()
+	defer m.RUnlock()
+	// Return a copy to prevent external modification
+	result := make([]string, len(m.postQuotaUpdateQuotas))
+	copy(result, m.postQuotaUpdateQuotas)
+	return result
+}
diff --git a/pkg/scheduler/plugins/loadaware/service_test.go b/pkg/scheduler/plugins/loadaware/service_test.go
new file mode 100644
index 00000000..abb7bf2d
--- /dev/null
+++ b/pkg/scheduler/plugins/loadaware/service_test.go
@@ -0,0 +1,161 @@
+/*
+Copyright 2022 The Koordinator Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package loadaware
+
+import (
+	"encoding/json"
+	"net/http"
+	"net/http/httptest"
+	"testing"
+
+	"github.com/gin-gonic/gin"
+	"github.com/stretchr/testify/assert"
+	corev1 "k8s.io/api/core/v1"
+	"k8s.io/apimachinery/pkg/api/resource"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/util/uuid"
+)
+
+func TestQueryNode(t *testing.T) {
+	t.Run("test", func(t *testing.T) {
+
+		preTimeNowFn := timeNowFn
+		defer func() {
+			timeNowFn = preTimeNowFn
+		}()
+		timeNowFn = fakeTimeNowFn
+
+		pl := &Plugin{
+			podAssignCache: newPodAssignCache(),
+		}
+		testNodeName := "test-node"
+		pendingPod := &corev1.Pod{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: "test-pod",
+				UID:  uuid.NewUUID(),
+			},
+			Spec: corev1.PodSpec{
+				Containers: []corev1.Container{
+					{
+						Name: "main",
+						Resources: corev1.ResourceRequirements{
+							Requests: corev1.ResourceList{
+								corev1.ResourceCPU:    resource.MustParse("4"),
+								corev1.ResourceMemory: resource.MustParse("8Gi"),
+							},
+						},
+					},
+				},
+			},
+			Status: corev1.PodStatus{
+				Phase: corev1.PodPending,
+			},
+		}
+		pl.podAssignCache.assign("", pendingPod)
+		assignedPod := &corev1.Pod{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: "test-pod-1",
+				UID:  uuid.NewUUID(),
+			},
+			Spec: corev1.PodSpec{
+				Containers: []corev1.Container{
+					{
+						Name: "main",
+						Resources: corev1.ResourceRequirements{
+							Requests: corev1.ResourceList{
+								corev1.ResourceCPU:    resource.MustParse("4"),
+								corev1.ResourceMemory: resource.MustParse("8Gi"),
+							},
+						},
+					},
+				},
+				NodeName: testNodeName,
+			},
+			Status: corev1.PodStatus{
+				Phase: corev1.PodRunning,
+			},
+		}
+		pl.podAssignCache.assign(testNodeName, assignedPod)
+		terminatedPod := &corev1.Pod{
+			ObjectMeta: metav1.ObjectMeta{
+				Name: "test-terminated-pod-1",
+				UID:  uuid.NewUUID(),
+			},
+			Spec: corev1.PodSpec{
+				Containers: []corev1.Container{
+					{
+						Name: "main",
+						Resources: corev1.ResourceRequirements{
+							Requests: corev1.ResourceList{
+								corev1.ResourceCPU:    resource.MustParse("4"),
+								corev1.ResourceMemory: resource.MustParse("8Gi"),
+							},
+						},
+					},
+				},
+				NodeName: testNodeName,
+			},
+			Status: corev1.PodStatus{
+				Phase: corev1.PodFailed,
+			},
+		}
+		pl.podAssignCache.unAssign(testNodeName, terminatedPod)
+
+		// got unknown node
+		engine := gin.Default()
+		pl.RegisterEndpoints(engine.Group("/"))
+		w := httptest.NewRecorder()
+		req, _ := http.NewRequest("GET", "/node/unknown-node", nil)
+		engine.ServeHTTP(w, req)
+		assert.Equal(t, http.StatusOK, w.Result().StatusCode)
+		got := &NodeAssignInfoData{}
+		err := json.NewDecoder(w.Result().Body).Decode(got)
+		assert.NoError(t, err)
+		expectedResp := &NodeAssignInfoData{}
+		assert.Equal(t, expectedResp, got)
+
+		// got the assign pod
+		w = httptest.NewRecorder()
+		req, _ = http.NewRequest("GET", "/node/test-node", nil)
+		engine.ServeHTTP(w, req)
+		assert.Equal(t, http.StatusOK, w.Result().StatusCode)
+		got = &NodeAssignInfoData{}
+		err = json.NewDecoder(w.Result().Body).Decode(got)
+		assert.NoError(t, err)
+		expectedResp = &NodeAssignInfoData{
+			Pods: []PodAssignInfoData{
+				{
+					Timestamp: timeNowFn(),
+					Pod:       assignedPod,
+				},
+			},
+		}
+		assert.Equal(t, expectedResp, got)
+
+		// got no assign pod
+		pl.podAssignCache.unAssign(testNodeName, assignedPod)
+		w = httptest.NewRecorder()
+		req, _ = http.NewRequest("GET", "/node/test-node", nil)
+		engine.ServeHTTP(w, req)
+		assert.Equal(t, http.StatusOK, w.Result().StatusCode)
+		got = &NodeAssignInfoData{}
+		err = json.NewDecoder(w.Result().Body).Decode(got)
+		assert.NoError(t, err)
+		expectedResp = &NodeAssignInfoData{}
+		assert.Equal(t, expectedResp, got)
+	})
+}
diff --git a/pkg/slo-controller/noderesource/plugins/gpudeviceresource/plugin_test.go b/pkg/slo-controller/noderesource/plugins/gpudeviceresource/plugin_test.go
index 58992230..94a44e48 100644
--- a/pkg/slo-controller/noderesource/plugins/gpudeviceresource/plugin_test.go
+++ b/pkg/slo-controller/noderesource/plugins/gpudeviceresource/plugin_test.go
@@ -35,7 +35,9 @@ import (
 	"github.com/koordinator-sh/koordinator/apis/configuration"
 	"github.com/koordinator-sh/koordinator/apis/extension"
 	schedulingv1alpha1 "github.com/koordinator-sh/koordinator/apis/scheduling/v1alpha1"
+	"github.com/koordinator-sh/koordinator/pkg/features"
 	"github.com/koordinator-sh/koordinator/pkg/slo-controller/noderesource/framework"
+	utilfeature "github.com/koordinator-sh/koordinator/pkg/util/feature"
 	"github.com/koordinator-sh/koordinator/pkg/util/testutil"
 )
 
@@ -617,11 +619,12 @@ func TestPluginCalculate(t *testing.T) {
 		node *corev1.Node
 	}
 	tests := []struct {
-		name    string
-		fields  fields
-		args    args
-		want    []framework.ResourceItem
-		wantErr bool
+		name               string
+		fields             fields
+		syncSharedResource bool
+		args               args
+		want               []framework.ResourceItem
+		wantErr            bool
 	}{
 		{
 			name: "args missing essential fields",
@@ -650,6 +653,7 @@ func TestPluginCalculate(t *testing.T) {
 			fields: fields{
 				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, testDevice).Build(),
 			},
+			syncSharedResource: true,
 			args: args{
 				node: testNode,
 			},
@@ -695,6 +699,7 @@ func TestPluginCalculate(t *testing.T) {
 			fields: fields{
 				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, testDevice).Build(),
 			},
+			syncSharedResource: true,
 			args: args{
 				node: testNode,
 			},
@@ -740,6 +745,7 @@ func TestPluginCalculate(t *testing.T) {
 			fields: fields{
 				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, deviceMissingLabels).Build(),
 			},
+			syncSharedResource: true,
 			args: args{
 				node: testNode,
 			},
@@ -777,6 +783,7 @@ func TestPluginCalculate(t *testing.T) {
 			fields: fields{
 				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, deviceMissingGPURelatedLabels).Build(),
 			},
+			syncSharedResource: true,
 			args: args{
 				node: testNode,
 			},
@@ -809,6 +816,150 @@ func TestPluginCalculate(t *testing.T) {
 			},
 			wantErr: false,
 		},
+		{
+			name: "calculate device resources correctly",
+			fields: fields{
+				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, testDevice).Build(),
+			},
+			args: args{
+				node: testNode,
+			},
+			want: []framework.ResourceItem{
+				{
+					Name:     extension.ResourceGPU,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUCore,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemory,
+					Quantity: resource.NewScaledQuantity(18, 3),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemoryRatio,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name: PluginName,
+					Labels: map[string]string{
+						extension.LabelGPUModel:         "A100",
+						extension.LabelGPUDriverVersion: "480",
+					},
+					Message: UpdateLabelsMsg,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "calculate device resources correctly",
+			fields: fields{
+				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, testDevice).Build(),
+			},
+			args: args{
+				node: testNode,
+			},
+			want: []framework.ResourceItem{
+				{
+					Name:     extension.ResourceGPU,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUCore,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemory,
+					Quantity: resource.NewScaledQuantity(18, 3),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemoryRatio,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name: PluginName,
+					Labels: map[string]string{
+						extension.LabelGPUModel:         "A100",
+						extension.LabelGPUDriverVersion: "480",
+					},
+					Message: UpdateLabelsMsg,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "calculate device resources correctly",
+			fields: fields{
+				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, deviceMissingLabels).Build(),
+			},
+			args: args{
+				node: testNode,
+			},
+			want: []framework.ResourceItem{
+				{
+					Name:     extension.ResourceGPU,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUCore,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemory,
+					Quantity: resource.NewScaledQuantity(18, 3),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemoryRatio,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+			},
+			wantErr: false,
+		},
+		{
+			name: "calculate device resources correctly",
+			fields: fields{
+				client: fake.NewClientBuilder().WithScheme(testScheme).WithObjects(testNode, deviceMissingGPURelatedLabels).Build(),
+			},
+			args: args{
+				node: testNode,
+			},
+			want: []framework.ResourceItem{
+				{
+					Name:     extension.ResourceGPU,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUCore,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemory,
+					Quantity: resource.NewScaledQuantity(18, 3),
+					Message:  UpdateResourcesMsg,
+				},
+				{
+					Name:     extension.ResourceGPUMemoryRatio,
+					Quantity: resource.NewQuantity(200, resource.DecimalSI),
+					Message:  UpdateResourcesMsg,
+				},
+			},
+			wantErr: false,
+		},
 		{
 			name: "calculate resetting device resources",
 			fields: fields{
@@ -886,6 +1037,7 @@ func TestPluginCalculate(t *testing.T) {
 	}
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			defer utilfeature.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EnableSyncGPUSharedResource, tt.syncSharedResource)()
 			p := &Plugin{}
 			client = tt.fields.client
 			defer testPluginCleanup()
@@ -897,6 +1049,7 @@ func TestPluginCalculate(t *testing.T) {
 }
 
 func Test_cleanupGPUNodeResource(t *testing.T) {
+
 	testScheme := runtime.NewScheme()
 	err := clientgoscheme.AddToScheme(testScheme)
 	assert.NoError(t, err)
@@ -1016,6 +1169,7 @@ func Test_cleanupGPUNodeResource(t *testing.T) {
 		},
 	}
 	t.Run("updateGPUDriverAndModel success", func(t *testing.T) {
+		defer utilfeature.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EnableSyncGPUSharedResource, true)()
 		p := &Plugin{}
 		client = fake.NewClientBuilder().WithScheme(testScheme).WithRuntimeObjects(testDevice).Build()
 		defer testPluginCleanup()
diff --git a/pkg/webhook/pod/validating/verify_device_resource_test.go b/pkg/webhook/pod/validating/verify_device_resource_test.go
index 6559ace2..670c8b49 100644
--- a/pkg/webhook/pod/validating/verify_device_resource_test.go
+++ b/pkg/webhook/pod/validating/verify_device_resource_test.go
@@ -30,7 +30,9 @@ import (
 
 	configv1alpha1 "github.com/koordinator-sh/koordinator/apis/config/v1alpha1"
 	"github.com/koordinator-sh/koordinator/apis/extension"
+	"github.com/koordinator-sh/koordinator/pkg/features"
 	"github.com/koordinator-sh/koordinator/pkg/util"
+	utilfeature "github.com/koordinator-sh/koordinator/pkg/util/feature"
 )
 
 func init() {
@@ -39,13 +41,14 @@ func init() {
 
 func TestDeviceResourceValidatingPod(t *testing.T) {
 	tests := []struct {
-		name        string
-		operation   admissionv1.Operation
-		oldPod      *corev1.Pod
-		newPod      *corev1.Pod
-		wantAllowed bool
-		wantReason  string
-		wantErr     bool
+		name                          string
+		disableValidateDeviceResource bool
+		operation                     admissionv1.Operation
+		oldPod                        *corev1.Pod
+		newPod                        *corev1.Pod
+		wantAllowed                   bool
+		wantReason                    string
+		wantErr                       bool
 	}{
 		{
 			name:      "validate gpu resource is percentage",
@@ -153,6 +156,33 @@ func TestDeviceResourceValidatingPod(t *testing.T) {
 			wantAllowed: false,
 			wantReason:  "pod.spec.containers[*].resources.requests: Forbidden: GPU memory and GPU memory ratio all is zero",
 		},
+		{
+			name:                          "validate declain none gpu memory and memoryRatio",
+			disableValidateDeviceResource: true,
+			operation:                     admissionv1.Create,
+			newPod: &corev1.Pod{
+				Spec: corev1.PodSpec{
+					Containers: []corev1.Container{
+						{
+							Name: "test-container-a",
+							Resources: corev1.ResourceRequirements{
+								Limits: corev1.ResourceList{
+									extension.ResourceGPUShared: *resource.NewQuantity(2, resource.DecimalSI),
+								},
+								Requests: corev1.ResourceList{
+									extension.ResourceGPUShared: *resource.NewQuantity(2, resource.DecimalSI),
+								},
+							},
+						},
+					},
+					SchedulerName:     "koordinator-scheduler",
+					PriorityClassName: "koordinator-batch",
+				},
+			},
+			wantErr:     false,
+			wantAllowed: true,
+			wantReason:  "",
+		},
 		{
 			name:      "validate gpu gpuCore greater than 100 multiple of shared",
 			operation: admissionv1.Create,
@@ -215,6 +245,7 @@ func TestDeviceResourceValidatingPod(t *testing.T) {
 
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
+			defer utilfeature.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.ValidatePodDeviceResource, !tt.disableValidateDeviceResource)()
 			client := fake.NewClientBuilder().Build()
 			decoder := admission.NewDecoder(scheme.Scheme)
 			h := &PodValidatingHandler{