Compare commits
53 Commits
master
...
rawhide/us
Author | SHA1 | Date | |
---|---|---|---|
|
84def05900 | ||
|
eb7b2f0ac9 | ||
|
b65e52f040 | ||
|
823c8f14d4 | ||
|
521056633b | ||
|
194b65895b | ||
|
b9db6f4241 | ||
|
0309dd5d1d | ||
|
34a9f813eb | ||
|
8ffcefc566 | ||
|
ddb95b3a12 | ||
|
9ff52fdd33 | ||
|
7a2f6e2c11 | ||
|
dab147f999 | ||
|
08e6a00037 | ||
|
c59de48dcf | ||
|
685bfa9afb | ||
|
f50d2873c3 | ||
|
b88607f8f0 | ||
|
58d1f03183 | ||
|
65d0c257a6 | ||
|
0bd53dc564 | ||
|
83389cd990 | ||
|
abab315534 | ||
|
1f6c23a1b7 | ||
|
caa69bbc91 | ||
|
d8422afbce | ||
|
09bc1b50b1 | ||
|
890c8ce6ae | ||
|
f5f5f6a81c | ||
|
28fc538cef | ||
|
3e91389000 | ||
|
fcb3c76eb5 | ||
|
14fd9886f2 | ||
|
2ce28c32d2 | ||
|
1e71a89379 | ||
|
a9d2ae6c02 | ||
|
8807475c83 | ||
|
1ad57fd01b | ||
|
ed706b65af | ||
|
85b5730b7e | ||
|
9e46bf6efa | ||
|
b4d2cea8c1 | ||
|
08f2df54cb | ||
|
88f689255e | ||
|
4ec8ad3e2b | ||
|
c43c10888a | ||
|
0e092ef29b | ||
|
672010d920 | ||
|
0da8aa1003 | ||
|
25c1e5d0ec | ||
|
f867de69f5 | ||
|
1d350f5695 |
@ -1,2 +1,8 @@
|
||||
# This file is intentionally left empty in the stock kernel. Its a nicety
|
||||
# added for those wanting to do custom rebuilds with altered config opts.
|
||||
CONFIG_XEN_NETDEV_BACKEND=m
|
||||
CONFIG_XEN_PCIDEV_BACKEND=m
|
||||
CONFIG_XEN_PCIDEV_BE_DEBUG=n
|
||||
CONFIG_XEN_DEBUG=n
|
||||
CONFIG_XEN_GRANT_DEV_ALLOC=m
|
||||
CONFIG_XEN_BLKDEV_BACKEND=m
|
||||
|
109
kernel.spec
109
kernel.spec
@ -24,6 +24,7 @@ Summary: The Linux kernel
|
||||
# (Uncomment the '#' and both spaces below to set the buildid.)
|
||||
#
|
||||
# % define buildid .local
|
||||
%define buildid .xendom0
|
||||
###################################################################
|
||||
|
||||
# The buildid can also be specified on the rpmbuild command line
|
||||
@ -130,7 +131,7 @@ Summary: The Linux kernel
|
||||
%define doc_build_fail true
|
||||
%endif
|
||||
|
||||
%define rawhide_skip_docs 0
|
||||
%define rawhide_skip_docs 1
|
||||
%if 0%{?rawhide_skip_docs}
|
||||
%define with_doc 0
|
||||
%define doc_build_fail true
|
||||
@ -422,6 +423,11 @@ Summary: The Linux kernel
|
||||
%define with_pae_debug %{with_debug}
|
||||
%endif
|
||||
|
||||
%ifarch i686
|
||||
%define with_up 0
|
||||
%define with_debug 0
|
||||
%endif
|
||||
|
||||
#
|
||||
# Three sets of minimum package version requirements in the form of Conflicts:
|
||||
# to versions below the minimum
|
||||
@ -732,6 +738,18 @@ Patch12303: dmar-disable-when-ricoh-multifunction.patch
|
||||
|
||||
Patch12421: fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# Xen patches
|
||||
# git://git.kernel.org/pub/scm/linux/kernel/git/jeremy/xen.git branches
|
||||
#Patch20000: xen.next-2.6.38.patch
|
||||
#Patch20001: xen.upstream.core.patch
|
||||
# git://git.kernel.org/pub/scm/linux/kernel/git/konrad/xen.git branches
|
||||
#Patch20005: xen.pcifront.fixes.patch
|
||||
Patch20006: xen.pcifront.next-2.6.38.patch
|
||||
# build fix
|
||||
Patch20007: p2mfix.patch
|
||||
# git://xenbits.xen.org/people/sstabellini/linux-pvhvm branches
|
||||
#Patch20010: xen.pvhvm.fixes.patch
|
||||
|
||||
%endif
|
||||
|
||||
BuildRoot: %{_tmppath}/kernel-%{KVERREL}-root
|
||||
@ -1362,6 +1380,14 @@ ApplyPatch dmar-disable-when-ricoh-multifunction.patch
|
||||
# rhbz#662344,600690
|
||||
ApplyPatch fs-call-security_d_instantiate-in-d_obtain_alias.patch
|
||||
|
||||
# Xen patches
|
||||
#ApplyPatch xen.next-2.6.38.patch
|
||||
#ApplyPatch xen.upstream.core.patch
|
||||
#ApplyPatch xen.pcifront.fixes.patch
|
||||
ApplyPatch xen.pcifront.next-2.6.38.patch
|
||||
ApplyPatch p2mfix.patch
|
||||
#ApplyPatch xen.pvhvm.fixes.patch
|
||||
|
||||
# END OF PATCH APPLICATIONS
|
||||
|
||||
%endif
|
||||
@ -1970,6 +1996,13 @@ fi
|
||||
# and build.
|
||||
|
||||
%changelog
|
||||
* Tue Mar 15 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- switch to single diff for pcifront.next-2.6.38.patch
|
||||
for ease of maintenance
|
||||
patch is git diff v2.6.38...3d67ff0c8f180f2cc4ade645f6f9571b26816e5a
|
||||
- set new xen-blkback to be a module CONFIG_XEN_BLKDEV_BACKEND=m
|
||||
- add patch to allow xen-blkback to build as module
|
||||
|
||||
* Tue Mar 15 2011 Adam Jackson <ajax@redhat.com>
|
||||
- drm-intel-big-hammer.patch: Drop.
|
||||
|
||||
@ -2019,6 +2052,9 @@ fi
|
||||
* Tue Mar 01 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc7.git0.1
|
||||
- Linux 2.6.38-rc7
|
||||
|
||||
* Mon Feb 28 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- get updated devel/next-2.6.38
|
||||
|
||||
* Fri Feb 25 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc6.git6.1
|
||||
- Linux 2.6.38-rc6-git6
|
||||
- Build in virtio_pci driver so virtio_console will be built-in (#677713)
|
||||
@ -2036,6 +2072,9 @@ fi
|
||||
* Wed Feb 23 2011 Ben Skeggs <bskeggs@redhat.com> 2.6.38-0.rc6.git0.2
|
||||
- nouveau: nv4x pciegart fixes, nvc0 accel improvements
|
||||
|
||||
* Tue Feb 22 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- update devel/next-2.6.38 and fix a mis-edit
|
||||
|
||||
* Tue Feb 22 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc6.git0.1
|
||||
- Linux 2.6.38-rc6
|
||||
|
||||
@ -2045,6 +2084,9 @@ fi
|
||||
* Mon Feb 21 2011 Dave Jones <davej@redhat.com> 2.6.38-0.rc5.git6.1
|
||||
- Linux 2.6.38-rc5-git6
|
||||
|
||||
* Sun Feb 20 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update devel/next-2.6.38
|
||||
|
||||
* Sat Feb 19 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc5.git5.1
|
||||
- Linux 2.6.38-rc5-git5
|
||||
|
||||
@ -2064,9 +2106,17 @@ fi
|
||||
- Linux 2.6.38-rc4-git6
|
||||
- Fix memory corruption caused by bug in bridge code.
|
||||
|
||||
* Fri Feb 11 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Try Konrad's devel/next-2.6.38 instead of Jeremy's xen/next-2.6.38
|
||||
which didn't boot last time
|
||||
- Set options added by the switch XEN_DEBUG=n and XEN_GRANT_DEV_ALLOC=m
|
||||
|
||||
* Thu Feb 10 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc4.git3.1
|
||||
- Linux 2.6.38-rc4-git3
|
||||
|
||||
* Wed Feb 09 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update xen.next-2.6.38 to get updated net backend code
|
||||
|
||||
* Mon Feb 07 2011 Fedora Release Engineering <rel-eng@lists.fedoraproject.org> - 2.6.38-0.rc4.git0.2
|
||||
- Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild
|
||||
|
||||
@ -2090,6 +2140,9 @@ fi
|
||||
* Wed Feb 02 2011 Chuck Ebbert <cebbert@redhat.com>
|
||||
- Fix autoload of atl1c driver for latest hardware (#607499)
|
||||
|
||||
* Tue Feb 02 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update xen.next-2.6.38 and xen.pvhvm.fixes patches
|
||||
|
||||
* Tue Feb 01 2011 Chuck Ebbert <cebbert@redhat.com> 2.6.38-0.rc3.git0.1
|
||||
- Linux 2.6.38-rc3
|
||||
- Try to fix some obvious bugs in hfsplus mount failure handling (#673857)
|
||||
@ -2114,9 +2167,21 @@ fi
|
||||
- Linux 2.6.38-rc2-git5
|
||||
- [x86] Re-enable TRANSPARENT_HUGEPAGE, should be fixed by cacf061c.
|
||||
|
||||
* Tue Jan 25 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Actually include xen.pvhvm.fixes.patch
|
||||
- Remove an upstream patch from xen.pvhvm.fixes.patch
|
||||
|
||||
* Tue Jan 25 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git3.2
|
||||
- [x86] Disable TRANSPARENT_HUGEPAGE for now, there be dragons there.
|
||||
|
||||
* Tue Jan 25 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Switch from xen/next-2.6.37 to xen/next-2.6.38
|
||||
which adds XEN_NETDEV_BACKEND and XEN_PCIDEV_BACKEND
|
||||
- comment out xen.pcifront.fixes.patch (patches are in next-2.6.38)
|
||||
- put 2.6.38-rc1-memory-fixes branch in xen.pvhvm.fixes.patch
|
||||
for some memory fixes including a later version of the crash on boot patch
|
||||
- don't build non-PAE debug kernel for i686
|
||||
|
||||
* Tue Jan 25 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git3.1
|
||||
- Linux 2.6.38-rc2-git3
|
||||
- perf-gcc460-build-fixes.patch: fix context from [9486aa38]
|
||||
@ -2138,6 +2203,12 @@ fi
|
||||
- perf-gcc460-build-fixes.patch: fix build issues with warn-unused-but-set
|
||||
in gcc 4.6.0
|
||||
|
||||
* Mon Jan 24 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- update to 2.6.38-rc
|
||||
- Strip out upstream or conflicting patches from xen.next-2.6.37.patch
|
||||
and xen.pcifront.fixes.patch
|
||||
- Add a test patch to fix a crash on boot to xen.pcifront.fixes.patch
|
||||
|
||||
* Sat Jan 22 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.38-0.rc2.git0.1
|
||||
- Linux 2.6.38-rc2
|
||||
- linux-2.6-serial-460800.patch, drivers/serial => drivers/tty/serial
|
||||
@ -2213,10 +2284,20 @@ fi
|
||||
CAN_SLCAN=m
|
||||
SCHED_AUTOGROUP=n
|
||||
|
||||
* Sun Jan 09 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- reorganize xen.pcifront.fixes.patch to be a combination of
|
||||
stable/bug-fixes stable/generic and stable/irq.rework for fixes
|
||||
in the previous stable/bug-fixes plus other fixes
|
||||
also devel/ttm.pci-api.v3 for some KMS fixes
|
||||
|
||||
* Fri Jan 07 2011 Kyle McMartin <kmcmartin@redhat.com> 2.6.37-2
|
||||
- drm_i915-check-eDP-encoder-correctly-when-setting-modes.patch reported to
|
||||
fix HP/Sony eDP issues by adamw and airlied.
|
||||
|
||||
* Wed Jan 05 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- update xen.pcifront.fixes.patch with IRQ fixes from stable/bug-fixes branch
|
||||
- skip docs - it seems to cause build failures at random points the moment.
|
||||
|
||||
* Wed Jan 05 2011 Dennis Gilmore <dennis@ausil.us>
|
||||
- build sparc headers on sparcv9
|
||||
|
||||
@ -2230,6 +2311,9 @@ fi
|
||||
- Linux 2.6.37-rc8-git3
|
||||
- Merged acpi battery notification patch and -rc8.
|
||||
|
||||
* Tue Jan 01 2011 Michael Young <m.a.young@durham.ac.uk>
|
||||
- update pvops to add some xenbus patches
|
||||
|
||||
* Thu Dec 23 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- Pull in flexcop procfs rename patch since it's still not upstream. (#664852)
|
||||
|
||||
@ -2267,6 +2351,9 @@ fi
|
||||
* Wed Dec 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git5.1
|
||||
- 2.6.37-rc5-git5
|
||||
|
||||
* Tue Dec 14 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- test an irq patch in xen.pcifront.fixes.patch
|
||||
|
||||
* Fri Dec 10 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- Another patch from mjg59: Set _OSC supported field correctly (#638912)
|
||||
|
||||
@ -2284,6 +2371,9 @@ fi
|
||||
- sched-cure-more-NO_HZ-load-average-woes.patch: fix some of the complaints
|
||||
in 2.6.35+ about load average with dynticks. (rhbz#650934)
|
||||
|
||||
* Wed Dec 08 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update the xen/next-2.6.37 patch and rebuild for rc5
|
||||
|
||||
* Tue Dec 07 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc5.git0.1
|
||||
- Linux 2.6.37-rc5
|
||||
|
||||
@ -2302,6 +2392,10 @@ fi
|
||||
* Thu Dec 02 2010 Kyle McMartin <kyle@redhat.com>
|
||||
- Grab some of Mel's fixes from -mmotm to hopefully sort out #649694.
|
||||
|
||||
* Thu Dec 02 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update the xen/next-2.6.37 patch and rebuild for rc4-git1
|
||||
- xen-pcifront-fixes patch is now upstream
|
||||
|
||||
* Wed Dec 01 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc4.git1.1
|
||||
- Linux 2.6.37-rc4-git1
|
||||
- Pull in DRM fixes that are queued for -rc5 [3074adc8]
|
||||
@ -2334,6 +2428,9 @@ fi
|
||||
* Wed Nov 24 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git1.1
|
||||
- Linux 2.6.37-rc3-git1
|
||||
|
||||
* Mon Nov 22 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update the xen/next-2.6.37 patch and rebuild for rc3
|
||||
|
||||
* Mon Nov 22 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.rc3.git0.1
|
||||
- Linux 2.6.37-rc3
|
||||
|
||||
@ -2358,6 +2455,9 @@ fi
|
||||
- Make vmlinuz/System.map root read-write only by default. You can just
|
||||
chmod 644 them later if you (unlikely) need them without root.
|
||||
|
||||
* Tue Nov 16 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Update the xen/next-2.6.37 and xen-pcifront-fixes patches
|
||||
|
||||
* Mon Nov 15 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc2.git0
|
||||
- Linux 2.6.37-rc2
|
||||
|
||||
@ -2368,6 +2468,13 @@ fi
|
||||
you may use the kernel.dmesg_restrict sysctl.
|
||||
- linux-2.6-bluetooth-autosuspend.patch: merged upstream.
|
||||
|
||||
* Fri Nov 12 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- Try again with xen patches from xen/next-2.6.37
|
||||
- Build new XEN_GNTDEV option as a module
|
||||
|
||||
* Thu Nov 11 2010 Michael Young <m.a.young@durham.ac.uk>
|
||||
- experiment with patch format by adding various xen bugfixes
|
||||
|
||||
* Tue Nov 09 2010 Kyle McMartin <kyle@redhat.com> 2.6.37-0.1.rc1.git7
|
||||
- Linux 2.6.37-rc1-git7
|
||||
|
||||
|
18
p2mfix.patch
Normal file
18
p2mfix.patch
Normal file
@ -0,0 +1,18 @@
|
||||
--- linux-2.6.38.x86_64/arch/x86/xen/p2m.c.orig 2011-03-15 19:51:44.000000000 +0000
|
||||
+++ linux-2.6.38.x86_64/arch/x86/xen/p2m.c 2011-03-15 20:38:38.000000000 +0000
|
||||
@@ -557,6 +557,7 @@
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(m2p_add_override);
|
||||
|
||||
int m2p_remove_override(struct page *page, bool clear_pte)
|
||||
{
|
||||
@@ -594,6 +595,7 @@
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL_GPL(m2p_remove_override);
|
||||
|
||||
struct page *m2p_find_override(unsigned long mfn)
|
||||
{
|
36944
xen.next-2.6.38.patch
Normal file
36944
xen.next-2.6.38.patch
Normal file
File diff suppressed because it is too large
Load Diff
688
xen.pcifront.fixes.patch
Normal file
688
xen.pcifront.fixes.patch
Normal file
@ -0,0 +1,688 @@
|
||||
From 25c95c6ab7b9e257a60ac3eac73fa1acb120c692 Mon Sep 17 00:00:00 2001
|
||||
From: Kenji Wakamiya <wkenji@jp.fujitsu.com>
|
||||
Date: Tue, 14 Dec 2010 14:31:36 +0900
|
||||
Subject: [PATCH 2/6] xen/manage: fix "xm save -c" issue
|
||||
|
||||
When using 'xm save -c' (which checkpoints the guest) on PV
|
||||
guests, the dpms_resume_end() should be surpressed. It is OK
|
||||
to make this call when doing 'xm save'.
|
||||
|
||||
Signed-off-by: Kenji Wakamiya <wkenji@jp.fujitsu.com>
|
||||
Signed-off-by: Kazuhiro Suzuki <kaz@jp.fujitsu.com>
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/xen/manage.c | 3 +--
|
||||
1 files changed, 1 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
|
||||
index db8c4c4..e32b9c0 100644
|
||||
--- a/drivers/xen/manage.c
|
||||
+++ b/drivers/xen/manage.c
|
||||
@@ -145,11 +145,10 @@ out_resume:
|
||||
if (!cancelled) {
|
||||
xen_arch_resume();
|
||||
xs_resume();
|
||||
+ dpm_resume_end(PMSG_RESUME);
|
||||
} else
|
||||
xs_suspend_cancel();
|
||||
|
||||
- dpm_resume_end(PMSG_RESUME);
|
||||
-
|
||||
/* Make sure timer events get retriggered on all CPUs */
|
||||
clock_was_set();
|
||||
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
|
||||
From 105aad363797212fbd2a4c887b723407c5851175 Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Thu, 9 Dec 2010 15:01:11 -0500
|
||||
Subject: [PATCH 2/2] xen/irq: Don't fall over when nr_irqs_gsi > nr_irqs.
|
||||
|
||||
This scenario where the nr_irq_gsi is greater than nr_irqs
|
||||
is rather strange but lets still try to survive. Make sure
|
||||
to print a warning so the user wouldn't be surprised in case
|
||||
things don't work.
|
||||
|
||||
Solves a bootup-crash when booting Xen and Linux under QEMU.
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/xen/events.c | 9 +++++++++
|
||||
1 files changed, 9 insertions(+), 0 deletions(-)
|
||||
|
||||
diff --git a/drivers/xen/events.c b/drivers/xen/events.c
|
||||
index 4d4a23d..98b7220 100644
|
||||
--- a/drivers/xen/events.c
|
||||
+++ b/drivers/xen/events.c
|
||||
@@ -411,6 +411,7 @@ static int find_unbound_irq(void)
|
||||
if (bottom == nr_irqs)
|
||||
goto no_irqs;
|
||||
|
||||
+retry:
|
||||
/* This loop starts from the top of IRQ space and goes down.
|
||||
* We need this b/c if we have a PCI device in a Xen PV guest
|
||||
* we do not have an IO-APIC (though the backend might have them)
|
||||
@@ -434,6 +435,14 @@ static int find_unbound_irq(void)
|
||||
goto no_irqs;
|
||||
|
||||
res = irq_alloc_desc_at(irq, -1);
|
||||
+ if (res == -EEXIST) {
|
||||
+ top--;
|
||||
+ if (bottom > top)
|
||||
+ printk(KERN_ERR "Eating in GSI/MSI space (%d)!" \
|
||||
+ " Your PCI device might not work!\n", top);
|
||||
+ if (top > NR_IRQS_LEGACY)
|
||||
+ goto retry;
|
||||
+ }
|
||||
|
||||
if (WARN_ON(res != irq))
|
||||
return -1;
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
From 3c6613fb55517f444358d07d2da9d39352d080d9 Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Mon, 29 Nov 2010 13:52:18 -0500
|
||||
Subject: [PATCH 1/5] ttm: Introduce a placeholder for DMA (bus) addresses.
|
||||
|
||||
This is right now limited to only non-pool constructs.
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/gpu/drm/ttm/ttm_page_alloc.c | 9 ++++++---
|
||||
drivers/gpu/drm/ttm/ttm_tt.c | 10 ++++++++--
|
||||
include/drm/ttm/ttm_bo_driver.h | 2 ++
|
||||
include/drm/ttm/ttm_page_alloc.h | 8 ++++++--
|
||||
4 files changed, 22 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||
index b1e02ff..6859288 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/seq_file.h> /* for seq_printf */
|
||||
#include <linux/slab.h>
|
||||
+#include <linux/dma-mapping.h>
|
||||
|
||||
#include <asm/atomic.h>
|
||||
|
||||
@@ -662,7 +663,8 @@ out:
|
||||
* cached pages.
|
||||
*/
|
||||
int ttm_get_pages(struct list_head *pages, int flags,
|
||||
- enum ttm_caching_state cstate, unsigned count)
|
||||
+ enum ttm_caching_state cstate, unsigned count,
|
||||
+ dma_addr_t *dma_address)
|
||||
{
|
||||
struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
|
||||
struct page *p = NULL;
|
||||
@@ -720,7 +722,7 @@ int ttm_get_pages(struct list_head *pages, int flags,
|
||||
printk(KERN_ERR TTM_PFX
|
||||
"Failed to allocate extra pages "
|
||||
"for large request.");
|
||||
- ttm_put_pages(pages, 0, flags, cstate);
|
||||
+ ttm_put_pages(pages, 0, flags, cstate, NULL);
|
||||
return r;
|
||||
}
|
||||
}
|
||||
@@ -731,7 +733,8 @@ int ttm_get_pages(struct list_head *pages, int flags,
|
||||
|
||||
/* Put all pages in pages list to correct pool to wait for reuse */
|
||||
void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags,
|
||||
- enum ttm_caching_state cstate)
|
||||
+ enum ttm_caching_state cstate,
|
||||
+ dma_addr_t *dma_address)
|
||||
{
|
||||
unsigned long irq_flags;
|
||||
struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
|
||||
index af789dc..0d39001 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_tt.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
|
||||
@@ -49,12 +49,16 @@ static int ttm_tt_swapin(struct ttm_tt *ttm);
|
||||
static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)
|
||||
{
|
||||
ttm->pages = drm_calloc_large(ttm->num_pages, sizeof(*ttm->pages));
|
||||
+ ttm->dma_address = drm_calloc_large(ttm->num_pages,
|
||||
+ sizeof(*ttm->dma_address));
|
||||
}
|
||||
|
||||
static void ttm_tt_free_page_directory(struct ttm_tt *ttm)
|
||||
{
|
||||
drm_free_large(ttm->pages);
|
||||
ttm->pages = NULL;
|
||||
+ drm_free_large(ttm->dma_address);
|
||||
+ ttm->dma_address = NULL;
|
||||
}
|
||||
|
||||
static void ttm_tt_free_user_pages(struct ttm_tt *ttm)
|
||||
@@ -105,7 +109,8 @@ static struct page *__ttm_tt_get_page(struct ttm_tt *ttm, int index)
|
||||
|
||||
INIT_LIST_HEAD(&h);
|
||||
|
||||
- ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1);
|
||||
+ ret = ttm_get_pages(&h, ttm->page_flags, ttm->caching_state, 1,
|
||||
+ &ttm->dma_address[index]);
|
||||
|
||||
if (ret != 0)
|
||||
return NULL;
|
||||
@@ -298,7 +303,8 @@ static void ttm_tt_free_alloced_pages(struct ttm_tt *ttm)
|
||||
count++;
|
||||
}
|
||||
}
|
||||
- ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state);
|
||||
+ ttm_put_pages(&h, count, ttm->page_flags, ttm->caching_state,
|
||||
+ ttm->dma_address);
|
||||
ttm->state = tt_unpopulated;
|
||||
ttm->first_himem_page = ttm->num_pages;
|
||||
ttm->last_lomem_page = -1;
|
||||
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
|
||||
index 8e0c848..6dc4fcc 100644
|
||||
--- a/include/drm/ttm/ttm_bo_driver.h
|
||||
+++ b/include/drm/ttm/ttm_bo_driver.h
|
||||
@@ -149,6 +149,7 @@ enum ttm_caching_state {
|
||||
* @swap_storage: Pointer to shmem struct file for swap storage.
|
||||
* @caching_state: The current caching state of the pages.
|
||||
* @state: The current binding state of the pages.
|
||||
+ * @dma_address: The DMA (bus) addresses of the pages (if TTM_PAGE_FLAG_DMA32)
|
||||
*
|
||||
* This is a structure holding the pages, caching- and aperture binding
|
||||
* status for a buffer object that isn't backed by fixed (VRAM / AGP)
|
||||
@@ -173,6 +174,7 @@ struct ttm_tt {
|
||||
tt_unbound,
|
||||
tt_unpopulated,
|
||||
} state;
|
||||
+ dma_addr_t *dma_address;
|
||||
};
|
||||
|
||||
#define TTM_MEMTYPE_FLAG_FIXED (1 << 0) /* Fixed (on-card) PCI memory */
|
||||
diff --git a/include/drm/ttm/ttm_page_alloc.h b/include/drm/ttm/ttm_page_alloc.h
|
||||
index 1168214..8062890 100644
|
||||
--- a/include/drm/ttm/ttm_page_alloc.h
|
||||
+++ b/include/drm/ttm/ttm_page_alloc.h
|
||||
@@ -36,11 +36,13 @@
|
||||
* @flags: ttm flags for page allocation.
|
||||
* @cstate: ttm caching state for the page.
|
||||
* @count: number of pages to allocate.
|
||||
+ * @dma_address: The DMA (bus) address of pages (if TTM_PAGE_FLAG_DMA32 set).
|
||||
*/
|
||||
int ttm_get_pages(struct list_head *pages,
|
||||
int flags,
|
||||
enum ttm_caching_state cstate,
|
||||
- unsigned count);
|
||||
+ unsigned count,
|
||||
+ dma_addr_t *dma_address);
|
||||
/**
|
||||
* Put linked list of pages to pool.
|
||||
*
|
||||
@@ -49,11 +51,13 @@ int ttm_get_pages(struct list_head *pages,
|
||||
* count.
|
||||
* @flags: ttm flags for page allocation.
|
||||
* @cstate: ttm caching state.
|
||||
+ * @dma_address: The DMA (bus) address of pages (if TTM_PAGE_FLAG_DMA32 set).
|
||||
*/
|
||||
void ttm_put_pages(struct list_head *pages,
|
||||
unsigned page_count,
|
||||
int flags,
|
||||
- enum ttm_caching_state cstate);
|
||||
+ enum ttm_caching_state cstate,
|
||||
+ dma_addr_t *dma_address);
|
||||
/**
|
||||
* Initialize pool allocator.
|
||||
*/
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
|
||||
From 6ea9ff7ffcfce13d16110c85e002f07b57c8894e Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Mon, 29 Nov 2010 14:03:30 -0500
|
||||
Subject: [PATCH 2/5] tm: Utilize the dma_addr_t array for pages that are to in DMA32 pool.
|
||||
|
||||
We only use the "if (pool == NULL)" path for right now.
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/gpu/drm/ttm/ttm_page_alloc.c | 26 +++++++++++++++++++++++---
|
||||
1 files changed, 23 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_page_alloc.c b/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||
index 6859288..5d09677 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_page_alloc.c
|
||||
@@ -683,14 +683,22 @@ int ttm_get_pages(struct list_head *pages, int flags,
|
||||
gfp_flags |= GFP_HIGHUSER;
|
||||
|
||||
for (r = 0; r < count; ++r) {
|
||||
- p = alloc_page(gfp_flags);
|
||||
+ if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) {
|
||||
+ void *addr;
|
||||
+ addr = dma_alloc_coherent(NULL, PAGE_SIZE,
|
||||
+ &dma_address[r],
|
||||
+ gfp_flags);
|
||||
+ if (addr == NULL)
|
||||
+ return -ENOMEM;
|
||||
+ p = virt_to_page(addr);
|
||||
+ } else
|
||||
+ p = alloc_page(gfp_flags);
|
||||
if (!p) {
|
||||
|
||||
printk(KERN_ERR TTM_PFX
|
||||
"Unable to allocate page.");
|
||||
return -ENOMEM;
|
||||
}
|
||||
-
|
||||
list_add(&p->lru, pages);
|
||||
}
|
||||
return 0;
|
||||
@@ -739,12 +747,24 @@ void ttm_put_pages(struct list_head *pages, unsigned page_count, int flags,
|
||||
unsigned long irq_flags;
|
||||
struct ttm_page_pool *pool = ttm_get_pool(flags, cstate);
|
||||
struct page *p, *tmp;
|
||||
+ unsigned r;
|
||||
|
||||
if (pool == NULL) {
|
||||
/* No pool for this memory type so free the pages */
|
||||
|
||||
+ r = page_count-1;
|
||||
list_for_each_entry_safe(p, tmp, pages, lru) {
|
||||
- __free_page(p);
|
||||
+ if ((flags & TTM_PAGE_FLAG_DMA32) && dma_address) {
|
||||
+ void *addr = page_address(p);
|
||||
+ WARN_ON(!addr || !dma_address[r]);
|
||||
+ if (addr)
|
||||
+ dma_free_coherent(NULL, PAGE_SIZE,
|
||||
+ addr,
|
||||
+ dma_address[r]);
|
||||
+ dma_address[r] = 0;
|
||||
+ } else
|
||||
+ __free_page(p);
|
||||
+ r--;
|
||||
}
|
||||
/* Make the pages list empty */
|
||||
INIT_LIST_HEAD(pages);
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
|
||||
From f6d1461c3203cad0655d97674104547f2cc7a624 Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Thu, 2 Dec 2010 10:24:13 -0500
|
||||
Subject: [PATCH 3/5] ttm: Expand (*populate) to support an array of DMA addresses.
|
||||
|
||||
We pass in the array of ttm pages to be populated in the GART/MM
|
||||
of the card (or AGP). Patch titled: "ttm: Utilize the dma_addr_t array
|
||||
for pages that are to in DMA32 pool." uses the DMA API to make those
|
||||
pages have a proper DMA addresses (in the situation where
|
||||
page_to_phys or virt_to_phys do not give use the DMA (bus) address).
|
||||
|
||||
Since we are using the DMA API on those pages, we should pass in the
|
||||
DMA address to this function so it can save it in its proper fields
|
||||
(later patches use it).
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/gpu/drm/nouveau/nouveau_sgdma.c | 3 ++-
|
||||
drivers/gpu/drm/radeon/radeon_ttm.c | 3 ++-
|
||||
drivers/gpu/drm/ttm/ttm_agp_backend.c | 3 ++-
|
||||
drivers/gpu/drm/ttm/ttm_tt.c | 2 +-
|
||||
drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c | 3 ++-
|
||||
include/drm/ttm/ttm_bo_driver.h | 4 +++-
|
||||
6 files changed, 12 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
index 288baca..edc140a 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
@@ -20,7 +20,8 @@ struct nouveau_sgdma_be {
|
||||
|
||||
static int
|
||||
nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
|
||||
- struct page **pages, struct page *dummy_read_page)
|
||||
+ struct page **pages, struct page *dummy_read_page,
|
||||
+ dma_addr_t *dma_addrs)
|
||||
{
|
||||
struct nouveau_sgdma_be *nvbe = (struct nouveau_sgdma_be *)be;
|
||||
struct drm_device *dev = nvbe->dev;
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
|
||||
index 01c2c73..6f156e9 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
|
||||
@@ -655,7 +655,8 @@ struct radeon_ttm_backend {
|
||||
static int radeon_ttm_backend_populate(struct ttm_backend *backend,
|
||||
unsigned long num_pages,
|
||||
struct page **pages,
|
||||
- struct page *dummy_read_page)
|
||||
+ struct page *dummy_read_page,
|
||||
+ dma_addr_t *dma_addrs)
|
||||
{
|
||||
struct radeon_ttm_backend *gtt;
|
||||
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_agp_backend.c b/drivers/gpu/drm/ttm/ttm_agp_backend.c
|
||||
index f999e36..1c4a72f 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_agp_backend.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_agp_backend.c
|
||||
@@ -47,7 +47,8 @@ struct ttm_agp_backend {
|
||||
|
||||
static int ttm_agp_populate(struct ttm_backend *backend,
|
||||
unsigned long num_pages, struct page **pages,
|
||||
- struct page *dummy_read_page)
|
||||
+ struct page *dummy_read_page,
|
||||
+ dma_addr_t *dma_addrs)
|
||||
{
|
||||
struct ttm_agp_backend *agp_be =
|
||||
container_of(backend, struct ttm_agp_backend, backend);
|
||||
diff --git a/drivers/gpu/drm/ttm/ttm_tt.c b/drivers/gpu/drm/ttm/ttm_tt.c
|
||||
index 0d39001..86d5b17 100644
|
||||
--- a/drivers/gpu/drm/ttm/ttm_tt.c
|
||||
+++ b/drivers/gpu/drm/ttm/ttm_tt.c
|
||||
@@ -169,7 +169,7 @@ int ttm_tt_populate(struct ttm_tt *ttm)
|
||||
}
|
||||
|
||||
be->func->populate(be, ttm->num_pages, ttm->pages,
|
||||
- ttm->dummy_read_page);
|
||||
+ ttm->dummy_read_page, ttm->dma_address);
|
||||
ttm->state = tt_unbound;
|
||||
return 0;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
|
||||
index 80bc37b..87e43e0 100644
|
||||
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
|
||||
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_buffer.c
|
||||
@@ -102,7 +102,8 @@ struct vmw_ttm_backend {
|
||||
|
||||
static int vmw_ttm_populate(struct ttm_backend *backend,
|
||||
unsigned long num_pages, struct page **pages,
|
||||
- struct page *dummy_read_page)
|
||||
+ struct page *dummy_read_page,
|
||||
+ dma_addr_t *dma_addrs)
|
||||
{
|
||||
struct vmw_ttm_backend *vmw_be =
|
||||
container_of(backend, struct vmw_ttm_backend, backend);
|
||||
diff --git a/include/drm/ttm/ttm_bo_driver.h b/include/drm/ttm/ttm_bo_driver.h
|
||||
index 6dc4fcc..ebcd3dd 100644
|
||||
--- a/include/drm/ttm/ttm_bo_driver.h
|
||||
+++ b/include/drm/ttm/ttm_bo_driver.h
|
||||
@@ -50,13 +50,15 @@ struct ttm_backend_func {
|
||||
* @pages: Array of pointers to ttm pages.
|
||||
* @dummy_read_page: Page to be used instead of NULL pages in the
|
||||
* array @pages.
|
||||
+ * @dma_addrs: Array of DMA (bus) address of the ttm pages.
|
||||
*
|
||||
* Populate the backend with ttm pages. Depending on the backend,
|
||||
* it may or may not copy the @pages array.
|
||||
*/
|
||||
int (*populate) (struct ttm_backend *backend,
|
||||
unsigned long num_pages, struct page **pages,
|
||||
- struct page *dummy_read_page);
|
||||
+ struct page *dummy_read_page,
|
||||
+ dma_addr_t *dma_addrs);
|
||||
/**
|
||||
* struct ttm_backend_func member clear
|
||||
*
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
|
||||
From 2c88605f61ea99179e67e341f0ba4c8e8f356542 Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Thu, 2 Dec 2010 11:04:29 -0500
|
||||
Subject: [PATCH 4/5] radeon/ttm/PCIe: Use dma_addr if TTM has set it.
|
||||
|
||||
If the TTM layer has used the DMA API to setup pages that are
|
||||
TTM_PAGE_FLAG_DMA32 (look at patch titled: "ttm: Utilize the dma_addr_t
|
||||
array for pages that are to in DMA32 pool."), lets use it
|
||||
when programming the GART in the PCIe type cards.
|
||||
|
||||
This patch skips doing the pci_map_page (and pci_unmap_page) if
|
||||
there is a DMA addresses passed in for that page. If the dma_address
|
||||
is zero (or DMA_ERROR_CODE), then we continue on with our old
|
||||
behaviour.
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/gpu/drm/radeon/radeon.h | 4 ++-
|
||||
drivers/gpu/drm/radeon/radeon_gart.c | 36 ++++++++++++++++++++++++---------
|
||||
drivers/gpu/drm/radeon/radeon_ttm.c | 5 +++-
|
||||
3 files changed, 33 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
|
||||
index 73f600d..c9bbab9 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon.h
|
||||
+++ b/drivers/gpu/drm/radeon/radeon.h
|
||||
@@ -317,6 +317,7 @@ struct radeon_gart {
|
||||
union radeon_gart_table table;
|
||||
struct page **pages;
|
||||
dma_addr_t *pages_addr;
|
||||
+ bool *ttm_alloced;
|
||||
bool ready;
|
||||
};
|
||||
|
||||
@@ -329,7 +330,8 @@ void radeon_gart_fini(struct radeon_device *rdev);
|
||||
void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
|
||||
int pages);
|
||||
int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
|
||||
- int pages, struct page **pagelist);
|
||||
+ int pages, struct page **pagelist,
|
||||
+ dma_addr_t *dma_addr);
|
||||
|
||||
|
||||
/*
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_gart.c b/drivers/gpu/drm/radeon/radeon_gart.c
|
||||
index e65b903..4a5ac4b 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_gart.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_gart.c
|
||||
@@ -149,8 +149,9 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
|
||||
p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
|
||||
for (i = 0; i < pages; i++, p++) {
|
||||
if (rdev->gart.pages[p]) {
|
||||
- pci_unmap_page(rdev->pdev, rdev->gart.pages_addr[p],
|
||||
- PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
+ if (!rdev->gart.ttm_alloced[p])
|
||||
+ pci_unmap_page(rdev->pdev, rdev->gart.pages_addr[p],
|
||||
+ PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
rdev->gart.pages[p] = NULL;
|
||||
rdev->gart.pages_addr[p] = rdev->dummy_page.addr;
|
||||
page_base = rdev->gart.pages_addr[p];
|
||||
@@ -165,7 +166,7 @@ void radeon_gart_unbind(struct radeon_device *rdev, unsigned offset,
|
||||
}
|
||||
|
||||
int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
|
||||
- int pages, struct page **pagelist)
|
||||
+ int pages, struct page **pagelist, dma_addr_t *dma_addr)
|
||||
{
|
||||
unsigned t;
|
||||
unsigned p;
|
||||
@@ -180,15 +181,22 @@ int radeon_gart_bind(struct radeon_device *rdev, unsigned offset,
|
||||
p = t / (PAGE_SIZE / RADEON_GPU_PAGE_SIZE);
|
||||
|
||||
for (i = 0; i < pages; i++, p++) {
|
||||
- /* we need to support large memory configurations */
|
||||
- /* assume that unbind have already been call on the range */
|
||||
- rdev->gart.pages_addr[p] = pci_map_page(rdev->pdev, pagelist[i],
|
||||
+ /* On TTM path, we only use the DMA API if TTM_PAGE_FLAG_DMA32
|
||||
+ * is requested. */
|
||||
+ if (dma_addr[i] != DMA_ERROR_CODE) {
|
||||
+ rdev->gart.ttm_alloced[p] = true;
|
||||
+ rdev->gart.pages_addr[p] = dma_addr[i];
|
||||
+ } else {
|
||||
+ /* we need to support large memory configurations */
|
||||
+ /* assume that unbind have already been call on the range */
|
||||
+ rdev->gart.pages_addr[p] = pci_map_page(rdev->pdev, pagelist[i],
|
||||
0, PAGE_SIZE,
|
||||
PCI_DMA_BIDIRECTIONAL);
|
||||
- if (pci_dma_mapping_error(rdev->pdev, rdev->gart.pages_addr[p])) {
|
||||
- /* FIXME: failed to map page (return -ENOMEM?) */
|
||||
- radeon_gart_unbind(rdev, offset, pages);
|
||||
- return -ENOMEM;
|
||||
+ if (pci_dma_mapping_error(rdev->pdev, rdev->gart.pages_addr[p])) {
|
||||
+ /* FIXME: failed to map page (return -ENOMEM?) */
|
||||
+ radeon_gart_unbind(rdev, offset, pages);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
}
|
||||
rdev->gart.pages[p] = pagelist[i];
|
||||
page_base = rdev->gart.pages_addr[p];
|
||||
@@ -251,6 +259,12 @@ int radeon_gart_init(struct radeon_device *rdev)
|
||||
radeon_gart_fini(rdev);
|
||||
return -ENOMEM;
|
||||
}
|
||||
+ rdev->gart.ttm_alloced = kzalloc(sizeof(bool) *
|
||||
+ rdev->gart.num_cpu_pages, GFP_KERNEL);
|
||||
+ if (rdev->gart.ttm_alloced == NULL) {
|
||||
+ radeon_gart_fini(rdev);
|
||||
+ return -ENOMEM;
|
||||
+ }
|
||||
/* set GART entry to point to the dummy page by default */
|
||||
for (i = 0; i < rdev->gart.num_cpu_pages; i++) {
|
||||
rdev->gart.pages_addr[i] = rdev->dummy_page.addr;
|
||||
@@ -267,6 +281,8 @@ void radeon_gart_fini(struct radeon_device *rdev)
|
||||
rdev->gart.ready = false;
|
||||
kfree(rdev->gart.pages);
|
||||
kfree(rdev->gart.pages_addr);
|
||||
+ kfree(rdev->gart.ttm_alloced);
|
||||
rdev->gart.pages = NULL;
|
||||
rdev->gart.pages_addr = NULL;
|
||||
+ rdev->gart.ttm_alloced = NULL;
|
||||
}
|
||||
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
|
||||
index 6f156e9..ca04505 100644
|
||||
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
|
||||
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
|
||||
@@ -647,6 +647,7 @@ struct radeon_ttm_backend {
|
||||
unsigned long num_pages;
|
||||
struct page **pages;
|
||||
struct page *dummy_read_page;
|
||||
+ dma_addr_t *dma_addrs;
|
||||
bool populated;
|
||||
bool bound;
|
||||
unsigned offset;
|
||||
@@ -662,6 +663,7 @@ static int radeon_ttm_backend_populate(struct ttm_backend *backend,
|
||||
|
||||
gtt = container_of(backend, struct radeon_ttm_backend, backend);
|
||||
gtt->pages = pages;
|
||||
+ gtt->dma_addrs = dma_addrs;
|
||||
gtt->num_pages = num_pages;
|
||||
gtt->dummy_read_page = dummy_read_page;
|
||||
gtt->populated = true;
|
||||
@@ -674,6 +676,7 @@ static void radeon_ttm_backend_clear(struct ttm_backend *backend)
|
||||
|
||||
gtt = container_of(backend, struct radeon_ttm_backend, backend);
|
||||
gtt->pages = NULL;
|
||||
+ gtt->dma_addrs = NULL;
|
||||
gtt->num_pages = 0;
|
||||
gtt->dummy_read_page = NULL;
|
||||
gtt->populated = false;
|
||||
@@ -694,7 +697,7 @@ static int radeon_ttm_backend_bind(struct ttm_backend *backend,
|
||||
gtt->num_pages, bo_mem, backend);
|
||||
}
|
||||
r = radeon_gart_bind(gtt->rdev, gtt->offset,
|
||||
- gtt->num_pages, gtt->pages);
|
||||
+ gtt->num_pages, gtt->pages, gtt->dma_addrs);
|
||||
if (r) {
|
||||
DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
|
||||
gtt->num_pages, gtt->offset);
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
|
||||
From b5f054f501d394d6e6064c9227db2927a3014d06 Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Thu, 2 Dec 2010 11:36:24 -0500
|
||||
Subject: [PATCH 5/5] nouveau/ttm/PCIe: Use dma_addr if TTM has set it.
|
||||
|
||||
If the TTM layer has used the DMA API to setup pages that are
|
||||
TTM_PAGE_FLAG_DMA32 (look at patch titled: "ttm: Utilize the dma_addr_t
|
||||
array for pages that are to in DMA32 pool."), lets use it
|
||||
when programming the GART in the PCIe type cards.
|
||||
|
||||
This patch skips doing the pci_map_page (and pci_unmap_page) if
|
||||
there is a DMA addresses passed in for that page. If the dma_address
|
||||
is zero (or DMA_ERROR_CODE), then we continue on with our old
|
||||
behaviour.
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
drivers/gpu/drm/nouveau/nouveau_sgdma.c | 28 +++++++++++++++++++++-------
|
||||
1 files changed, 21 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/gpu/drm/nouveau/nouveau_sgdma.c b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
index edc140a..bbdd982 100644
|
||||
--- a/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
+++ b/drivers/gpu/drm/nouveau/nouveau_sgdma.c
|
||||
@@ -12,6 +12,7 @@ struct nouveau_sgdma_be {
|
||||
struct drm_device *dev;
|
||||
|
||||
dma_addr_t *pages;
|
||||
+ bool *ttm_alloced;
|
||||
unsigned nr_pages;
|
||||
|
||||
unsigned pte_start;
|
||||
@@ -35,15 +36,25 @@ nouveau_sgdma_populate(struct ttm_backend *be, unsigned long num_pages,
|
||||
if (!nvbe->pages)
|
||||
return -ENOMEM;
|
||||
|
||||
+ nvbe->ttm_alloced = kmalloc(sizeof(bool) * num_pages, GFP_KERNEL);
|
||||
+ if (!nvbe->ttm_alloced)
|
||||
+ return -ENOMEM;
|
||||
+
|
||||
nvbe->nr_pages = 0;
|
||||
while (num_pages--) {
|
||||
- nvbe->pages[nvbe->nr_pages] =
|
||||
- pci_map_page(dev->pdev, pages[nvbe->nr_pages], 0,
|
||||
+ if (dma_addrs[nvbe->nr_pages] != DMA_ERROR_CODE) {
|
||||
+ nvbe->pages[nvbe->nr_pages] =
|
||||
+ dma_addrs[nvbe->nr_pages];
|
||||
+ nvbe->ttm_alloced[nvbe->nr_pages] = true;
|
||||
+ } else {
|
||||
+ nvbe->pages[nvbe->nr_pages] =
|
||||
+ pci_map_page(dev->pdev, pages[nvbe->nr_pages], 0,
|
||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
- if (pci_dma_mapping_error(dev->pdev,
|
||||
- nvbe->pages[nvbe->nr_pages])) {
|
||||
- be->func->clear(be);
|
||||
- return -EFAULT;
|
||||
+ if (pci_dma_mapping_error(dev->pdev,
|
||||
+ nvbe->pages[nvbe->nr_pages])) {
|
||||
+ be->func->clear(be);
|
||||
+ return -EFAULT;
|
||||
+ }
|
||||
}
|
||||
|
||||
nvbe->nr_pages++;
|
||||
@@ -66,11 +77,14 @@ nouveau_sgdma_clear(struct ttm_backend *be)
|
||||
be->func->unbind(be);
|
||||
|
||||
while (nvbe->nr_pages--) {
|
||||
- pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
|
||||
+ if (!nvbe->ttm_alloced[nvbe->nr_pages])
|
||||
+ pci_unmap_page(dev->pdev, nvbe->pages[nvbe->nr_pages],
|
||||
PAGE_SIZE, PCI_DMA_BIDIRECTIONAL);
|
||||
}
|
||||
kfree(nvbe->pages);
|
||||
+ kfree(nvbe->ttm_alloced);
|
||||
nvbe->pages = NULL;
|
||||
+ nvbe->ttm_alloced = NULL;
|
||||
nvbe->nr_pages = 0;
|
||||
}
|
||||
}
|
||||
--
|
||||
1.7.3.4
|
||||
|
||||
--- a/arch/x86/xen/setup.c 2011-01-05 00:50:19.000000000 +0000
|
||||
+++ b/arch/x86/xen/setup.c 2011-01-24 20:29:23.000000000 +0000
|
||||
@@ -179,7 +179,10 @@
|
||||
e820.nr_map = 0;
|
||||
xen_extra_mem_start = mem_end;
|
||||
for (i = 0; i < memmap.nr_entries; i++) {
|
||||
- unsigned long long end = map[i].addr + map[i].size;
|
||||
+ unsigned long long end;
|
||||
+ if (map[i].type == E820_RAM)
|
||||
+ map[i].size &= ~(PAGE_SIZE-1);
|
||||
+ end = map[i].addr + map[i].size;
|
||||
|
||||
if (map[i].type == E820_RAM && end > mem_end) {
|
||||
/* RAM off the end - may be partially included */
|
15284
xen.pcifront.next-2.6.38.patch
Normal file
15284
xen.pcifront.next-2.6.38.patch
Normal file
File diff suppressed because it is too large
Load Diff
73
xen.pvhvm.fixes.patch
Normal file
73
xen.pvhvm.fixes.patch
Normal file
@ -0,0 +1,73 @@
|
||||
From 20fddbd4510f3a3888cccc64f89862168a2b7528 Mon Sep 17 00:00:00 2001
|
||||
From: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
Date: Fri, 14 Jan 2011 17:55:44 -0500
|
||||
Subject: [PATCH 1/4] m2p: No need to catch exceptions when we know that there is no RAM
|
||||
|
||||
.. beyound what we think is the end of memory. However there might
|
||||
be more System RAM - but assigned to a guest. Hence jump to the
|
||||
M2P override check and consult.
|
||||
|
||||
Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
---
|
||||
arch/x86/include/asm/xen/page.h | 6 +++++-
|
||||
1 files changed, 5 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
|
||||
index f25bdf2..74a8559 100644
|
||||
--- a/arch/x86/include/asm/xen/page.h
|
||||
+++ b/arch/x86/include/asm/xen/page.h
|
||||
@@ -77,6 +77,10 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
|
||||
if (xen_feature(XENFEAT_auto_translated_physmap))
|
||||
return mfn;
|
||||
|
||||
+ if (unlikely((mfn >> machine_to_phys_order) != 0)) {
|
||||
+ pfn = ~0;
|
||||
+ goto try_override;
|
||||
+ }
|
||||
pfn = 0;
|
||||
/*
|
||||
* The array access can fail (e.g., device space beyond end of RAM).
|
||||
@@ -84,7 +88,7 @@ static inline unsigned long mfn_to_pfn(unsigned long mfn)
|
||||
* but we must handle the fault without crashing!
|
||||
*/
|
||||
__get_user(pfn, &machine_to_phys_mapping[mfn]);
|
||||
-
|
||||
+try_override:
|
||||
/*
|
||||
* If this appears to be a foreign mfn (because the pfn
|
||||
* doesn't map back to the mfn), then check the local override
|
||||
--
|
||||
1.7.3.5
|
||||
|
||||
|
||||
From a89d6bd5cfa1ba3b27d7ba2dc664975a0560fb15 Mon Sep 17 00:00:00 2001
|
||||
From: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
Date: Tue, 25 Jan 2011 12:05:11 +0000
|
||||
Subject: [PATCH 3/4] When destroying mappings between _brk_end and _end, do not go over _end
|
||||
|
||||
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
||||
---
|
||||
arch/x86/mm/init.c | 3 ++-
|
||||
1 files changed, 2 insertions(+), 1 deletions(-)
|
||||
|
||||
diff --git a/arch/x86/mm/init.c b/arch/x86/mm/init.c
|
||||
index 947f42a..c7263c9 100644
|
||||
--- a/arch/x86/mm/init.c
|
||||
+++ b/arch/x86/mm/init.c
|
||||
@@ -291,10 +291,11 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
|
||||
* located on different 2M pages. cleanup_highmap(), however,
|
||||
* can only consider _end when it runs, so destroy any
|
||||
* mappings beyond _brk_end here.
|
||||
+ * Be careful not to go over _end.
|
||||
*/
|
||||
pud = pud_offset(pgd_offset_k(_brk_end), _brk_end);
|
||||
pmd = pmd_offset(pud, _brk_end - 1);
|
||||
- while (++pmd <= pmd_offset(pud, (unsigned long)_end - 1))
|
||||
+ while (++pmd < pmd_offset(pud, (unsigned long)_end))
|
||||
pmd_clear(pmd);
|
||||
}
|
||||
#endif
|
||||
--
|
||||
1.7.3.5
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user