Skip to content

Commit 85d712f

Browse files
committed
Merge tag 'drm-intel-gt-next-2023-05-24' of git://anongit.freedesktop.org/drm/drm-intel into drm-next
UAPI Changes: - New getparam for querying PXP support and load status Cross-subsystem Changes: - GSC/MEI proxy driver Driver Changes: Fixes/improvements/new stuff: - Avoid clearing pre-allocated framebuffers with the TTM backend (Nirmoy Das) - Implement framebuffer mmap support (Nirmoy Das) - Disable sampler indirect state in bindless heap (Lionel Landwerlin) - Avoid out-of-bounds access when loading HuC (Lucas De Marchi) - Actually return an error if GuC version range check fails (John Harrison) - Get mutex and rpm ref just once in hwm_power_max_write (Ashutosh Dixit) - Disable PL1 power limit when loading GuC firmware (Ashutosh Dixit) - Block in hwmon while waiting for GuC reset to complete (Ashutosh Dixit) - Provide sysfs for SLPC efficient freq (Vinay Belgaumkar) - Add support for total context runtime for GuC back-end (Umesh Nerlige Ramappa) - Enable fdinfo for GuC backends (Umesh Nerlige Ramappa) - Don't capture Gen8 regs on Xe devices (John Harrison) - Fix error capture for virtual engines (John Harrison) - Track patch level versions on reduced version firmware files (John Harrison) - Decode another GuC load failure case (John Harrison) - GuC loading and firmware table handling fixes (John Harrison) - Fix confused register capture list creation (John Harrison) - Dump error capture to kernel log (John Harrison) - Dump error capture to dmesg on CTB error (John Harrison) - Disable rps_boost debugfs when SLPC is used (Vinay Belgaumkar) Future platform enablement: - Disable stolen memory backed FB for A0 [mtl] (Nirmoy Das) - Various refactors for multi-tile enablement (Andi Shyti, Tejas Upadhyay) - Extend Wa_22011802037 to MTL A-step (Madhumitha Tolakanahalli Pradeep) - WA to clear RDOP clock gating [mtl] (Haridhar Kalvala) - Set has_llc=0 [mtl] (Fei Yang) - Define MOCS and PAT tables for MTL (Madhumitha Tolakanahalli Pradeep) - Add PTE encode function [mtl] (Fei Yang) - fix mocs selftest [mtl] (Fei Yang) - Workaround coherency issue for Media [mtl] (Fei Yang) - Add workaround 14018778641 [mtl] (Tejas Upadhyay) - Implement Wa_14019141245 [mtl] (Radhakrishna Sripada) - Fix the wa number for Wa_22016670082 [mtl] (Radhakrishna Sripada) - Use correct huge page manager for MTL (Jonathan Cavitt) - GSC/MEI support for Meteorlake (Alexander Usyskin, Daniele Ceraolo Spurio) - Define GuC firmware version for MTL (John Harrison) - Drop FLAT CCS check [mtl] (Pallavi Mishra) - Add MTL for remapping CCS FBs [mtl] (Clint Taylor) - Meteorlake PXP enablement (Alan Previn) - Do not enable render power-gating on MTL (Andrzej Hajda) - Add MTL performance tuning changes (Radhakrishna Sripada) - Extend Wa_16014892111 to MTL A-step (Radhakrishna Sripada) - PMU multi-tile support (Tvrtko Ursulin) - End support for set caching ioctl [mtl] (Fei Yang) Driver refactors: - Use i915 instead of dev_priv insied the file_priv structure (Andi Shyti) - Use proper parameter naming in for_each_engine() (Andi Shyti) - Use gt_err for GT info (Tejas Upadhyay) - Consolidate duplicated capture list code (John Harrison) - Capture list naming clean up (John Harrison) - Use kernel-doc -Werror when CONFIG_DRM_I915_WERROR=y (Jani Nikula) - Preparation for using PAT index (Fei Yang) - Use pat_index instead of cache_level (Fei Yang) Miscellaneous: - Fix memory leaks in i915 selftests (Cong Liu) - Record GT error for gt failure (Tejas Upadhyay) - Migrate platform-dependent mock hugepage selftests to live (Jonathan Cavitt) - Update the SLPC selftest (Vinay Belgaumkar) - Throw out set() wrapper (Jani Nikula) - Large driver kernel doc cleanup (Jani Nikula) - Fix probe injection CI failures after recent change (John Harrison) - Make unexpected firmware versions an error in debug builds (John Harrison) - Silence UBSAN uninitialized bool variable warning (Ashutosh Dixit) - Fix memory leaks in function live_nop_switch (Cong Liu) Merges: - Merge drm/drm-next into drm-intel-gt-next (Joonas Lahtinen) Signed-off-by: Dave Airlie <[email protected]> # Conflicts: # drivers/gpu/drm/i915/gt/uc/intel_guc_capture.c From: Tvrtko Ursulin <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/ZG5SxCWRSkZhTDtY@tursulin-desk
2 parents b8887e7 + 0fbcf57 commit 85d712f

File tree

131 files changed

+4258
-1200
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

131 files changed

+4258
-1200
lines changed

drivers/gpu/drm/i915/Makefile

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ i915-y += \
194194
# general-purpose microcontroller (GuC) support
195195
i915-y += \
196196
gt/uc/intel_gsc_fw.o \
197+
gt/uc/intel_gsc_proxy.o \
197198
gt/uc/intel_gsc_uc.o \
198199
gt/uc/intel_gsc_uc_heci_cmd_submit.o\
199200
gt/uc/intel_guc.o \
@@ -338,6 +339,7 @@ i915-y += \
338339
i915-$(CONFIG_DRM_I915_PXP) += \
339340
pxp/intel_pxp_cmd.o \
340341
pxp/intel_pxp_debugfs.o \
342+
pxp/intel_pxp_gsccs.o \
341343
pxp/intel_pxp_irq.o \
342344
pxp/intel_pxp_pm.o \
343345
pxp/intel_pxp_session.o
@@ -373,7 +375,7 @@ obj-$(CONFIG_DRM_I915_GVT_KVMGT) += kvmgt.o
373375
#
374376
# Enable locally for CONFIG_DRM_I915_WERROR=y. See also scripts/Makefile.build
375377
ifdef CONFIG_DRM_I915_WERROR
376-
cmd_checkdoc = $(srctree)/scripts/kernel-doc -none $<
378+
cmd_checkdoc = $(srctree)/scripts/kernel-doc -none -Werror $<
377379
endif
378380

379381
# header test
@@ -388,7 +390,7 @@ always-$(CONFIG_DRM_I915_WERROR) += \
388390

389391
quiet_cmd_hdrtest = HDRTEST $(patsubst %.hdrtest,%.h,$@)
390392
cmd_hdrtest = $(CC) $(filter-out $(CFLAGS_GCOV), $(c_flags)) -S -o /dev/null -x c /dev/null -include $<; \
391-
$(srctree)/scripts/kernel-doc -none $<; touch $@
393+
$(srctree)/scripts/kernel-doc -none -Werror $<; touch $@
392394

393395
$(obj)/%.hdrtest: $(src)/%.h FORCE
394396
$(call if_changed_dep,hdrtest)

drivers/gpu/drm/i915/display/intel_dpt.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,24 @@ static void gen8_set_pte(void __iomem *addr, gen8_pte_t pte)
4343
static void dpt_insert_page(struct i915_address_space *vm,
4444
dma_addr_t addr,
4545
u64 offset,
46-
enum i915_cache_level level,
46+
unsigned int pat_index,
4747
u32 flags)
4848
{
4949
struct i915_dpt *dpt = i915_vm_to_dpt(vm);
5050
gen8_pte_t __iomem *base = dpt->iomem;
5151

5252
gen8_set_pte(base + offset / I915_GTT_PAGE_SIZE,
53-
vm->pte_encode(addr, level, flags));
53+
vm->pte_encode(addr, pat_index, flags));
5454
}
5555

5656
static void dpt_insert_entries(struct i915_address_space *vm,
5757
struct i915_vma_resource *vma_res,
58-
enum i915_cache_level level,
58+
unsigned int pat_index,
5959
u32 flags)
6060
{
6161
struct i915_dpt *dpt = i915_vm_to_dpt(vm);
6262
gen8_pte_t __iomem *base = dpt->iomem;
63-
const gen8_pte_t pte_encode = vm->pte_encode(0, level, flags);
63+
const gen8_pte_t pte_encode = vm->pte_encode(0, pat_index, flags);
6464
struct sgt_iter sgt_iter;
6565
dma_addr_t addr;
6666
int i;
@@ -83,7 +83,7 @@ static void dpt_clear_range(struct i915_address_space *vm,
8383
static void dpt_bind_vma(struct i915_address_space *vm,
8484
struct i915_vm_pt_stash *stash,
8585
struct i915_vma_resource *vma_res,
86-
enum i915_cache_level cache_level,
86+
unsigned int pat_index,
8787
u32 flags)
8888
{
8989
u32 pte_flags;
@@ -98,7 +98,7 @@ static void dpt_bind_vma(struct i915_address_space *vm,
9898
if (vma_res->bi.lmem)
9999
pte_flags |= PTE_LM;
100100

101-
vm->insert_entries(vm, vma_res, cache_level, pte_flags);
101+
vm->insert_entries(vm, vma_res, pat_index, pte_flags);
102102

103103
vma_res->page_sizes_gtt = I915_GTT_PAGE_SIZE;
104104

@@ -300,7 +300,7 @@ intel_dpt_create(struct intel_framebuffer *fb)
300300
vm->vma_ops.bind_vma = dpt_bind_vma;
301301
vm->vma_ops.unbind_vma = dpt_unbind_vma;
302302

303-
vm->pte_encode = gen8_ggtt_pte_encode;
303+
vm->pte_encode = vm->gt->ggtt->vm.pte_encode;
304304

305305
dpt->obj = dpt_obj;
306306
dpt->obj->is_dpt = true;

drivers/gpu/drm/i915/display/intel_fb.c

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,8 @@ bool intel_fb_needs_pot_stride_remap(const struct intel_framebuffer *fb)
11901190
{
11911191
struct drm_i915_private *i915 = to_i915(fb->base.dev);
11921192

1193-
return IS_ALDERLAKE_P(i915) && intel_fb_uses_dpt(&fb->base);
1193+
return (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14) &&
1194+
intel_fb_uses_dpt(&fb->base);
11941195
}
11951196

11961197
static int intel_fb_pitch(const struct intel_framebuffer *fb, int color_plane, unsigned int rotation)
@@ -1326,9 +1327,10 @@ plane_view_scanout_stride(const struct intel_framebuffer *fb, int color_plane,
13261327
unsigned int tile_width,
13271328
unsigned int src_stride_tiles, unsigned int dst_stride_tiles)
13281329
{
1330+
struct drm_i915_private *i915 = to_i915(fb->base.dev);
13291331
unsigned int stride_tiles;
13301332

1331-
if (IS_ALDERLAKE_P(to_i915(fb->base.dev)))
1333+
if (IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14)
13321334
stride_tiles = src_stride_tiles;
13331335
else
13341336
stride_tiles = dst_stride_tiles;
@@ -1522,7 +1524,8 @@ static void intel_fb_view_init(struct drm_i915_private *i915, struct intel_fb_vi
15221524
memset(view, 0, sizeof(*view));
15231525
view->gtt.type = view_type;
15241526

1525-
if (view_type == I915_GTT_VIEW_REMAPPED && IS_ALDERLAKE_P(i915))
1527+
if (view_type == I915_GTT_VIEW_REMAPPED &&
1528+
(IS_ALDERLAKE_P(i915) || DISPLAY_VER(i915) >= 14))
15261529
view->gtt.remapped.plane_alignment = SZ_2M / PAGE_SIZE;
15271530
}
15281531

drivers/gpu/drm/i915/display/intel_fbdev.c

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@
4040
#include <drm/drm_crtc.h>
4141
#include <drm/drm_fb_helper.h>
4242
#include <drm/drm_fourcc.h>
43+
#include <drm/drm_gem_framebuffer_helper.h>
4344

4445
#include "gem/i915_gem_lmem.h"
46+
#include "gem/i915_gem_mman.h"
4547

4648
#include "i915_drv.h"
4749
#include "intel_display_types.h"
@@ -67,6 +69,11 @@ struct intel_fbdev {
6769
struct mutex hpd_lock;
6870
};
6971

72+
static struct intel_fbdev *to_intel_fbdev(struct drm_fb_helper *fb_helper)
73+
{
74+
return container_of(fb_helper, struct intel_fbdev, helper);
75+
}
76+
7077
static struct intel_frontbuffer *to_frontbuffer(struct intel_fbdev *ifbdev)
7178
{
7279
return ifbdev->fb->frontbuffer;
@@ -79,9 +86,7 @@ static void intel_fbdev_invalidate(struct intel_fbdev *ifbdev)
7986

8087
static int intel_fbdev_set_par(struct fb_info *info)
8188
{
82-
struct drm_fb_helper *fb_helper = info->par;
83-
struct intel_fbdev *ifbdev =
84-
container_of(fb_helper, struct intel_fbdev, helper);
89+
struct intel_fbdev *ifbdev = to_intel_fbdev(info->par);
8590
int ret;
8691

8792
ret = drm_fb_helper_set_par(info);
@@ -93,9 +98,7 @@ static int intel_fbdev_set_par(struct fb_info *info)
9398

9499
static int intel_fbdev_blank(int blank, struct fb_info *info)
95100
{
96-
struct drm_fb_helper *fb_helper = info->par;
97-
struct intel_fbdev *ifbdev =
98-
container_of(fb_helper, struct intel_fbdev, helper);
101+
struct intel_fbdev *ifbdev = to_intel_fbdev(info->par);
99102
int ret;
100103

101104
ret = drm_fb_helper_blank(blank, info);
@@ -108,9 +111,7 @@ static int intel_fbdev_blank(int blank, struct fb_info *info)
108111
static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
109112
struct fb_info *info)
110113
{
111-
struct drm_fb_helper *fb_helper = info->par;
112-
struct intel_fbdev *ifbdev =
113-
container_of(fb_helper, struct intel_fbdev, helper);
114+
struct intel_fbdev *ifbdev = to_intel_fbdev(info->par);
114115
int ret;
115116

116117
ret = drm_fb_helper_pan_display(var, info);
@@ -120,6 +121,15 @@ static int intel_fbdev_pan_display(struct fb_var_screeninfo *var,
120121
return ret;
121122
}
122123

124+
static int intel_fbdev_mmap(struct fb_info *info, struct vm_area_struct *vma)
125+
{
126+
struct intel_fbdev *fbdev = to_intel_fbdev(info->par);
127+
struct drm_gem_object *bo = drm_gem_fb_get_obj(&fbdev->fb->base, 0);
128+
struct drm_i915_gem_object *obj = to_intel_bo(bo);
129+
130+
return i915_gem_fb_mmap(obj, vma);
131+
}
132+
123133
static const struct fb_ops intelfb_ops = {
124134
.owner = THIS_MODULE,
125135
DRM_FB_HELPER_DEFAULT_OPS,
@@ -131,13 +141,13 @@ static const struct fb_ops intelfb_ops = {
131141
.fb_imageblit = drm_fb_helper_cfb_imageblit,
132142
.fb_pan_display = intel_fbdev_pan_display,
133143
.fb_blank = intel_fbdev_blank,
144+
.fb_mmap = intel_fbdev_mmap,
134145
};
135146

136147
static int intelfb_alloc(struct drm_fb_helper *helper,
137148
struct drm_fb_helper_surface_size *sizes)
138149
{
139-
struct intel_fbdev *ifbdev =
140-
container_of(helper, struct intel_fbdev, helper);
150+
struct intel_fbdev *ifbdev = to_intel_fbdev(helper);
141151
struct drm_framebuffer *fb;
142152
struct drm_device *dev = helper->dev;
143153
struct drm_i915_private *dev_priv = to_i915(dev);
@@ -163,7 +173,8 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
163173
obj = ERR_PTR(-ENODEV);
164174
if (HAS_LMEM(dev_priv)) {
165175
obj = i915_gem_object_create_lmem(dev_priv, size,
166-
I915_BO_ALLOC_CONTIGUOUS);
176+
I915_BO_ALLOC_CONTIGUOUS |
177+
I915_BO_ALLOC_USER);
167178
} else {
168179
/*
169180
* If the FB is too big, just don't use it since fbdev is not very
@@ -193,8 +204,7 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
193204
static int intelfb_create(struct drm_fb_helper *helper,
194205
struct drm_fb_helper_surface_size *sizes)
195206
{
196-
struct intel_fbdev *ifbdev =
197-
container_of(helper, struct intel_fbdev, helper);
207+
struct intel_fbdev *ifbdev = to_intel_fbdev(helper);
198208
struct intel_framebuffer *intel_fb = ifbdev->fb;
199209
struct drm_device *dev = helper->dev;
200210
struct drm_i915_private *dev_priv = to_i915(dev);

drivers/gpu/drm/i915/display/intel_plane_initial.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,9 @@ initial_plane_vma(struct drm_i915_private *i915,
110110
size * 2 > i915->dsm.usable_size)
111111
return NULL;
112112

113-
obj = i915_gem_object_create_region_at(mem, phys_base, size, 0);
113+
obj = i915_gem_object_create_region_at(mem, phys_base, size,
114+
I915_BO_ALLOC_USER |
115+
I915_BO_PREALLOC);
114116
if (IS_ERR(obj))
115117
return NULL;
116118

drivers/gpu/drm/i915/gem/i915_gem_domain.c

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,15 @@ static bool gpu_write_needs_clflush(struct drm_i915_gem_object *obj)
2727
if (IS_DGFX(i915))
2828
return false;
2929

30-
return !(obj->cache_level == I915_CACHE_NONE ||
31-
obj->cache_level == I915_CACHE_WT);
30+
/*
31+
* For objects created by userspace through GEM_CREATE with pat_index
32+
* set by set_pat extension, i915_gem_object_has_cache_level() will
33+
* always return true, because the coherency of such object is managed
34+
* by userspace. Othereise the call here would fall back to checking
35+
* whether the object is un-cached or write-through.
36+
*/
37+
return !(i915_gem_object_has_cache_level(obj, I915_CACHE_NONE) ||
38+
i915_gem_object_has_cache_level(obj, I915_CACHE_WT));
3239
}
3340

3441
bool i915_gem_cpu_write_needs_clflush(struct drm_i915_gem_object *obj)
@@ -267,7 +274,13 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
267274
{
268275
int ret;
269276

270-
if (obj->cache_level == cache_level)
277+
/*
278+
* For objects created by userspace through GEM_CREATE with pat_index
279+
* set by set_pat extension, simply return 0 here without touching
280+
* the cache setting, because such objects should have an immutable
281+
* cache setting by desgin and always managed by userspace.
282+
*/
283+
if (i915_gem_object_has_cache_level(obj, cache_level))
271284
return 0;
272285

273286
ret = i915_gem_object_wait(obj,
@@ -278,10 +291,8 @@ int i915_gem_object_set_cache_level(struct drm_i915_gem_object *obj,
278291
return ret;
279292

280293
/* Always invalidate stale cachelines */
281-
if (obj->cache_level != cache_level) {
282-
i915_gem_object_set_cache_coherency(obj, cache_level);
283-
obj->cache_dirty = true;
284-
}
294+
i915_gem_object_set_cache_coherency(obj, cache_level);
295+
obj->cache_dirty = true;
285296

286297
/* The cache-level will be applied when each vma is rebound. */
287298
return i915_gem_object_unbind(obj,
@@ -306,20 +317,22 @@ int i915_gem_get_caching_ioctl(struct drm_device *dev, void *data,
306317
goto out;
307318
}
308319

309-
switch (obj->cache_level) {
310-
case I915_CACHE_LLC:
311-
case I915_CACHE_L3_LLC:
312-
args->caching = I915_CACHING_CACHED;
313-
break;
320+
/*
321+
* This ioctl should be disabled for the objects with pat_index
322+
* set by user space.
323+
*/
324+
if (obj->pat_set_by_user) {
325+
err = -EOPNOTSUPP;
326+
goto out;
327+
}
314328

315-
case I915_CACHE_WT:
329+
if (i915_gem_object_has_cache_level(obj, I915_CACHE_LLC) ||
330+
i915_gem_object_has_cache_level(obj, I915_CACHE_L3_LLC))
331+
args->caching = I915_CACHING_CACHED;
332+
else if (i915_gem_object_has_cache_level(obj, I915_CACHE_WT))
316333
args->caching = I915_CACHING_DISPLAY;
317-
break;
318-
319-
default:
334+
else
320335
args->caching = I915_CACHING_NONE;
321-
break;
322-
}
323336
out:
324337
rcu_read_unlock();
325338
return err;
@@ -337,6 +350,9 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
337350
if (IS_DGFX(i915))
338351
return -ENODEV;
339352

353+
if (GRAPHICS_VER_FULL(i915) >= IP_VER(12, 70))
354+
return -EOPNOTSUPP;
355+
340356
switch (args->caching) {
341357
case I915_CACHING_NONE:
342358
level = I915_CACHE_NONE;
@@ -364,6 +380,15 @@ int i915_gem_set_caching_ioctl(struct drm_device *dev, void *data,
364380
if (!obj)
365381
return -ENOENT;
366382

383+
/*
384+
* This ioctl should be disabled for the objects with pat_index
385+
* set by user space.
386+
*/
387+
if (obj->pat_set_by_user) {
388+
ret = -EOPNOTSUPP;
389+
goto out;
390+
}
391+
367392
/*
368393
* The caching mode of proxy object is handled by its generator, and
369394
* not allowed to be changed by userspace.

drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -640,9 +640,15 @@ static inline int use_cpu_reloc(const struct reloc_cache *cache,
640640
if (DBG_FORCE_RELOC == FORCE_GTT_RELOC)
641641
return false;
642642

643+
/*
644+
* For objects created by userspace through GEM_CREATE with pat_index
645+
* set by set_pat extension, i915_gem_object_has_cache_level() always
646+
* return true, otherwise the call would fall back to checking whether
647+
* the object is un-cached.
648+
*/
643649
return (cache->has_llc ||
644650
obj->cache_dirty ||
645-
obj->cache_level != I915_CACHE_NONE);
651+
!i915_gem_object_has_cache_level(obj, I915_CACHE_NONE));
646652
}
647653

648654
static int eb_reserve_vma(struct i915_execbuffer *eb,
@@ -1324,7 +1330,10 @@ static void *reloc_iomap(struct i915_vma *batch,
13241330
if (drm_mm_node_allocated(&cache->node)) {
13251331
ggtt->vm.insert_page(&ggtt->vm,
13261332
i915_gem_object_get_dma_address(obj, page),
1327-
offset, I915_CACHE_NONE, 0);
1333+
offset,
1334+
i915_gem_get_pat_index(ggtt->vm.i915,
1335+
I915_CACHE_NONE),
1336+
0);
13281337
} else {
13291338
offset += page << PAGE_SHIFT;
13301339
}
@@ -1464,7 +1473,7 @@ eb_relocate_entry(struct i915_execbuffer *eb,
14641473
reloc_cache_unmap(&eb->reloc_cache);
14651474
mutex_lock(&vma->vm->mutex);
14661475
err = i915_vma_bind(target->vma,
1467-
target->vma->obj->cache_level,
1476+
target->vma->obj->pat_index,
14681477
PIN_GLOBAL, NULL, NULL);
14691478
mutex_unlock(&vma->vm->mutex);
14701479
reloc_cache_remap(&eb->reloc_cache, ev->vma->obj);

0 commit comments

Comments
 (0)