{"id":204,"date":"2018-05-25T09:44:55","date_gmt":"2018-05-25T09:44:55","guid":{"rendered":"http:\/\/www.luo666.com\/?p=204"},"modified":"2019-01-19T04:41:55","modified_gmt":"2019-01-19T04:41:55","slug":"sriov-vf-get-iommu-group-kernel-code-trace","status":"publish","type":"post","link":"http:\/\/www.luo666.com\/?p=204","title":{"rendered":"sriov vf get iommu group kernel code trace"},"content":{"rendered":"<div>VF device driver call:<\/div>\n<div>pci_enable_sriov -&gt; sriov_enable -&gt;\u00a0pci_iov_add_virtfn -&gt;\u00a0pci_device_add -&gt;\u00a0device_add -&gt;<\/div>\n<div>\n<pre class=\"lang:c decode:true\">\u00a0\u00a0 \u00a0blocking_notifier_call_chain(&amp;dev-&gt;bus-&gt;p-&gt;bus_notifier,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0BUS_NOTIFY_ADD_DEVICE, dev);<\/pre>\n<\/div>\n<div>pci bus register a iommu notifier will be called when device_add start to notify:<\/div>\n<div>\n<pre class=\"lang:c decode:true \">static int __init pci_iommu_init(void)\n{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (iommu_detected)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0intel_iommu_init();\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return 0;\n}\n\n\/* Must execute after PCI subsystem *\/\nfs_initcall(pci_iommu_init);<\/pre>\n<p>intel_iommu_init -&gt; iommu_bus_init -&gt; &#8220;nb-&gt;notifier_call = iommu_bus_notifier;&#8221;<\/p>\n<\/div>\n<div>\n<pre class=\"lang:c decode:true\">\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (action == BUS_NOTIFY_ADD_DEVICE) {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (ops-&gt;add_device)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return ops-&gt;add_device(dev);<\/pre>\n<\/div>\n<div>ops-&gt;add_device:<\/div>\n<div>\n<pre class=\"lang:c decode:true \">static struct iommu_ops intel_iommu_ops = {\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.capable\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= intel_iommu_capable,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.domain_alloc\u00a0\u00a0\u00a0= intel_iommu_domain_alloc,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.domain_free\u00a0\u00a0\u00a0\u00a0= intel_iommu_domain_free,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.attach_dev\u00a0\u00a0\u00a0\u00a0\u00a0= intel_iommu_attach_device,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.detach_dev\u00a0\u00a0\u00a0\u00a0\u00a0= intel_iommu_detach_device,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= intel_iommu_map,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.unmap\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= intel_iommu_unmap,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.map_sg\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0= default_iommu_map_sg,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.iova_to_phys\u00a0\u00a0\u00a0= intel_iommu_iova_to_phys,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.add_device\u00a0\u00a0\u00a0\u00a0\u00a0=intel_iommu_add_device,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.remove_device\u00a0\u00a0= intel_iommu_remove_device,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0.pgsize_bitmap\u00a0\u00a0= INTEL_IOMMU_PGSIZES,\n};<\/pre>\n<p>intel_iommu_add_device:<\/p>\n<\/div>\n<div>\n<pre class=\"lang:c decode:true \">static int intel_iommu_add_device(struct device *dev)\n{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0struct intel_iommu *iommu;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0struct iommu_group *group;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0u8 bus, devfn;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iommu = device_to_iommu(dev, &amp;bus, &amp;devfn);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (!iommu)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return -ENODEV;\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iommu_device_link(iommu-&gt;iommu_dev, dev);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0group = iommu_group_get_for_dev(dev);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (IS_ERR(group))\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return PTR_ERR(group);\n\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0iommu_group_put(group);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return 0;\n}<\/pre>\n<\/div>\n<div>iommu_group_get_for_dev:<\/div>\n<div><b>this will find or create an iommu group for the VF device<\/b><\/div>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n<p><audio style=\"display: none;\" controls=\"controls\"><\/audio><\/p>\n","protected":false},"excerpt":{"rendered":"<p>VF device driver call: pci_enable_sriov -&gt; sriov_enable -&gt;\u00a0pci_iov_add_virtfn -&gt;\u00a0pci_device_add -&gt;\u00a0device_add -&gt; \u00a0\u00a0 \u00a0blocking_notifier_call_chain(&amp;dev-&gt;bus-&gt;p-&gt;bus_notifier, \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0BUS_NOTIFY_ADD_DEVICE, dev); pci bus register a iommu notifier will be called when device_add start to notify: static int __init pci_iommu_init(void) { \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (iommu_detected) \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0intel_iommu_init(); \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return 0; } \/* Must execute after PCI subsystem *\/ fs_initcall(pci_iommu_init); intel_iommu_init -&gt; iommu_bus_init -&gt; &#8220;nb-&gt;notifier_call = iommu_bus_notifier;&#8221; &hellip; <a href=\"http:\/\/www.luo666.com\/?p=204\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;sriov vf get iommu group kernel code trace&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"footnotes":"","_jetpack_memberships_contains_paid_content":false,"jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","enabled":false}}},"categories":[3],"tags":[],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p7Dhki-3i","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/www.luo666.com\/index.php?rest_route=\/wp\/v2\/posts\/204"}],"collection":[{"href":"http:\/\/www.luo666.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.luo666.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.luo666.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.luo666.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=204"}],"version-history":[{"count":3,"href":"http:\/\/www.luo666.com\/index.php?rest_route=\/wp\/v2\/posts\/204\/revisions"}],"predecessor-version":[{"id":272,"href":"http:\/\/www.luo666.com\/index.php?rest_route=\/wp\/v2\/posts\/204\/revisions\/272"}],"wp:attachment":[{"href":"http:\/\/www.luo666.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=204"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.luo666.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=204"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.luo666.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=204"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}