Revision aa76042a016474775ccd187c068669148c30c3bb authored by James Hogan on 27 May 2016, 21:25:23 UTC, committed by Ralf Baechle on 28 May 2016, 10:35:11 UTC
The Hardware page Table Walker (HTW) is being misconfigured on 64-bit
kernels. The PWSize.PS (pointer size) bit determines whether pointers
within directories are loaded as 32-bit or 64-bit addresses, but was
never being set to 1 for 64-bit kernels where the unsigned long in pgd_t
is 64-bits wide.

This actually reduces rather than improves performance when the HTW is
enabled on P6600 since the HTW is initiated lots, but walks are all
aborted due I think to bad intermediate pointers.

Since we were already taking the width of the PTEs into account by
setting PWSize.PTEW, which is the left shift applied to the page table
index *in addition to* the native pointer size, we also need to reduce
PTEW by 1 when PS=1. This is done by calculating PTEW based on the
relative size of pte_t compared to pgd_t.

Finally in order for the HTW to be used when PS=1, the appropriate
XK/XS/XU bits corresponding to the different 64-bit segments need to be
set in PWCtl. We enable only XU for now to enable walking for XUSeg.

Supporting walking for XKSeg would be a bit more involved so is left for
a future patch. It would either require the use of a per-CPU top level
base directory if supported by the HTW (a bit like pgd_current but with
a second entry pointing at swapper_pg_dir), or the HTW would prepend bit
63 of the address to the global directory index which doesn't really
match how we split user and kernel page directories.

Fixes: cab25bc7537b ("MIPS: Extend hardware table walking support to MIPS64")
Signed-off-by: James Hogan <james.hogan@imgtec.com>
Cc: Paul Burton <paul.burton@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/13364/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
1 parent 6446e6c
Raw File
Kconfig
#
#  Quota configuration
#

config QUOTA
	bool "Quota support"
	select QUOTACTL
	select SRCU
	help
	  If you say Y here, you will be able to set per user limits for disk
	  usage (also called disk quotas). Currently, it works for the
	  ext2, ext3, ext4, jfs, ocfs2 and reiserfs file systems.
	  Note that gfs2 and xfs use their own quota system.
	  Ext3, ext4 and reiserfs also support journaled quotas for which
	  you don't need to run quotacheck(8) after an unclean shutdown.
	  For further details, read the Quota mini-HOWTO, available from
	  <http://www.tldp.org/docs.html#howto>, or the documentation provided
	  with the quota tools. Probably the quota support is only useful for
	  multi user systems. If unsure, say N.

config QUOTA_NETLINK_INTERFACE
	bool "Report quota messages through netlink interface"
	depends on QUOTACTL && NET
	help
	  If you say Y here, quota warnings (about exceeding softlimit, reaching
	  hardlimit, etc.) will be reported through netlink interface. If unsure,
	  say Y.

config PRINT_QUOTA_WARNING
	bool "Print quota warnings to console (OBSOLETE)"
	depends on QUOTA
	default y
	help
	  If you say Y here, quota warnings (about exceeding softlimit, reaching
	  hardlimit, etc.) will be printed to the process' controlling terminal.
	  Note that this behavior is currently deprecated and may go away in
	  future. Please use notification via netlink socket instead.

config QUOTA_DEBUG
	bool "Additional quota sanity checks"
	depends on QUOTA
	default n
	help
	  If you say Y here, quota subsystem will perform some additional
	  sanity checks of quota internal structures. If unsure, say N.

# Generic support for tree structured quota files. Selected when needed.
config QUOTA_TREE
	 tristate

config QFMT_V1
	tristate "Old quota format support"
	depends on QUOTA
	help
	  This quota format was (is) used by kernels earlier than 2.4.22. If
	  you have quota working and you don't want to convert to new quota
	  format say Y here.

config QFMT_V2
	tristate "Quota format vfsv0 and vfsv1 support"
	depends on QUOTA
	select QUOTA_TREE
	help
	  This config option enables kernel support for vfsv0 and vfsv1 quota
	  formats. Both these formats support 32-bit UIDs/GIDs and vfsv1 format
	  also supports 64-bit inode and block quota limits. If you need this
	  functionality say Y here.

config QUOTACTL
	bool
	default n

config QUOTACTL_COMPAT
	bool
	depends on QUOTACTL && COMPAT_FOR_U64_ALIGNMENT
	default y
back to top