diff options
author | Changbin Du <changbin.du@intel.com> | 2018-01-30 06:19:52 -0500 |
---|---|---|
committer | Zhenyu Wang <zhenyuw@linux.intel.com> | 2018-03-06 00:19:20 -0500 |
commit | 0947572849cb3ca7028d9daa3958158639ae4d69 (patch) | |
tree | 768b85fc4b58cec002b4e2af19ec904bf7e8fe80 | |
parent | f66e5ff706038d03e8ef6d012e3aec7824442418 (diff) |
drm/i915/gvt: Don't extend page_track to mpt layer
Don't extend page_track to mpt layer. Keep MPT simple and clean.
Meanwhile remove gtt.n_tracked_guest_page which doesn't make much
sense.
v2: clean up gtt.n_tracked_guest_page.
Signed-off-by: Changbin Du <changbin.du@intel.com>
Signed-off-by: Zhenyu Wang <zhenyuw@linux.intel.com>
-rw-r--r-- | drivers/gpu/drm/i915/gvt/gtt.c | 54 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/gvt/mpt.h | 34 |
2 files changed, 36 insertions, 52 deletions
diff --git a/drivers/gpu/drm/i915/gvt/gtt.c b/drivers/gpu/drm/i915/gvt/gtt.c index 11177d71434e..b79321f5c9fb 100644 --- a/drivers/gpu/drm/i915/gvt/gtt.c +++ b/drivers/gpu/drm/i915/gvt/gtt.c | |||
@@ -678,7 +678,7 @@ static void ppgtt_free_spt(struct intel_vgpu_ppgtt_spt *spt) | |||
678 | 678 | ||
679 | if (spt->guest_page.track.tracked) | 679 | if (spt->guest_page.track.tracked) |
680 | intel_gvt_hypervisor_disable_page_track(spt->vgpu, | 680 | intel_gvt_hypervisor_disable_page_track(spt->vgpu, |
681 | &spt->guest_page.track); | 681 | spt->guest_page.track.gfn); |
682 | 682 | ||
683 | list_del_init(&spt->post_shadow_list); | 683 | list_del_init(&spt->post_shadow_list); |
684 | free_spt(spt); | 684 | free_spt(spt); |
@@ -926,10 +926,11 @@ static struct intel_vgpu_ppgtt_spt *ppgtt_populate_spt_by_guest_entry( | |||
926 | goto fail; | 926 | goto fail; |
927 | } | 927 | } |
928 | 928 | ||
929 | ret = intel_gvt_hypervisor_enable_page_track(vgpu, &spt->guest_page.track); | 929 | ret = intel_gvt_hypervisor_enable_page_track(vgpu, spt->guest_page.track.gfn); |
930 | if (ret) | 930 | if (ret) |
931 | goto fail; | 931 | goto fail; |
932 | 932 | ||
933 | spt->guest_page.track.tracked = true; | ||
933 | ret = ppgtt_populate_spt(spt); | 934 | ret = ppgtt_populate_spt(spt); |
934 | if (ret) | 935 | if (ret) |
935 | goto fail; | 936 | goto fail; |
@@ -1196,9 +1197,10 @@ static int ppgtt_set_guest_page_sync(struct intel_vgpu_ppgtt_spt *spt) | |||
1196 | struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page; | 1197 | struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page; |
1197 | int ret; | 1198 | int ret; |
1198 | 1199 | ||
1199 | ret = intel_gvt_hypervisor_enable_page_track(spt->vgpu, &spt->guest_page.track); | 1200 | ret = intel_gvt_hypervisor_enable_page_track(spt->vgpu, spt->guest_page.track.gfn); |
1200 | if (ret) | 1201 | if (ret) |
1201 | return ret; | 1202 | return ret; |
1203 | spt->guest_page.track.tracked = true; | ||
1202 | 1204 | ||
1203 | trace_oos_change(spt->vgpu->id, "set page sync", oos_page->id, | 1205 | trace_oos_change(spt->vgpu->id, "set page sync", oos_page->id, |
1204 | spt, spt->guest_page.type); | 1206 | spt, spt->guest_page.type); |
@@ -1234,6 +1236,7 @@ static int ppgtt_allocate_oos_page(struct intel_vgpu_ppgtt_spt *spt) | |||
1234 | static int ppgtt_set_guest_page_oos(struct intel_vgpu_ppgtt_spt *spt) | 1236 | static int ppgtt_set_guest_page_oos(struct intel_vgpu_ppgtt_spt *spt) |
1235 | { | 1237 | { |
1236 | struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page; | 1238 | struct intel_vgpu_oos_page *oos_page = spt->guest_page.oos_page; |
1239 | int ret; | ||
1237 | 1240 | ||
1238 | if (WARN(!oos_page, "shadow PPGTT page should have a oos page\n")) | 1241 | if (WARN(!oos_page, "shadow PPGTT page should have a oos page\n")) |
1239 | return -EINVAL; | 1242 | return -EINVAL; |
@@ -1242,7 +1245,11 @@ static int ppgtt_set_guest_page_oos(struct intel_vgpu_ppgtt_spt *spt) | |||
1242 | spt, spt->guest_page.type); | 1245 | spt, spt->guest_page.type); |
1243 | 1246 | ||
1244 | list_add_tail(&oos_page->vm_list, &spt->vgpu->gtt.oos_page_list_head); | 1247 | list_add_tail(&oos_page->vm_list, &spt->vgpu->gtt.oos_page_list_head); |
1245 | return intel_gvt_hypervisor_disable_page_track(spt->vgpu, &spt->guest_page.track); | 1248 | ret = intel_gvt_hypervisor_disable_page_track(spt->vgpu, spt->guest_page.track.gfn); |
1249 | if (ret) | ||
1250 | return ret; | ||
1251 | spt->guest_page.track.tracked = false; | ||
1252 | return 0; | ||
1246 | } | 1253 | } |
1247 | 1254 | ||
1248 | /** | 1255 | /** |
@@ -1917,29 +1924,28 @@ int intel_vgpu_write_protect_handler(struct intel_vgpu *vgpu, u64 pa, | |||
1917 | struct intel_gvt *gvt = vgpu->gvt; | 1924 | struct intel_gvt *gvt = vgpu->gvt; |
1918 | int ret = 0; | 1925 | int ret = 0; |
1919 | 1926 | ||
1920 | if (atomic_read(&vgpu->gtt.n_tracked_guest_page)) { | 1927 | struct intel_vgpu_page_track *t; |
1921 | struct intel_vgpu_page_track *t; | 1928 | |
1922 | 1929 | mutex_lock(&gvt->lock); | |
1923 | mutex_lock(&gvt->lock); | 1930 | |
1924 | 1931 | t = intel_vgpu_find_tracked_page(vgpu, pa >> PAGE_SHIFT); | |
1925 | t = intel_vgpu_find_tracked_page(vgpu, pa >> PAGE_SHIFT); | 1932 | if (t) { |
1926 | if (t) { | 1933 | if (unlikely(vgpu->failsafe)) { |
1927 | if (unlikely(vgpu->failsafe)) { | 1934 | /* remove write protection to prevent furture traps */ |
1928 | /* remove write protection to prevent furture traps */ | 1935 | intel_gvt_hypervisor_disable_page_track(vgpu, t->gfn); |
1929 | intel_gvt_hypervisor_disable_page_track(vgpu, t); | 1936 | } else { |
1930 | } else { | 1937 | ret = t->handler(t, pa, p_data, bytes); |
1931 | ret = t->handler(t, pa, p_data, bytes); | 1938 | if (ret) { |
1932 | if (ret) { | 1939 | gvt_err("guest page write error %d, " |
1933 | gvt_err("guest page write error %d, " | 1940 | "gfn 0x%lx, pa 0x%llx, " |
1934 | "gfn 0x%lx, pa 0x%llx, " | 1941 | "var 0x%x, len %d\n", |
1935 | "var 0x%x, len %d\n", | 1942 | ret, t->gfn, pa, |
1936 | ret, t->gfn, pa, | 1943 | *(u32 *)p_data, bytes); |
1937 | *(u32 *)p_data, bytes); | ||
1938 | } | ||
1939 | } | 1944 | } |
1940 | } | 1945 | } |
1941 | mutex_unlock(&gvt->lock); | ||
1942 | } | 1946 | } |
1947 | mutex_unlock(&gvt->lock); | ||
1948 | |||
1943 | return ret; | 1949 | return ret; |
1944 | } | 1950 | } |
1945 | 1951 | ||
diff --git a/drivers/gpu/drm/i915/gvt/mpt.h b/drivers/gpu/drm/i915/gvt/mpt.h index 90fd83f98733..78fada9e3241 100644 --- a/drivers/gpu/drm/i915/gvt/mpt.h +++ b/drivers/gpu/drm/i915/gvt/mpt.h | |||
@@ -156,51 +156,29 @@ static inline unsigned long intel_gvt_hypervisor_virt_to_mfn(void *p) | |||
156 | /** | 156 | /** |
157 | * intel_gvt_hypervisor_enable_page_track - track a guest page | 157 | * intel_gvt_hypervisor_enable_page_track - track a guest page |
158 | * @vgpu: a vGPU | 158 | * @vgpu: a vGPU |
159 | * @t: page track data structure | 159 | * @gfn: the gfn of guest |
160 | * | 160 | * |
161 | * Returns: | 161 | * Returns: |
162 | * Zero on success, negative error code if failed. | 162 | * Zero on success, negative error code if failed. |
163 | */ | 163 | */ |
164 | static inline int intel_gvt_hypervisor_enable_page_track( | 164 | static inline int intel_gvt_hypervisor_enable_page_track( |
165 | struct intel_vgpu *vgpu, | 165 | struct intel_vgpu *vgpu, unsigned long gfn) |
166 | struct intel_vgpu_page_track *t) | ||
167 | { | 166 | { |
168 | int ret; | 167 | return intel_gvt_host.mpt->enable_page_track(vgpu->handle, gfn); |
169 | |||
170 | if (t->tracked) | ||
171 | return 0; | ||
172 | |||
173 | ret = intel_gvt_host.mpt->enable_page_track(vgpu->handle, t->gfn); | ||
174 | if (ret) | ||
175 | return ret; | ||
176 | t->tracked = true; | ||
177 | atomic_inc(&vgpu->gtt.n_tracked_guest_page); | ||
178 | return 0; | ||
179 | } | 168 | } |
180 | 169 | ||
181 | /** | 170 | /** |
182 | * intel_gvt_hypervisor_disable_page_track - untrack a guest page | 171 | * intel_gvt_hypervisor_disable_page_track - untrack a guest page |
183 | * @vgpu: a vGPU | 172 | * @vgpu: a vGPU |
184 | * @t: page track data structure | 173 | * @gfn: the gfn of guest |
185 | * | 174 | * |
186 | * Returns: | 175 | * Returns: |
187 | * Zero on success, negative error code if failed. | 176 | * Zero on success, negative error code if failed. |
188 | */ | 177 | */ |
189 | static inline int intel_gvt_hypervisor_disable_page_track( | 178 | static inline int intel_gvt_hypervisor_disable_page_track( |
190 | struct intel_vgpu *vgpu, | 179 | struct intel_vgpu *vgpu, unsigned long gfn) |
191 | struct intel_vgpu_page_track *t) | ||
192 | { | 180 | { |
193 | int ret; | 181 | return intel_gvt_host.mpt->disable_page_track(vgpu->handle, gfn); |
194 | |||
195 | if (!t->tracked) | ||
196 | return 0; | ||
197 | |||
198 | ret = intel_gvt_host.mpt->disable_page_track(vgpu->handle, t->gfn); | ||
199 | if (ret) | ||
200 | return ret; | ||
201 | t->tracked = false; | ||
202 | atomic_dec(&vgpu->gtt.n_tracked_guest_page); | ||
203 | return 0; | ||
204 | } | 182 | } |
205 | 183 | ||
206 | /** | 184 | /** |