aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChangbin Du <changbin.du@intel.com>2018-01-30 06:19:52 -0500
committerZhenyu Wang <zhenyuw@linux.intel.com>2018-03-06 00:19:20 -0500
commit0947572849cb3ca7028d9daa3958158639ae4d69 (patch)
tree768b85fc4b58cec002b4e2af19ec904bf7e8fe80
parentf66e5ff706038d03e8ef6d012e3aec7824442418 (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.c54
-rw-r--r--drivers/gpu/drm/i915/gvt/mpt.h34
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)
1234static int ppgtt_set_guest_page_oos(struct intel_vgpu_ppgtt_spt *spt) 1236static 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 */
164static inline int intel_gvt_hypervisor_enable_page_track( 164static 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 */
189static inline int intel_gvt_hypervisor_disable_page_track( 178static 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/**