LinuxPPC-Dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/3] powerpc: sync ppc64, ppc64e and pseries configs
From: Anton Blanchard @ 2013-10-22  0:44 UTC (permalink / raw)
  To: benh, paulus; +Cc: linuxppc-dev


Run savedefconfig over the ppc64, ppc64e and pseries config

Signed-off-by: Anton Blanchard <anton@samba.org>
---

Index: b/arch/powerpc/configs/ppc64_defconfig
===================================================================
--- a/arch/powerpc/configs/ppc64_defconfig
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -2,7 +2,6 @@ CONFIG_PPC64=y
 CONFIG_ALTIVEC=y
 CONFIG_VSX=y
 CONFIG_SMP=y
-CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_IRQ_DOMAIN_DEBUG=y
@@ -25,7 +24,6 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_PARTITION_ADVANCED=y
-CONFIG_EFI_PARTITION=y
 CONFIG_PPC_SPLPAR=y
 CONFIG_SCANLOG=m
 CONFIG_PPC_SMLPAR=y
@@ -50,12 +48,10 @@ CONFIG_CPU_FREQ_PMAC64=y
 CONFIG_HZ_100=y
 CONFIG_BINFMT_MISC=m
 CONFIG_PPC_TRANSACTIONAL_MEM=y
-CONFIG_HOTPLUG_CPU=y
 CONFIG_KEXEC=y
 CONFIG_IRQ_ALL_CPUS=y
 CONFIG_MEMORY_HOTREMOVE=y
 CONFIG_SCHED_SMT=y
-CONFIG_PPC_DENORMALISATION=y
 CONFIG_PCCARD=y
 CONFIG_ELECTRA_CF=y
 CONFIG_HOTPLUG_PCI=y
@@ -89,7 +85,6 @@ CONFIG_NF_CONNTRACK_PPTP=m
 CONFIG_NF_CONNTRACK_SIP=m
 CONFIG_NF_CONNTRACK_TFTP=m
 CONFIG_NF_CT_NETLINK=m
-CONFIG_NETFILTER_TPROXY=m
 CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
 CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
 CONFIG_NETFILTER_XT_TARGET_DSCP=m
@@ -131,7 +126,6 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m
 CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
 CONFIG_NETFILTER_XT_MATCH_U32=m
 CONFIG_NF_CONNTRACK_IPV4=m
-CONFIG_IP_NF_QUEUE=m
 CONFIG_IP_NF_IPTABLES=m
 CONFIG_IP_NF_MATCH_AH=m
 CONFIG_IP_NF_MATCH_ECN=m
@@ -216,6 +210,7 @@ CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
+CONFIG_VHOST_NET=m
 CONFIG_VORTEX=y
 CONFIG_ACENIC=m
 CONFIG_ACENIC_OMIT_TIGON_I=y
@@ -301,7 +296,6 @@ CONFIG_HID_GYRATION=y
 CONFIG_HID_PANTHERLORD=y
 CONFIG_HID_PETALYNX=y
 CONFIG_HID_SAMSUNG=y
-CONFIG_HID_SONY=y
 CONFIG_HID_SUNPLUS=y
 CONFIG_USB_HIDDEV=y
 CONFIG_USB=y
@@ -386,21 +380,19 @@ CONFIG_NLS_UTF8=y
 CONFIG_CRC_T10DIF=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_STACK_USAGE=y
+CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_LOCKUP_DETECTOR=y
 CONFIG_DEBUG_MUTEXES=y
-CONFIG_DEBUG_STACK_USAGE=y
 CONFIG_LATENCYTOP=y
 CONFIG_SCHED_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
-CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_CODE_PATCHING_SELFTEST=y
 CONFIG_FTR_FIXUP_SELFTEST=y
 CONFIG_MSI_BITMAP_SELFTEST=y
 CONFIG_XMON=y
 CONFIG_BOOTX_TEXT=y
 CONFIG_PPC_EARLY_DEBUG=y
-CONFIG_PPC_EARLY_DEBUG_BOOTX=y
-CONFIG_CRYPTO_NULL=m
 CONFIG_CRYPTO_TEST=m
 CONFIG_CRYPTO_PCBC=m
 CONFIG_CRYPTO_HMAC=y
@@ -422,4 +414,3 @@ CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
 CONFIG_VIRTUALIZATION=y
 CONFIG_KVM_BOOK3S_64=m
 CONFIG_KVM_BOOK3S_64_HV=y
-CONFIG_VHOST_NET=m
Index: b/arch/powerpc/configs/ppc64e_defconfig
===================================================================
--- a/arch/powerpc/configs/ppc64e_defconfig
+++ b/arch/powerpc/configs/ppc64e_defconfig
@@ -1,7 +1,6 @@
 CONFIG_PPC64=y
 CONFIG_PPC_BOOK3E_64=y
 CONFIG_SMP=y
-CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_NO_HZ=y
@@ -22,7 +21,6 @@ CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_PARTITION_ADVANCED=y
 CONFIG_MAC_PARTITION=y
-CONFIG_EFI_PARTITION=y
 CONFIG_P5020_DS=y
 CONFIG_CPU_FREQ=y
 CONFIG_CPU_FREQ_GOV_POWERSAVE=y
@@ -61,7 +59,6 @@ CONFIG_NF_CONNTRACK_PPTP=m
 CONFIG_NF_CONNTRACK_SIP=m
 CONFIG_NF_CONNTRACK_TFTP=m
 CONFIG_NF_CT_NETLINK=m
-CONFIG_NETFILTER_TPROXY=m
 CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
 CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
 CONFIG_NETFILTER_XT_TARGET_DSCP=m
@@ -103,7 +100,6 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m
 CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
 CONFIG_NETFILTER_XT_MATCH_U32=m
 CONFIG_NF_CONNTRACK_IPV4=m
-CONFIG_IP_NF_QUEUE=m
 CONFIG_IP_NF_IPTABLES=m
 CONFIG_IP_NF_MATCH_AH=m
 CONFIG_IP_NF_MATCH_ECN=m
@@ -193,7 +189,6 @@ CONFIG_PPP_SYNC_TTY=m
 CONFIG_INPUT_EVDEV=m
 CONFIG_INPUT_MISC=y
 # CONFIG_SERIO_SERPORT is not set
-CONFIG_VT_HW_CONSOLE_BINDING=y
 CONFIG_SERIAL_8250=y
 CONFIG_SERIAL_8250_CONSOLE=y
 # CONFIG_HW_RANDOM is not set
@@ -230,7 +225,6 @@ CONFIG_HID_NTRIG=y
 CONFIG_HID_PANTHERLORD=y
 CONFIG_HID_PETALYNX=y
 CONFIG_HID_SAMSUNG=y
-CONFIG_HID_SONY=y
 CONFIG_HID_SUNPLUS=y
 CONFIG_HID_GREENASIA=y
 CONFIG_HID_SMARTJOYPLUS=y
@@ -302,19 +296,18 @@ CONFIG_NLS_UTF8=y
 CONFIG_CRC_T10DIF=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_KERNEL=y
+CONFIG_DEBUG_STACK_USAGE=y
+CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_DETECT_HUNG_TASK=y
 CONFIG_DEBUG_MUTEXES=y
-CONFIG_DEBUG_STACK_USAGE=y
 CONFIG_LATENCYTOP=y
 CONFIG_IRQSOFF_TRACER=y
 CONFIG_SCHED_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
-CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_CODE_PATCHING_SELFTEST=y
 CONFIG_FTR_FIXUP_SELFTEST=y
 CONFIG_MSI_BITMAP_SELFTEST=y
 CONFIG_XMON=y
-CONFIG_CRYPTO_NULL=m
 CONFIG_CRYPTO_TEST=m
 CONFIG_CRYPTO_CCM=m
 CONFIG_CRYPTO_GCM=m
Index: b/arch/powerpc/configs/pseries_defconfig
===================================================================
--- a/arch/powerpc/configs/pseries_defconfig
+++ b/arch/powerpc/configs/pseries_defconfig
@@ -3,7 +3,6 @@ CONFIG_ALTIVEC=y
 CONFIG_VSX=y
 CONFIG_SMP=y
 CONFIG_NR_CPUS=2048
-CONFIG_EXPERIMENTAL=y
 CONFIG_SYSVIPC=y
 CONFIG_POSIX_MQUEUE=y
 CONFIG_AUDIT=y
@@ -33,7 +32,6 @@ CONFIG_MODULE_UNLOAD=y
 CONFIG_MODVERSIONS=y
 CONFIG_MODULE_SRCVERSION_ALL=y
 CONFIG_PARTITION_ADVANCED=y
-CONFIG_EFI_PARTITION=y
 CONFIG_PPC_SPLPAR=y
 CONFIG_SCANLOG=m
 CONFIG_PPC_SMLPAR=y
@@ -44,7 +42,6 @@ CONFIG_IBMEBUS=y
 CONFIG_HZ_100=y
 CONFIG_BINFMT_MISC=m
 CONFIG_PPC_TRANSACTIONAL_MEM=y
-CONFIG_HOTPLUG_CPU=y
 CONFIG_KEXEC=y
 CONFIG_IRQ_ALL_CPUS=y
 CONFIG_MEMORY_HOTPLUG=y
@@ -52,7 +49,6 @@ CONFIG_MEMORY_HOTREMOVE=y
 CONFIG_PPC_64K_PAGES=y
 CONFIG_PPC_SUBPAGE_PROT=y
 CONFIG_SCHED_SMT=y
-CONFIG_PPC_DENORMALISATION=y
 CONFIG_HOTPLUG_PCI=y
 CONFIG_HOTPLUG_PCI_RPA=m
 CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
@@ -113,7 +109,6 @@ CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
 CONFIG_NETFILTER_XT_MATCH_TIME=m
 CONFIG_NETFILTER_XT_MATCH_U32=m
 CONFIG_NF_CONNTRACK_IPV4=m
-CONFIG_IP_NF_QUEUE=m
 CONFIG_IP_NF_IPTABLES=m
 CONFIG_IP_NF_MATCH_AH=m
 CONFIG_IP_NF_MATCH_ECN=m
@@ -179,6 +174,7 @@ CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
+CONFIG_VHOST_NET=m
 CONFIG_VORTEX=y
 CONFIG_ACENIC=m
 CONFIG_ACENIC_OMIT_TIGON_I=y
@@ -237,7 +233,6 @@ CONFIG_HID_GYRATION=y
 CONFIG_HID_PANTHERLORD=y
 CONFIG_HID_PETALYNX=y
 CONFIG_HID_SAMSUNG=y
-CONFIG_HID_SONY=y
 CONFIG_HID_SUNPLUS=y
 CONFIG_USB_HIDDEV=y
 CONFIG_USB=y
@@ -314,18 +309,17 @@ CONFIG_NLS_UTF8=y
 CONFIG_CRC_T10DIF=y
 CONFIG_MAGIC_SYSRQ=y
 CONFIG_DEBUG_KERNEL=y
-CONFIG_LOCKUP_DETECTOR=y
 CONFIG_DEBUG_STACK_USAGE=y
+CONFIG_DEBUG_STACKOVERFLOW=y
+CONFIG_LOCKUP_DETECTOR=y
 CONFIG_LATENCYTOP=y
 CONFIG_SCHED_TRACER=y
 CONFIG_BLK_DEV_IO_TRACE=y
-CONFIG_DEBUG_STACKOVERFLOW=y
 CONFIG_CODE_PATCHING_SELFTEST=y
 CONFIG_FTR_FIXUP_SELFTEST=y
 CONFIG_MSI_BITMAP_SELFTEST=y
 CONFIG_XMON=y
 CONFIG_XMON_DEFAULT=y
-CONFIG_CRYPTO_NULL=m
 CONFIG_CRYPTO_TEST=m
 CONFIG_CRYPTO_PCBC=m
 CONFIG_CRYPTO_HMAC=y
@@ -347,4 +341,3 @@ CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
 CONFIG_VIRTUALIZATION=y
 CONFIG_KVM_BOOK3S_64=m
 CONFIG_KVM_BOOK3S_64_HV=y
-CONFIG_VHOST_NET=m

^ permalink raw reply

* [PATCH 2/3] powerpc: Enable multipath modules on ppc64 and pseries
From: Anton Blanchard @ 2013-10-22  0:45 UTC (permalink / raw)
  To: benh, paulus; +Cc: linuxppc-dev
In-Reply-To: <20131022114450.296ae01d@kryten>


Enable a few modules required to boot on a POWER multipath
box.

Signed-off-by: Anton Blanchard <anton@samba.org>
---

Index: b/arch/powerpc/configs/pseries_defconfig
===================================================================
--- a/arch/powerpc/configs/pseries_defconfig
+++ b/arch/powerpc/configs/pseries_defconfig
@@ -152,6 +152,9 @@ CONFIG_SCSI_IPR=y
 CONFIG_SCSI_QLA_FC=m
 CONFIG_SCSI_QLA_ISCSI=m
 CONFIG_SCSI_LPFC=m
+CONFIG_SCSI_DH=m
+CONFIG_SCSI_DH_RDAC=m
+CONFIG_SCSI_DH_ALUA=m
 CONFIG_ATA=y
 # CONFIG_ATA_SFF is not set
 CONFIG_MD=y
@@ -169,6 +172,9 @@ CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
 CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_QL=m
+CONFIG_DM_MULTIPATH_ST=m
+CONFIG_DM_UEVENT=y
 CONFIG_BONDING=m
 CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
Index: b/arch/powerpc/configs/ppc64_defconfig
===================================================================
--- a/arch/powerpc/configs/ppc64_defconfig
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -179,6 +179,9 @@ CONFIG_SCSI_IPR=y
 CONFIG_SCSI_QLA_FC=m
 CONFIG_SCSI_QLA_ISCSI=m
 CONFIG_SCSI_LPFC=m
+CONFIG_SCSI_DH=m
+CONFIG_SCSI_DH_RDAC=m
+CONFIG_SCSI_DH_ALUA=m
 CONFIG_ATA=y
 CONFIG_SATA_SIL24=y
 CONFIG_SATA_SVW=y
@@ -197,6 +200,9 @@ CONFIG_DM_SNAPSHOT=m
 CONFIG_DM_MIRROR=m
 CONFIG_DM_ZERO=m
 CONFIG_DM_MULTIPATH=m
+CONFIG_DM_MULTIPATH_QL=m
+CONFIG_DM_MULTIPATH_ST=m
+CONFIG_DM_UEVENT=y
 CONFIG_ADB_PMU=y
 CONFIG_PMAC_SMU=y
 CONFIG_THERM_PM72=y

^ permalink raw reply

* [PATCH 3/3] powerpc: Enable virtio on ppc64 and pseries configs
From: Anton Blanchard @ 2013-10-22  0:46 UTC (permalink / raw)
  To: benh, paulus; +Cc: linuxppc-dev
In-Reply-To: <20131022114450.296ae01d@kryten>


Signed-off-by: Anton Blanchard <anton@samba.org>
---

Index: b/arch/powerpc/configs/pseries_defconfig
===================================================================
--- a/arch/powerpc/configs/pseries_defconfig
+++ b/arch/powerpc/configs/pseries_defconfig
@@ -127,6 +127,7 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=65536
+CONFIG_VIRTIO_BLK=m
 CONFIG_IDE=y
 CONFIG_BLK_DEV_IDECD=y
 CONFIG_BLK_DEV_GENERIC=y
@@ -152,6 +153,7 @@ CONFIG_SCSI_IPR=y
 CONFIG_SCSI_QLA_FC=m
 CONFIG_SCSI_QLA_ISCSI=m
 CONFIG_SCSI_LPFC=m
+CONFIG_SCSI_VIRTIO=m
 CONFIG_SCSI_DH=m
 CONFIG_SCSI_DH_RDAC=m
 CONFIG_SCSI_DH_ALUA=m
@@ -180,6 +182,7 @@ CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
+CONFIG_VIRTIO_NET=m
 CONFIG_VHOST_NET=m
 CONFIG_VORTEX=y
 CONFIG_ACENIC=m
@@ -218,6 +221,7 @@ CONFIG_SERIAL_JSM=m
 CONFIG_HVC_CONSOLE=y
 CONFIG_HVC_RTAS=y
 CONFIG_HVCS=m
+CONFIG_VIRTIO_CONSOLE=m
 CONFIG_IBM_BSR=m
 CONFIG_GEN_RTC=y
 CONFIG_RAW_DRIVER=y
@@ -259,6 +263,8 @@ CONFIG_INFINIBAND_IPOIB=m
 CONFIG_INFINIBAND_IPOIB_CM=y
 CONFIG_INFINIBAND_SRP=m
 CONFIG_INFINIBAND_ISER=m
+CONFIG_VIRTIO_PCI=m
+CONFIG_VIRTIO_BALLOON=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y
Index: b/arch/powerpc/configs/ppc64_defconfig
===================================================================
--- a/arch/powerpc/configs/ppc64_defconfig
+++ b/arch/powerpc/configs/ppc64_defconfig
@@ -151,6 +151,7 @@ CONFIG_BLK_DEV_LOOP=y
 CONFIG_BLK_DEV_NBD=m
 CONFIG_BLK_DEV_RAM=y
 CONFIG_BLK_DEV_RAM_SIZE=65536
+CONFIG_VIRTIO_BLK=m
 CONFIG_IDE=y
 CONFIG_BLK_DEV_IDECD=y
 CONFIG_BLK_DEV_GENERIC=y
@@ -179,6 +180,7 @@ CONFIG_SCSI_IPR=y
 CONFIG_SCSI_QLA_FC=m
 CONFIG_SCSI_QLA_ISCSI=m
 CONFIG_SCSI_LPFC=m
+CONFIG_SCSI_VIRTIO=m
 CONFIG_SCSI_DH=m
 CONFIG_SCSI_DH_RDAC=m
 CONFIG_SCSI_DH_ALUA=m
@@ -216,6 +218,7 @@ CONFIG_DUMMY=m
 CONFIG_NETCONSOLE=y
 CONFIG_NETPOLL_TRAP=y
 CONFIG_TUN=m
+CONFIG_VIRTIO_NET=m
 CONFIG_VHOST_NET=m
 CONFIG_VORTEX=y
 CONFIG_ACENIC=m
@@ -263,6 +266,7 @@ CONFIG_HVC_CONSOLE=y
 CONFIG_HVC_RTAS=y
 CONFIG_HVC_BEAT=y
 CONFIG_HVCS=m
+CONFIG_VIRTIO_CONSOLE=m
 CONFIG_IBM_BSR=m
 CONFIG_RAW_DRIVER=y
 CONFIG_I2C_CHARDEV=y
@@ -328,6 +332,8 @@ CONFIG_EDAC_MM_EDAC=y
 CONFIG_EDAC_PASEMI=y
 CONFIG_RTC_CLASS=y
 CONFIG_RTC_DRV_DS1307=y
+CONFIG_VIRTIO_PCI=m
+CONFIG_VIRTIO_BALLOON=m
 CONFIG_EXT2_FS=y
 CONFIG_EXT2_FS_XATTR=y
 CONFIG_EXT2_FS_POSIX_ACL=y

^ permalink raw reply

* RE: [alsa-devel] [PATCHv1 1/8] ALSA: Add SAI SoC Digital Audio Interface driver.
From: Xiubo Li-B47053 @ 2013-10-22  2:20 UTC (permalink / raw)
  To: Lars-Peter Clausen
  Cc: mark.rutland@arm.com, alsa-devel@alsa-project.org,
	linux-doc@vger.kernel.org, tiwai@suse.de, Wang Huan-B18965,
	timur@tabi.org, linux-kernel@vger.kernel.org, Guo Shawn-R65073,
	LW@KARO-electronics.de, linux@arm.linux.org.uk,
	Chen Guangyu-B42378, oskar@scara.com, grant.likely@linaro.org,
	devicetree@vger.kernel.org, ian.campbell@citrix.com,
	pawel.moll@arm.com, swarren@wwwdotorg.org,
	rob.herring@calxeda.com, broonie@kernel.org,
	linux-arm-kernel@lists.infradead.org, Estevam Fabio-R49496,
	lgirdwood@gmail.com, rob@landley.net, Jin Zhengxiong-R64188,
	shawn.guo@linaro.org, linuxppc-dev@lists.ozlabs.org
In-Reply-To: <526021B0.6050206@metafoo.de>


> > +static int fsl_sai_probe(struct platform_device *pdev) {
> [...]
> > +
> > +	sai->dma_params_rx.addr =3D res->start + SAI_RDR;
> > +	sai->dma_params_rx.maxburst =3D 6;
> > +	index =3D of_property_match_string(np, "dma-names", "rx");
> > +	ret =3D of_parse_phandle_with_args(np, "dmas", "#dma-cells", index,
> > +				&dma_args);
> > +	if (ret)
> > +		return ret;
> > +	sai->dma_params_rx.slave_id =3D dma_args.args[1];
> > +
> > +	sai->dma_params_tx.addr =3D res->start + SAI_TDR;
> > +	sai->dma_params_tx.maxburst =3D 6;
> > +	index =3D of_property_match_string(np, "dma-names", "tx");
> > +	ret =3D of_parse_phandle_with_args(np, "dmas", "#dma-cells", index,
> > +				&dma_args);
> > +	if (ret)
> > +		return ret;
> > +	sai->dma_params_tx.slave_id =3D dma_args.args[1];
>=20
> The driver should not have to manually parse the dma devicetree
> properties, this is something that should be handled by the dma engine
> driver.
>=20

Yes, the dma engine interface has already parsed the slave_id while
the dma customer requesting one dma channel.

Though this also could be a way to pass the slave_id to dma driver, but the=
=20
dma driver uses the way while requesting dma channels.

So I'll drop this code later.

^ permalink raw reply

* RE: [PATCH v5] powerpc/mpc85xx: Update the clock nodes in device tree
From: Tang Yuantian-B29983 @ 2013-10-22  3:19 UTC (permalink / raw)
  To: Mark Rutland
  Cc: devicetree@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	Li Yang-Leo-R58472
In-Reply-To: <20131021091448.GA6435@kartoffel>

VGhhbmtzIGZvciB5b3VyIHJldmlldy4NCg0KPiAtLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0K
PiBGcm9tOiBNYXJrIFJ1dGxhbmQgW21haWx0bzptYXJrLnJ1dGxhbmRAYXJtLmNvbV0NCj4gU2Vu
dDogMjAxM+W5tDEw5pyIMjHml6Ug5pif5pyf5LiAIDE3OjE1DQo+IFRvOiBUYW5nIFl1YW50aWFu
LUIyOTk4Mw0KPiBDYzogZ2FsYWtAa2VybmVsLmNyYXNoaW5nLm9yZzsgbGludXhwcGMtZGV2QGxp
c3RzLm96bGFicy5vcmc7DQo+IGRldmljZXRyZWVAdmdlci5rZXJuZWwub3JnOyBMaSBZYW5nLUxl
by1SNTg0NzINCj4gU3ViamVjdDogUmU6IFtQQVRDSCB2NV0gcG93ZXJwYy9tcGM4NXh4OiBVcGRh
dGUgdGhlIGNsb2NrIG5vZGVzIGluIGRldmljZQ0KPiB0cmVlDQo+IA0KPiBPbiBTYXQsIE9jdCAx
MiwgMjAxMyBhdCAwNDo0MDowNkFNICswMTAwLCBUYW5nIFl1YW50aWFuLUIyOTk4MyB3cm90ZToN
Cj4gPiBUaGFua3MgZm9yIHlvdXIgcmV2aWV3Lg0KPiA+DQo+ID4gPg0KPiA+ID4gPg0KPiA+ID4g
PiA+ID4gKy0gcmVnOiBPZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgY2xvY2sgcmVnaXN0ZXIgc2V0
DQo+ID4gPiA+ID4gPiArLSBjbG9jay1mcmVxdWVuY3k6IEluZGljYXRlcyBpbnB1dCBjbG9jayBm
cmVxdWVuY3kgb2YgY2xvY2sNCj4gYmxvY2suDQo+ID4gPiA+ID4gPiArICAgICAgIFdpbGwgYmUg
c2V0IGJ5IHUtYm9vdA0KPiA+ID4gPiA+DQo+ID4gPiA+ID4gV2h5IGRvZXMgdGhlIGZhY3QgdGhp
cyBpcyBzZXQgYnkgdS1ib290IG1hdHRlciB0byB0aGUgYmluZGluZz8NCj4gPiA+ID4gPg0KPiA+
ID4gPiBPSywgSSB3aWxsIHJlbW92ZSBpdC4NCj4gPiA+ID4NCj4gPiA+ID4gPiA+ICsNCj4gPiA+
ID4gPiA+ICtSZWNvbW1lbmRlZCBwcm9wZXJ0aWVzOg0KPiA+ID4gPiA+ID4gKy0gI2RkcmVzcy1j
ZWxsczogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgdXNlZCB0bw0KPiByZXByZXNlbnQN
Cj4gPiA+ID4gPiA+ICsgICAgICAgcGh5c2ljYWwgYmFzZSBhZGRyZXNzZXMuICBNdXN0IGJlIHBy
ZXNlbnQgaWYgdGhlIGRldmljZQ0KPiBoYXMNCj4gPiA+ID4gPiA+ICsgICAgICAgc3ViLW5vZGVz
IGFuZCBzZXQgdG8gMSBpZiBwcmVzZW50DQo+ID4gPiA+ID4NCj4gPiA+ID4gPiBUeXBvOiAjYWRk
cmVzcy1jZWxscw0KPiA+ID4gPiA+DQo+ID4gPiA+ID4gSW4gdGhlIGV4YW1wbGUgaXQgbG9va3Mg
bGlrZSB0aGUgYWRkcmVzcyBjZWxscyBvZiBjaGlsZCBub2Rlcw0KPiA+ID4gPiA+IGFyZSBvZmZz
ZXRzIHdpdGhpbiB0aGUgdW5pdCwgcmF0aGVyIHRoYW4gYWJzb2x1dGUgcGh5c2ljYWwNCj4gYWRk
cmVzc2VzLg0KPiA+ID4gPiA+IENvdWxkIHRoZSBjb2RlIG5vdCB0cmVhdCB0aGVtIGFzIGFic29s
dXRlIGFkZHJlc3Nlcz8gVGhlbiB3ZSdkDQo+ID4gPiA+ID4gb25seSBuZWVkIHRvIGRvY3VtZW50
IHRoYXQgI2FkZHJlc3MtY2VsbHMsICNzaXplLWNlbGxzIGFuZA0KPiA+ID4gPiA+IHJhbmdlcyBt
dXN0IGJlIHByZXNlbnQgYW5kIGhhdmUgdmFsdWVzIHN1aXRhYmxlIGZvciBtYXBwaW5nDQo+ID4g
PiA+ID4gY2hpbGQgbm9kZXMgaW50byB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcGFyZW50Lg0K
PiA+ID4gPiA+DQo+ID4gPiA+IE9LLCB0aGFua3MuDQo+ID4gPiA+DQo+ID4gPiA+ID4gPiArLSAj
c2l6ZS1jZWxsczogU3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgY2VsbHMgdXNlZCB0byByZXByZXNl
bnQNCj4gPiA+ID4gPiA+ICsgICAgICAgdGhlIHNpemUgb2YgYW4gYWRkcmVzcy4gTXVzdCBiZSBw
cmVzZW50IGlmIHRoZSBkZXZpY2UNCj4gaGFzDQo+ID4gPiA+ID4gPiArICAgICAgIHN1Yi1ub2Rl
cyBhbmQgc2V0IHRvIDEgaWYgcHJlc2VudA0KPiA+ID4gPiA+DQo+ID4gPiA+ID4gSXQncyBub3Qg
cmVhbGx5IHRoZSBzaXplIG9mIGFuIGFkZHJlc3MsIGl0J3MgdGhlIHNpemUgb2YgYQ0KPiA+ID4g
PiA+IHJlZ2lvbiBpZGVudGlmaWVkIGJ5IGEgcmVnIGVudHJ5Lg0KPiA+ID4gPiA+DQo+ID4gPiA+
ID4gSSB0aGluayB0aGlzIGNhbiBiZSBzaW1wbGlmaWVkIGJ5IG15IHN1Z2dlc3Rpb24gYWJvdmUu
DQo+ID4gPiA+ID4NCj4gPiA+ID4gWWVzDQo+ID4gPg0KPiA+ID4gQWFoLCBJIHNlZSB0aGF0IHRo
aXMgaXMgYWxyZWFkeSBpbiB1c2UsIHNvIGl0J3MgYSBiaXQgbGF0ZSB0byBjaGFuZ2UNCj4gPiA+
IHRoaXMuLi4NCj4gPiA+DQo+ID4gSSB3aWxsIG1vZGlmeSB0aGUgZHJpdmVyIGFueXdheSBvbmNl
IHRoZSBiaW5kaW5nIGdldHMgZG9uZS4NCj4gDQo+IFdvbid0IHRoaXMgYnJlYWsgZXhpc3Rpbmcg
dXNlcnMgRFRCcz8NCj4gDQpUaGlzIGJpbmRpbmcgYW5kIERUIHNob3VsZCBiZSBtZXJnZWQgZmly
c3QuIA0KRm9yIHNvbWUgcmVhc29ucywgdGhlIGRyaXZlciBoYXMgYWxyZWFkeSBiZWVuIG1lcmdl
ZC4NCg0KPiA+DQo+ID4gPiA+DQo+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiArMi4gQ2xvY2sg
UHJvdmlkZXIvQ29uc3VtZXIgQmluZGluZw0KPiA+ID4gPiA+ID4gKw0KPiA+ID4gPiA+ID4gK01v
c3Qgb2YgdGhlIGJpbmRpbmcgYXJlIGZyb20gdGhlIGNvbW1vbiBjbG9jayBiaW5kaW5nWzFdLg0K
PiA+ID4gPiA+ID4gKyBbMV0NCj4gPiA+ID4gPiA+ICtEb2N1bWVudGF0aW9uL2RldmljZXRyZWUv
YmluZGluZ3MvY2xvY2svY2xvY2stYmluZGluZ3MudHh0DQo+ID4gPiA+ID4gPiArDQo+ID4gPiA+
ID4gPiArUmVxdWlyZWQgcHJvcGVydGllczoNCj4gPiA+ID4gPiA+ICstIGNvbXBhdGlibGUgOiBT
aG91bGQgaW5jbHVkZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nOg0KPiA+ID4NCj4gPiA+
IEkgZGlkbid0IHNwb3QgdGhpcyBlYXJsaWVyLCBidXQgd2h5ICJvbmUgb3IgbW9yZSI/IGFyZSB0
aGUgMi4wDQo+ID4gPiB2YXJpYW50cyBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIHRoZSAxLjAg
dmFyaWFudHMuDQo+ID4gPg0KPiA+IE9uZSBvciBtb3JlIGZvciBmaXhlZC1jbG9jayB3aGljaCBp
cyBjb21wYXRpYmxlIHdpdGggcW9yaXEtc3lzY2xrLSouDQo+IA0KPiBUaGlzIG1heSBiZSBzb21l
d2hhdCBwZWRhbnRpYywgYnV0IGFuIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBwbHVzIGZpeGVkLQ0K
PiBjbG9jayBpc24ndCBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nLiBJdCdzIG9uZSBvZiB0
aGUgZm9sbG93aW5nIHBsdXMNCj4gZml4ZWQtY2xvY2suDQo+IA0KPiBJdCBtYXkgYmUgYmV0dGVy
IHRvIGV4cGxpY2l0bHkgc3RhdGUgdGhhdCB0aGUgY29tcGF0aWJsZSBsaXN0IG11c3QNCj4gaW5j
bHVkZSBvbmUgb2YgdGhlIGZvbGxvd2luZywgcGx1cyBmaXhlZC1jbG9jay4NCj4gDQpTaW5jZSB0
aGUgcW9yaXEtc3lzY2xrLSogaXMgbm90IDEwMCUgY29tcGF0aWJsZSB3aXRoIGZpeGVkLWNsb2Nr
KG5vIGNsb2NrLWZyZXF1ZW5jeSBwcm9wZXJ0eSksDQpJIHdpbGwgcmVtb3ZlIGZpeGVkLWNsb2Nr
Lg0KDQo+ID4NCj4gPiA+ID4gPiA+ICsgICAgICAgLSAiZnNsLHFvcmlxLWNvcmUtcGxsLVsxLDJd
LngiOiBJbmRpY2F0ZXMgYSBjb3JlIFBMTA0KPiA+ID4gPiA+ID4gKyBjbG9jaw0KPiA+ID4gPiA+
IGRldmljZQ0KPiA+ID4gPiA+ID4gKyAgICAgICAtICJmc2wscW9yaXEtY29yZS1tdXgtWzEsMl0u
eCI6IEluZGljYXRlcyBhIGNvcmUNCj4gPiA+ID4gPiA+ICsgbXVsdGlwbGV4ZXINCj4gPiA+ID4g
PiBjbG9jaw0KPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgIGRldmljZTsgZGl2aWRlZCBmcm9t
IHRoZSBjb3JlIFBMTCBjbG9jaw0KPiA+ID4gPiA+DQo+ID4gPiA+ID4gQXMgYWJvdmUsIEknZCBw
cmVmZXIgYSBjb21wbGV0ZSBsaXN0IG9mIHRoZSBiYXNpYyBzdHJpbmdzIHdlDQo+IGV4cGVjdC4N
Cj4gPiA+ID4gPg0KPiA+ID4gPiBUaGVyZSBpcyBubyBsaXN0IGhlcmUsIGp1c3QgKi1tdXgtMS54
IGFuZCAqLW11eC0yLnggV2hhdCBraW5kIG9mDQo+ID4gPiA+IGxpc3QgZG8geW91IHByZWZlcj8N
Cj4gPiA+DQo+ID4gPiBTb21ldGhpbmcgbGlrZToNCj4gPiA+DQo+ID4gPiAtIGNvbXBhdGlibGU6
IFNob3VsZCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvZjoNCj4gPiA+ICAgICAqICJmc2wscW9yaXEt
Y29yZS1wbGwtMS4wIiBmb3IgY29yZSBQTEwgY2xvY2tzICh2MS4wKQ0KPiA+ID4gICAgICogImZz
bCxxb3JpcS1jb3JlLXBsbC0yLjAiIGZvciBjb3JlIFBMTCBjbG9ja3MgKHYyLjApDQo+ID4gPiAg
ICAgKiAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCIgZm9yIGNvcmUgbXV4IGNsb2NrcyAodjEuMCkN
Cj4gPiA+ICAgICAqICJmc2wscW9yaXEtY29yZS1tdXgtMi4wIiBmb3IgY29yZSBtdXggY2xvY2tz
ICh2Mi4wKQ0KPiA+ID4gICBUaGUgKi0yLjAgdmFyaWFudHMgYXJlIGJhY2t3YXJkcyBjb21wYXRp
YmxlIHdpdGggdGhlICotMS4wIHZhcmlhbnRzLA0KPiA+ID4gICBzbyBmb3IgY29tcGF0aWJsaXR5
IGEgKi0xLjAgdmFyaWFudCBzdHJpbmcgc2hvdWxkIGJlIGluIHRoZSBsaXN0Lg0KPiA+ID4NCj4g
PiBTZWUgdGhlIGNvbW1lbnQgYnkgU2NvdHQgd29vZC4NCj4gDQo+IE9LLiBUaGUgbm90ZSBhdCB0
aGUgYm90dG9tIGNuYSBnbywgYnV0IEknZCBzdGlsbCBwcmVmZXIgYW4gZXhwbGljaXQgbGlzdA0K
PiB3aXRoIGEgZGVzY3JpcHRpb24gb2YgZWFjaCBlbnRyeS4NCj4gDQpPSywgd2lsbCBnaXZlIGEg
bGlzdCBmb3IgdGhlbS4NCg0KPiA+DQo+ID4gPiA+DQo+ID4gPiA+ID4gPiArICAgICAgIC0gImZp
eGVkLWNsb2NrIjogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZzsgaW5kaWNhdGVzDQo+ID4gPiA+
ID4gPiArIG91dHB1dA0KPiA+ID4gPiA+IGNsb2NrDQo+ID4gPiA+ID4gPiArICAgICAgICAgICAg
ICAgb2Ygb3NjaWxsYXRvcg0KPiA+ID4gPiA+ID4gKyAgICAgICAtICJmc2wscW9yaXEtc3lzY2xr
LVsxLDJdLngiOiBJbmRpY2F0ZXMgaW5wdXQgc3lzdGVtDQo+ID4gPiA+ID4gPiArIGNsb2NrDQo+
ID4gPiA+ID4NCj4gPiA+ID4gPiBIZXJlIHRvby4NCj4gPiA+ID4gPg0KPiA+ID4gPiA+ID4gKy0g
I2Nsb2NrLWNlbGxzOiBGcm9tIGNvbW1vbiBjbG9jayBiaW5kaW5nOyBpbmRpY2F0ZXMgdGhlDQo+
IG51bWJlciBvZg0KPiA+ID4gPiA+ID4gKyAgICAgICBvdXRwdXQgY2xvY2suIDAgaXMgZm9yIG9u
ZSBvdXRwdXQgY2xvY2s7IDEgZm9yIG1vcmUNCj4gPiA+ID4gPiA+ICt0aGFuIG9uZSBjbG9jaw0K
PiA+ID4gPiA+DQo+ID4gPiA+ID4gSWYgYSBjbG9jayBzb3VyY2UgaGFzIG11bHRpcGxlIG91dHB1
dHMsIHdoYXQgdGhvc2Ugb3V0cHV0cyBhcmUNCj4gPiA+ID4gPiBhbmQgd2hhdCB2YWx1ZXMgaW4g
Y2xvY2stY2VsbHMgdGhleSBjb3JyZXNwb25kIHRvIHNob3VsZCBiZQ0KPiA+ID4gPiA+IGRlc2Ny
aWJlZA0KPiA+ID4gaGVyZS4NCj4gPiA+ID4gPg0KPiA+ID4gPiBUaGVyZSBpcyBubyB3YXkgdG8g
ZGVzY3JpYmUgdGhlIHZhbHVlcyBvZiBtdWx0aXBsZSBvdXRwdXRzIGhlcmUuDQo+ID4gPiA+IFRo
aXMgcHJvcGVydHkgaXMgdGhlIHR5cGUgb2YgQk9PTC4gU2VlIHRoZSBjbG9jay1iaW5kaW5ncy50
eHQuDQo+ID4gPg0KPiA+ID4gU29ycnk/ICNjbG9jay1jZWxscyBpcyBtb3N0IGRlZmluaXRlbHkg
X25vdF8gYSBib29sOg0KPiA+ID4NCj4gPiBBQ1RzIGxpa2UgYm9vbC4NCj4gDQo+IE5vIGl0IGRv
ZXMgbm90IGFjdCBsaWtlIGJvbywgYSBuZCBvbmx5IGFwcGVhcnMgdG8gaWYgeW91IGRvIG5vdCBj
b25zaWRlcg0KPiB0aGUgZ2VuZXJhbCBjYXNlbC4gSW4gZ2VuZXJhbCAjY2xvY2stY2VsbHMgY291
bGQgYmUgYW55IGFyYml0cmFyaWx5IGxhcmdlDQo+IG51bWJlciwgbm90IGp1c3QgPDA+IG9yIDwx
Pi4gSXQgcmVwcmVzZW50cyB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIGENCj4gY2xvY2stc3BlY2lm
aWVyLCBub3Qgc2ltcGx5IHRoYXQgdGhlcmUgaXMgYSBjbG9jay1zcGVjaWZpZXIuDQo+IA0KPiBJ
dCdzIHBlcmZlY3RseSBwb3NzaWJsZSB0byBoYXZlICNjbG9jay1jZWxscyA9IDwyPiwgb3IgbW9y
ZS4gSXQnDQo+IHBlcmZlY3RseSBwb3NzaWJsZSB0byBoYXZlIGEgRFQgbGlrZSB0aGUgYmVsb3cg
KHdpdGggc29tZSBwcm9wZXJ0aWVzDQo+IG9taXR0ZWQgZm9yDQo+IGJyZXZpdHkpOg0KPiANCj4g
ICBjbGtfMjogc29tZS1jbG9jayB7DQo+ICAgICAgICAgICBjb21wYXRpYmxlID0gInZlbmRvcixi
YW5rZWQtY2xvY2siOw0KPiAgICAgICAgICAgI2Nsb2NrLWNlbGxzID0gPDI+Ow0KPiAgIH07DQo+
IA0KPiAgIGNsa181OiBvdGhlci1jbG9jayB7DQo+ICAgICAgICAgICAjY2xvY2stY2VsbHMgPSA8
NT47DQo+ICAgfTsNCj4gDQo+ICAgY2xrXzA6IGFub3RoZXItY2xvY2sgew0KPiAgICAgICAgICAg
I2Nsb2NrLWNlbGxzID0gPDA+Ow0KPiAgIH07DQo+IA0KPiAgIGNvbnN1bWVyIHsNCj4gICAgICAg
ICAgIGNsb2NrcyA9IDwmY2xrNSAwIDE3IDUzIDkxIDA+LA0KPiAgICAgICAgICAgICAgICAgICAg
PCZjbGtfMD4sDQo+ICAgICAgICAgICAgICAgICAgICA8JmNsazIgMyAxNz47DQo+ICAgfTsNCj4g
DQo+IEluIGFsbCBvZiB0aGVzZSBjYXNlcywgdGhlIGNlbGxzIGluIHRoZSBjbG9jay1zcGVjaWZp
ZXIgbXVzdCBtZWFuDQo+IHNvbWV0aGluZy4NCj4gVGhleSB1bmlxdWVseSBpZGVudGlmeSBhIGNs
b2NrIG91dHB1dCBvZiB0aGUgY2xvY2sgcHJvdmlkZXIsIGFuZCB0aGVyZQ0KPiBtdXN0IGJlIGEg
d2F5IG9mIG1hcHBpbmcgdGhlbSB0byBhIHBhcnRpY3VsYXIgY2xvY2suDQo+IA0KPiBUaGUgbWVh
bmluZyBvZiB0aGUgY2VsbHMgaW4gdGhlIGNsb2NrIHNwZWNpZmllciBzaG91bGQgYmUgc3BlY2lm
aWVkLg0KPiBDb25zaWRlciAidmVuZG9yLGJhbmtlZC1jbG9jayIuIEl0J3MgYmluZGluZyBjb3Vs
ZCBsb29rIHNvbWV0aGluZyBsaWtlOg0KPiANCj4gICAtIGNvbXBhdGlibGU6IHNob3VsZCBjb250
YWluDQo+ICAgICAgICogInZlbmRvcixiYW5rZWQtY2xvY2siIGZvciB2MSBiYW5rZWQgY2xvY2sg
ZGVzaWducw0KPiAgIC0gI2Nsb2NrLWNlbGxzOiBTaG91bGQgYmUgPDI+DQo+ICAgICAgICogVGhl
IGZpcnN0IGNlbGwgc2VsZWN0cyB0aGUgaW50ZXJuYWwgY2xvY2sgYmFuaywgaW5kZXhlZCBbMSwz
XQ0KPiAgICAgICAqIFRoZSBzZWNvbmQgY2VsbCBzZWxlY3RzIGEgY2xvY2sgd2l0aGluIHRoZSBi
YW5rLCBpbmRleGVkIFswLDI1XQ0KPiANCj4gQSBjbG9jayBtaWdodCBoYXZlIGEgc2V0IG9mIG5h
bWVkIG91dHB1dHM6DQo+IA0KPiAgIC0gI2Nsb2NrLWNlbGxzOiBzaG91bGQgYmUgPDE+LCBhIHNp
bmdsZSBjZWxsIHdoaWNoIG1heSBiZSBvbmUgb2YgdGhlDQo+IGZvbGxvd2luZzoNCj4gICAgICAg
KiAwIC0gUkVGQ0xLT1VUDQo+ICAgICAgICogMSAtIFBMTENMS09VVA0KPiAgICAgICAqIDUgLSBM
T1dQV1JDTEtPVVQNCj4gDQo+IEEgY2xvY2sgcHJvdmlkZXIgbWlnaHQgaGF2ZSBhIGNvbnRpZ3Vv
dXMgKG9yIGRpc2NvbnRpZ3VvdXMpIHNldCBvZiBjbG9jaw0KPiBpbmRleGVzOg0KPiANCj4gICAt
ICNjbG9jay1jZWxsczogc2hvdWxkIGJlIDwxPi4gVGhlIGNsb2NrIGluZGV4IGFzIHBlciB0aGUg
ZG9jdW1lbnRhdGlvbiwNCj4gaW4gdGhlIHJhbmdlIFswLDE1XS4NCj4gDQo+IEkgaG9wZSB0aGlz
IGNsZWFycyB1cCB0aGUgY29uZnVzaW9uIG9uIHdoYXQgSSBhbSBhc2tpbmcgZm9yLg0KPiANCkkg
dW5kZXJzdGFuZCBub3cuIFRoZXJlIGNvdWxkIGJlIGEgY2xvY2stY2VsbHMgd2l0aCB0aGUgdmFs
dWUgb2YgbW9yZSB0aGFuIDEuDQpUaGF0IGlzIGp1c3QgcmFyZWx5IHVzZWQuDQpJbiBteSBjYXNl
LCAjY2xvY2stY2VsbHMgc2hvdWxkIGJlIDwxPiBhbmQgSSB3aWxsIGFkZCBhIGxpc3Qgb2YgdmFs
dWVzLg0KDQo+ID4NCj4gPiA+IDE3OiAjY2xvY2stY2VsbHM6ICAgICAgTnVtYmVyIG9mIGNlbGxz
IGluIGEgY2xvY2sgc3BlY2lmaWVyOw0KPiBUeXBpY2FsbHkgMA0KPiA+ID4gZm9yIG5vZGVzDQo+
ID4gPiAxODogICAgICAgICAgICAgICAgICAgIHdpdGggYSBzaW5nbGUgY2xvY2sgb3V0cHV0IGFu
ZCAxIGZvciBub2Rlcw0KPiB3aXRoDQo+ID4gPiBtdWx0aXBsZQ0KPiA+ID4gMTk6ICAgICAgICAg
ICAgICAgICAgICBjbG9jayBvdXRwdXRzLg0KPiA+ID4NCj4gPiA+IEFuZCBuZWl0aGVyIGFyZSB0
aGUgY2xvY2stc3BlY2lmaWVycyBlbmNvZGVkIHdpdGggdGhvc2UgY2VsbHMuDQo+IENvbnNpZGVy
Og0KPiA+ID4NCj4gPiA+ICAgcGxsMDogcGxsMEA4MDAgew0KPiA+ID4gICAgICAgICAgICNjbG9j
ay1jZWxscyA9IDwxPjsNCj4gPiA+ICAgICAgICAgICByZWcgPSA8MHg4MDAgMHg0PjsNCj4gPiA+
ICAgICAgICAgICBjb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLXBsbC0xLjAiOw0KPiA+ID4g
ICAgICAgICAgIGNsb2NrcyA9IDwmc3lzY2xrPjsNCj4gPiA+ICAgICAgICAgICBjbG9jay1vdXRw
dXQtbmFtZXMgPSAicGxsMCIsICJwbGwwLWRpdjIiOw0KPiA+ID4gICB9Ow0KPiA+ID4NCj4gPiA+
IEhlcmUgdGhlIHZhbHVlIG9mIHRoZSBjZWxscyBpbiBhIGNsb2NrLXNwZWNpZmllciBzZWVtIHRv
IGJlOg0KPiA+ID4gMDogcGxsMA0KPiA+ID4gMTogcGxsMC1kaXYyDQo+ID4gPg0KPiA+ID4gU28g
aW4gYSBjb25zdW1lciwgdGhlIHZhbGlkIHZhbHVlcyBvZiB0aGUgY2VsbHMgaW4gYSBjbG9jay1z
cGVjaWZpZXINCj4gPiA+IGFyZToNCj4gPiA+DQo+ID4gPiAgIGNvbnN1bWVyOiBkZXZpY2Ugew0K
PiA+ID4gICAgICAgICAgIGNvbXBhdGlibGUgPSAidmVuZG9yLHNvbWUtZGV2aWNlIjsNCj4gPiA+
ICAgICAgICAgICBjbG9ja3MgPSA8JnBsbDAgMD4sIC8qIHBsbDAgKi8NCj4gPiA+ICAgICAgICAg
ICAgICAgICAgICA8JnBsbDAgMT47IC8qIHBsbDAtZGl2MiAqLw0KPiA+ID4gICB9Ow0KPiA+ID4N
Cj4gPiA+IFRoZXJlIG11c3QgYmUgc29tZSBtZWFuaW5nIGFzc2lnbmVkIHRvIHRoZSB2YWx1ZXMg
b2YgdGhlIGNlbGxzIGluDQo+ID4gPiB0aGUgY2xvY2stc3BlY2lmaWVyIChlLmcuIGxpbmVhciBp
bmRleCBvZiB0aGUgY2xvY2sgb3V0cHV0IGluIHRoZQ0KPiBoYXJkd2FyZSkuDQo+ID4gPiBJdCB3
b3VsZCBiZSBnb29kIHRvIGRlc2NyaWJlIHRoaXMsIG90aGVyIGNsb2NrIGJpbmRpbmdzIGRvLg0K
PiA+ID4NCj4gPiBTb3JyeSwgSSBzdGlsbCBnZXQgd2hhdCB5b3UgbWVhbi4gVGhlcmUgaXMgbm8g
SU5ERVggYXQgYWxsLg0KPiA+IDAgaXMgZm9yIG9uZSBvdXRwdXQsIDEgZm9yIG11bHRpcGxlIG91
dHB1dC4gSnVzdCBsaWtlIHRoYXQuDQo+ID4gV2hhdCB0aGUgIiBvdGhlciBjbG9jayBiaW5kaW5n
cyIgZGlkIHlvdSByZWZlciB0bz8NCj4gDQo+IFRha2UgYSBsb29rIGF0IERvY3VtZW50YXRpb24v
ZGV2aWNldHJlZS9iaW5kaW5ncy9jbG9jay9pbXgyMy1jbG9jay50eHQsDQo+IHdoaWNoIHNwZWNp
ZmllcyBlYWNoIGNsb2NrIG91dHB1dCBieSBuYW1lLiBZb3UgY2FuIGFsc28gdGFrZSBhIGxvb2sg
YXQNCj4gdGhlIHRlZ3JhIGNsb2NrIGJpbmRpbmdzLCB3aGljaCBkZWZpbmUgdGhlIHNldCBvZiBj
bG9ja3MgYnkgcmVmZXJlbmNlIHRvDQo+IGEgZGV2aWNlIHRyZWUgaGVhZGVyIGZpbGUuDQo+IA0K
R290IGl0Lg0KDQo+ID4NCj4gPiA+ID4NCj4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ICtSZWNv
bW1lbmRlZCBwcm9wZXJ0aWVzOg0KPiA+ID4gPiA+ID4gKy0gY2xvY2tzOiBTaG91bGQgYmUgdGhl
IHBoYW5kbGUgb2YgaW5wdXQgcGFyZW50IGNsb2NrDQo+ID4gPiA+ID4gPiArLSBjbG9jay1uYW1l
czogRnJvbSBjb21tb24gY2xvY2sgYmluZGluZywgaW5kaWNhdGVzIHRoZSBjbG9jaw0KPiA+ID4g
PiA+ID4gK25hbWUNCj4gPiA+ID4gPg0KPiA+ID4gPiA+IFRoYXQgZGVzY3JpcHRpb24ncyBhIGJp
dCBvcGFxdWUuDQo+ID4gPiA+ID4NCj4gPiA+ID4gPiBXaGF0J3MgdGhlIG5hbWUgb2YgdGhlIGNs
b2NrIGlucHV0IG9uIHRoZXNlIHVuaXRzPyBUaGF0J3Mgd2hhdA0KPiA+ID4gPiA+IGNsb2NrLSBu
YW1lcyBzaG91bGQgY29udGFpbiwgYW5kIHRoYXQgc2hvdWxkIGJlIGRvY3VtZW50ZWQuDQo+ID4g
PiA+ID4NCj4gPiA+ID4gSXMgaXQgbmVjZXNzYXJ5IHRvIGRvY3VtZW50IHRoZXNlIG5hbWVzIHNp
bmNlIHRoZXkgYXJlIHRvdGFsbHkNCj4gPiA+ID4gdXNlZCBieSBjbG9jayBwcm92aWRlciBhbmQg
Y2xvY2sgY29uc3VtZXIgaGFzIG5vIGlkZWEgYWJvdXQgdGhlbT8NCj4gPiA+DQo+ID4gPiBJJ20g
bm90IHN1cmUgSSBmb2xsb3cgLS0gY2xvY2tzIGFuZCBjbG9jay1uYW1lcyBhcmUgdXNlZCBieSBj
b25zdW1lcnMuDQo+ID4gPiBUaGV5IGRlZmluZSB3aGljaCBjbG9ja3MgYXJlIGlucHV0cyB0byBh
IGNvbnN1bWVyLCBhbmQgdGhlIG5hbWVzIG9mDQo+ID4gPiB0aGUgY2xvY2sgaW5wdXRzIG9uIHRo
ZSBjb25zdW1lcjoNCj4gPiA+DQo+ID4gPiAgIGNvbnN1bWVyQDB4ZmZmZjAwMDAgew0KPiA+ID4g
ICAgICAgICAgIHJlZyA9IDwweGZmZmYwMDAwIDB4MTAwMD47DQo+ID4gPiAgICAgICAgICAgY29t
cGF0aWJsZSA9ICJ2ZW5kb3Isc29tZS1jb25zdW1lciI7DQo+ID4gPiAgICAgICAgICAgY2xvY2tz
ID0gPCZwbDAxMSAwPiwNCj4gPiA+ICAgICAgICAgICAgICAgICAgICA8Jm90aGVyY2xvY2sgNDMg
MjI+LA0KPiA+ID4gICAgICAgICAgICAgICAgICAgIDwmcGwwMTEgMT47DQo+ID4gPiAgICAgICAg
ICAgY2xvY2stbmFtZXMgPSAiYXBiX3BjbGsiLA0KPiA+ID4gICAgICAgICAgICAgICAgICAgICAg
ICAgInBpeGVsX2NsayIsDQo+ID4gPiAgICAgICAgICAgICAgICAgICAgICAgICAic2Nhbm91dF9j
bGsiOw0KPiA+ID4gICB9Ow0KPiA+ID4NCj4gPiA+IEhlcmUgdGhlIHNldCBvZiBjbG9jay1uYW1l
cyB3b3VsZCBiZSBkZWZpbmVkIGluIHRoZSBiaW5kaW5nIG9mIHRoZQ0KPiA+ID4gY29uc3VtZXIs
IGJhc2VkIG9uIHRoZSBjbG9jayBpbnB1dCBuYW1lcyBpbiB0aGUgSVAgZG9jdW1lbnRhdGlvbiAt
LQ0KPiA+ID4gdGhleSB0ZWxsIHRoZSBjb25zdW1lciB3aGljaCBjbG9jayBpbnB1dHMgb24gdGhl
IGNvbnN1bWVyIHRoZSBjbG9ja3MNCj4gPiA+IGRlc2NyaWJlZCBpbiBjbG9ja3MgYXJlIHdpcmVk
IGluIHRvLCBhbmQgZGVzY3JpYmUgbm90aGluZyBhYm91dA0KPiA+ID4gb3V0cHV0IG9mIHRoZSBw
cm92aWRlci4gVXNpbmcgY2xvY2stbmFtZXMgYWxsb3dzIHRoZSBzZXQgb2YgY2xvY2tzDQo+ID4g
PiBvbiBhbiBJUCB0byBjaGFuZ2Ugb3ZlciByZXZpc2lvbnMgYW5kIGZvciBzb21lIGNsb2NrIGlu
cHV0cyB0byBiZQ0KPiBvcHRpb25hbC4NCj4gPiA+DQo+ID4gT0ssIEkgZ2V0IGl0LiBXaWxsIG5h
bWUgdGhlIGNsb2NrLW5hbWVzIGJldHRlciwgYW5kIGFkZCBpdCBpZiBtaXNzZWQuDQo+ID4gVGhh
bmtzLA0KPiANCj4gQ2hlZXJzLg0KPiANCj4gWy4uLl0NCj4gDQo+ID4gPiA+ID4gPiArICAgICAg
ICAgICAgICAgI2FkZHJlc3MtY2VsbHMgPSA8MT47DQo+ID4gPiA+ID4gPiArICAgICAgICAgICAg
ICAgI3NpemUtY2VsbHMgPSA8MT47DQo+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiArICAgICAg
ICAgICAgICAgc3lzY2xrOiBzeXNjbGsgew0KPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAg
ICAgICAgI2Nsb2NrLWNlbGxzID0gPDA+Ow0KPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgICAg
ICAgICAgY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtc3lzY2xrLTEuMCIsDQo+ID4gPiA+ID4gPiAr
ICJmaXhlZC1jbG9jayI7DQo+ID4gPiA+ID4NCj4gPiA+ID4gPiBXZSBkaWRuJ3QgbWVudGlvbiBp
biB0aGUgYmluZGluZyB0aGF0ICJmc2wscW9yaXEtc3lzY2xrLTEuMCIgd2FzDQo+ID4gPiA+ID4g
Y29tcGF0aWJsZSB3aXRoICJmaXhlZC1jbG9jayIgYW5kIHNob3VsZCBoYXZlICJmaXhlZC1jbG9j
ayIgaW4NCj4gPiA+ID4gPiB0aGUgY29tcGF0aWJsZSBsaXN0Li4uDQo+ID4gPiA+ID4NCj4gPiA+
ID4gT0ssIHdpbGwgZml4IGl0Lg0KPiA+ID4NCj4gPiA+IENoZWVycy4gQWxzbywgZG9lc24ndCBh
IGZpeGVkLWNsb2NrIHJlcXVpcmUgYSBjbG9jay1mcmVxdWVuY3k/DQo+ID4gPg0KPiA+IFllcywg
aXQgc2hvdWxkIGJlLiBCdXQgd2UgZ290IHRoZSBjbG9jay1mcmVxdWVuY3kgZnJvbSBwYXJlbnQg
bm9kZQ0KPiA+IGJlY2F1c2UgVGhlcmUgaXMgYSBjbG9jay1mcmVxdWVuY3kgYWxyZWFkeSB0aGVy
ZSBiZWZvcmUgdGhpcyBwYXRjaC4NCj4gDQo+IE9LLiBTaG91bGQgd2Ugbm90IHBsYWNlIGl0IHRo
ZXJlIGZvciBmdXR1cmU/IFdlJ3JlIG5vdCBjb21wYXRpYmxlIHdpdGgNCj4gZml4ZWQtY2xvY2sg
aWYgd2UgZG9uJ3QgZnVsZmlsIHRoZSBtaW5pbXVtIHJlcXVpcmVtZW50cyBvZiB0aGUgZml4ZWQt
DQo+IGNsb2NrIGJpbmRpbmcuLi4NCj4gDQo+ID4NCj4gPiA+ID4NCj4gPiA+ID4gPiA+ICsgICAg
ICAgICAgICAgICAgICAgICAgIGNsb2NrLW91dHB1dC1uYW1lcyA9ICJzeXNjbGsiOw0KPiA+ID4g
PiA+ID4gKyAgICAgICAgICAgICAgIH0NCj4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ICsgICAg
ICAgICAgICAgICBwbGwwOiBwbGwwQDgwMCB7DQo+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAg
ICAgICAgICAjY2xvY2stY2VsbHMgPSA8MT47DQo+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAg
ICAgICAgICByZWcgPSA8MHg4MDAgMHg0PjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAg
ICAgICAgIGNvbXBhdGlibGUgPSAiZnNsLHFvcmlxLWNvcmUtcGxsLTEuMCI7DQo+ID4gPiA+ID4g
PiArICAgICAgICAgICAgICAgICAgICAgICBjbG9ja3MgPSA8JnN5c2Nsaz47DQo+ID4gPiA+ID4g
PiArICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1vdXRwdXQtbmFtZXMgPSAicGxsMCIsICJw
bGwwLQ0KPiBkaXYyIjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICB9Ow0KPiA+ID4gPiA+
ID4gKw0KPiA+ID4gPiA+ID4gKyAgICAgICAgICAgICAgIHBsbDE6IHBsbDFAODIwIHsNCj4gPiA+
ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICNjbG9jay1jZWxscyA9IDwxPjsNCj4gPiA+
ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9IDwweDgyMCAweDQ+Ow0KPiA+ID4g
PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgY29tcGF0aWJsZSA9ICJmc2wscW9yaXEtY29y
ZS1wbGwtMS4wIjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrcyA9
IDwmc3lzY2xrPjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGNsb2NrLW91
dHB1dC1uYW1lcyA9ICJwbGwxIiwgInBsbDEtDQo+IGRpdjIiOw0KPiA+ID4gPiA+ID4gKyAgICAg
ICAgICAgICAgIH07DQo+ID4gPiA+ID4gPiArDQo+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAg
bXV4MDogbXV4MEAwIHsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICNjbG9j
ay1jZWxscyA9IDwwPjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlZyA9
IDwweDAgMHg0PjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhdGli
bGUgPSAiZnNsLHFvcmlxLWNvcmUtbXV4LTEuMCI7DQo+ID4gPiA+ID4gPiArICAgICAgICAgICAg
ICAgICAgICAgICBjbG9ja3MgPSA8JnBsbDAgMD4sIDwmcGxsMCAxPiwgPCZwbGwxDQo+ID4gPiA+
ID4gPiArIDA+LA0KPiA+ID4gPiA+IDwmcGxsMSAxPjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAg
ICAgICAgICAgICAgIGNsb2NrLW5hbWVzID0gInBsbDBfMCIsICJwbGwwXzEiLA0KPiA+ID4gPiA+
ID4gKyAicGxsMV8wIiwNCj4gPiA+ID4gPiAicGxsMV8xIjsNCj4gPiA+ID4gPiA+ICsgICAgICAg
ICAgICAgICAgICAgICAgIGNsb2NrLW91dHB1dC1uYW1lcyA9ICJjbXV4MCI7DQo+ID4gPiA+ID4g
PiArICAgICAgICAgICAgICAgfTsNCj4gPiA+ID4gPiA+ICsNCj4gPiA+ID4gPiA+ICsgICAgICAg
ICAgICAgICBtdXgxOiBtdXgxQDIwIHsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAg
ICAgICNjbG9jay1jZWxscyA9IDwwPjsNCj4gPiA+ID4gPiA+ICsgICAgICAgICAgICAgICAgICAg
ICAgIHJlZyA9IDwweDIwIDB4ND47DQo+ID4gPiA+ID4gPiArICAgICAgICAgICAgICAgICAgICAg
ICBjb21wYXRpYmxlID0gImZzbCxxb3JpcS1jb3JlLW11eC0xLjAiOw0KPiA+ID4gPiA+ID4gKyAg
ICAgICAgICAgICAgICAgICAgICAgY2xvY2tzID0gPCZwbGwwIDA+LCA8JnBsbDAgMT4sIDwmcGxs
MQ0KPiA+ID4gPiA+ID4gKyAwPiwNCj4gPiA+ID4gPiA8JnBsbDEgMT47DQo+ID4gPiA+ID4gPiAr
ICAgICAgICAgICAgICAgICAgICAgICBjbG9jay1uYW1lcyA9ICJwbGwwXzAiLCAicGxsMF8xIiwN
Cj4gPiA+ID4gPiA+ICsgInBsbDFfMCIsDQo+ID4gPiA+ID4gInBsbDFfMSI7DQo+ID4gPg0KPiA+
ID4gSSBkaWRuJ3Qgc3BvdCB0aGlzIGxhc3QgdGltZSwgYnV0IHRoZSBjbG9jay1uYW1lcyBoZXJl
IHNlZW0gdG8gYmUNCj4gPiA+IHRoZSBuYW1lcyBvZiB0aGUgb3V0cHV0cyBmcm9tIHRoZSBwcm92
aWRlciwgcmF0aGVyIHRoYW4gdGhlIGlucHV0DQo+ID4gPiBuYW1lcyBvZiB0aGUgY29uc3VtZXIu
IFRoaXMgZ29lcyBhZ2FpbnN0IHRoZSBpbnRlbmRlZCBwdXJwb3NlIG9mDQo+IGNsb2NrLW5hbWVz
Lg0KPiA+ID4NCj4gPiBJIGFtIGNvbmZ1c2VkIGhlcmUgd2l0aCBwcm92aWRlci9jb25zdW1lciBi
ZWNhdXNlIHNvbWUgbm9kZXMgY2FuIGJvdGgNCj4gYmUgY29uc3VtZXIgYW5kIHByb3ZpZGVyLg0K
PiA+IFRoZSBjbG9jay1uYW1lcyBhcmUgY29ycmVzcG9uZGluZyB0byBjbG9ja3Mgb25lIGJ5IG9u
ZSwgd2hhdCdzIHdyb25nDQo+IHdpdGggaXQ/DQo+IA0KPiBXZSBoYXZlIGNsb2NrLW5hbWVzIGZv
ciBhIGNvbnN1bWVyJ3MgbmFtZXMgb2YgaXRzIGlucHV0cywgYW5kIGNsb2NrLQ0KPiBvdXRwdXQt
bmFtZXMgZm9yIGEgcHJvdmlkZXIncyBuYW1lcyBvZiBpdCdzIG91dHB1dHMuDQo+IA0KPiBDb25z
aWRlciBhIFBMTCBkZXZpY2Ugd2hpY2ggdGFrZXMgYSBjbG9jayBpbnB1dCAoUkVGQ0xLKSBhbmQg
b3V0cHV0cyBhDQo+IGhpZ2hlciBmcmVxdWVuY3kgY2xvY2sgKE9VVENMSykuIFRoZSBQTEwncyBz
cGVjaWZpY2F0aW9uIG9ubHkgdGFsa3MgaW4NCj4gdGVybXMgb2YgUkVGQ0xLIGFuZCBPVVRDTEss
IGJ1dCB0aGVzZSBhcmUgbm90IHRoZSBuYW1lcyBvZiB0aGUgY2xvY2tzIGFzDQo+IHRoZXkgYXJl
IG91dHB1dCBmcm9tIHRoZSBvcmlnaW5hbCBjbG9jaywgb3IgcHJvdmlkZWQgdG8gdGhlIGZpbmFs
DQo+IGNvbnN1bWVyLg0KPiANCj4gQ29uc2lkZXIgYSBzZXF1ZW5jZSBvZiB0aGVzZSBQTExzIHBs
dWdnZWQgdG9nZXRoZXIuIFRoZSBPVVRDTEsgb2Ygb25lDQo+IGZlZWRzIGludG8gdGhlIFJFRkNM
SyBvZiB0aGUgbmV4dDoNCj4gDQo+IGZpeGVkOiBmaXhlZC1jbG9jayB7DQo+ICAgICAgICAgY29t
cGF0aWJsZSA9ICJmaXhlZC1jbG9jayI7DQo+ICAgICAgICAgY2xvY2stZnJlcXVlbmN5ID0gPDUw
PjsNCj4gfTsNCj4gDQo+IHBsbF8wOiBwbGwgew0KPiAgICAgICAgIGNvbXBhdGlibGUgPSAidmVu
ZG9yLHBsbCI7DQo+ICAgICAgICAgY2xvY2tzID0gPCZmaXhlZD47DQo+ICAgICAgICAgY2xvY2st
bmFtZXMgPSAicmVmY2xrIjsNCj4gICAgICAgICBjbG9jay1vdXRwdXQtbmFtZXMgPSAib3V0Y2xr
IjsNCj4gfTsNCj4gDQo+IHBsbF8xOiBhbm90aGVyLXBsbCB7DQo+ICAgICAgICAgY29tcGF0aWJs
ZSA9ICJ2ZW5kb3IscGxsIjsNCj4gICAgICAgICBjbG9ja3MgPSA8JnBsbF8wPjsNCj4gICAgICAg
ICBjbG9jay1uYW1lcyA9ICJyZWZjbGsiOw0KPiAgICAgICAgIGNsb2NrLW91dHB1dC1uYW1lcyA9
ICJvdXRjbGsiOw0KPiB9Ow0KPiANCj4gY29uc3VtZXIgew0KPiAgICAgICAgIGNvbXBhdGlibGUg
PSAidmVuZG9yLGNsb2NrLWNvbnN1bWVyIjsNCj4gICAgICAgICBjbG9ja3MgPSA8JnBsbF8xPiwN
Cj4gICAgICAgICAgICAgICAgICA8JnBsbF8wPjsNCj4gICAgICAgICBjbG9jay1uYW1lcyA9ICJo
YWxmY2xrIiwgImZ1bGxjbGsiOyB9Ow0KPiANCj4gSW4gZWFjaCBjYXNlLCBjbG9jay1uYW1lcyBk
ZXNjcmliZXMgdGhlIGNsb2NrIGlucHV0cyBmcm9tIHRoZSB2aWV3IG9mIHRoZQ0KPiBQTEwgdGhl
eSBhcmUgaW5wdXQgdG8sIG5vdCBmcm9tIHRoZSBwcm92aWRlciB0aGV5IGNhbWUgZnJvbSwgb3Ig
dGhlDQo+IGNvbnN1bWVyIHNvbWUgb3V0cHV0cyBhcmUgZ29pbmcgdG8uIEdpdmluZyB0aGUgaW5w
dXRzIG5hbWVzIGluIHRoaXMgd2F5DQo+IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGRlc2NyaWJlIHNp
dHVhdGlvbnMgd2hlcmUgb25seWEgc3Vic2V0IG9mIGNsb2NrDQo+IGlucHV0cyBhcmUgd2lyZWQg
dXAgLS0gd2UgY291bGQganVzdCBoYXZlICJmdWxsY2xrIiBvbiB0aGUgZmluYWwgY29uc3VtZXIs
DQo+IHdpdGggb25seSBwbGxfMCBhcyBhbiBpbnB1dCwgYW5kIHRoZSBkcml2ZXIgY291bGQgZmln
dXJlIG91dCB3aGF0IHRvIGRvLg0KPiANCj4gRG9lcyB0aGF0IGhlbHA/DQo+IA0KWWVzLCBpdCBp
cyB2ZXJ5IGhlbHBmdWwuIEkgd2lsbCBuYW1lIGNsb2NrLW5hbWVzIGJldHRlci4NCg0KUmVnYXJk
cywNCll1YW50aWFuDQoNCg==

^ permalink raw reply

* Re: Elbc device driver
From: Mercier Ivan @ 2013-10-22  9:43 UTC (permalink / raw)
  To: Scott Wood; +Cc: linuxppc-dev
In-Reply-To: <1381512940.7979.497.camel@snotra.buserror.net>

Ok Scott,
now it works!
We had severals hardware problem.
Thanks for your help

2013/10/11 Scott Wood <scottwood@freescale.com>:
> On Fri, 2013-10-11 at 17:03 +0200, Mercier Ivan wrote:
>> Hi,
>> this should be correct (I'm using chip select 3 for this device)
>>         lbc: localbus@ffe124000 {
>>                 reg = <0xf 0xfe124000 0 0x1000>;
>>                 ranges = <3 0 0xf 0xe0000000 0x08000000>;
>>
>>                 a3p400{
>>                         #address-cells = <1>;
>>                         #size-cells = <1>;
>>                         compatible = "my_a3p_driver";
>>                         reg = <0x0 0x0 0x800000>;
>>                 };
>>         };
>
> Compatible describes the device, not the driver.  It takes the format
> "vendor,device".  The node name, OTOH, is normally a generic description
> of the device's functionality ("flash", "ethernet", "board-control",
> etc).
>
> You don't need #address-cells/#size-cells on the a3p400 node unless it
> has child nodes with reg or ranges.
>
> -Scott
>
>
>

^ permalink raw reply

* Re: [PATCHv1 8/8] Documentation: Add device tree bindings for Freescale VF610 sound.
From: Mark Brown @ 2013-10-22  9:47 UTC (permalink / raw)
  To: Xiubo Li-B47053
  Cc: mark.rutland@arm.com, alsa-devel@alsa-project.org,
	linux-doc@vger.kernel.org, tiwai@suse.de, Wang Huan-B18965,
	timur@tabi.org, perex@perex.cz, Guo Shawn-R65073,
	LW@KARO-electronics.de, linux@arm.linux.org.uk,
	Chen Guangyu-B42378, linux-arm-kernel@lists.infradead.org,
	grant.likely@linaro.org, devicetree@vger.kernel.org,
	ian.campbell@citrix.com, pawel.moll@arm.com,
	swarren@wwwdotorg.org, rob.herring@calxeda.com, oskar@scara.com,
	Estevam Fabio-R49496, lgirdwood@gmail.com,
	linux-kernel@vger.kernel.org, rob@landley.net,
	Jin Zhengxiong-R64188, shawn.guo@linaro.org,
	linuxppc-dev@lists.ozlabs.org
In-Reply-To: <1DD289F6464F0949A2FCA5AA6DC23F82866807@039-SN2MPN1-013.039d.mgd.msft.net>

[-- Attachment #1: Type: text/plain, Size: 285 bytes --]

On Mon, Oct 21, 2013 at 07:24:56AM +0000, Xiubo Li-B47053 wrote:

> Yes, the "-- SGTL5000 pins:" should be in the CODEC binding.
> But, actually the CODEC binding hasn't any reference about this.

> So I added it here, but not very sure.

Please add them to the CODEC binding instead.

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply

* [RFC PATCH 0/9] powerpc: mm: Numa faults support for ppc64
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev

Hi,

This patch series add support for numa faults on ppc64 architecture. We steal the
_PAGE_COHERENCE bit and use that for indicating _PAGE_NUMA. We clear the _PAGE_PRESENT bit
and also invalidate the hpte entry on setting _PAGE_NUMA. The next fault on that
page will be considered a numa fault.


NOTE:
______
Issue:
I am finding large lock contention on page_table_lock with this series on a 95 cpu 4 node box with autonuma benchmark

I will out on vacation till NOV 6 without email access. Hence i will not be able to respond to review feedbacks
till then. 


lock_stat version 0.3
-------------------------------------------------------------------------------------------------------------------------------------------------------
                      class name    con-bounces    contentions   waittime-min   waittime-max waittime-total    acq-bounces   acquisitions   holdtime-mi  hold time hold total
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  &(&mm->page_table_lock)->rlock:     713531791      719610919           0.09     3038193.19 357867523236.3      729709189      750040162    0.0  236991.36  1159646899.68
  ------------------------------
  &(&mm->page_table_lock)->rlock              1          [<c000000000218880>] .anon_vma_prepare+0xb0/0x1e0
  &(&mm->page_table_lock)->rlock             93          [<c000000000207ebc>] .do_numa_page+0x4c/0x190
  &(&mm->page_table_lock)->rlock         301678          [<c0000000002139d4>] .change_protection+0x1d4/0x560
  &(&mm->page_table_lock)->rlock         244524          [<c000000000213be8>] .change_protection+0x3e8/0x560
  ------------------------------
  &(&mm->page_table_lock)->rlock              1          [<c000000000206a38>] .__do_fault+0x198/0x6b0
  &(&mm->page_table_lock)->rlock         704163          [<c0000000002139d4>] .change_protection+0x1d4/0x560
  &(&mm->page_table_lock)->rlock         207227          [<c000000000213be8>] .change_protection+0x3e8/0x560
  &(&mm->page_table_lock)->rlock             95          [<c000000000207ebc>] .do_numa_page+0x4c/0x190
 
-aneesh

^ permalink raw reply

* [RFC PATCH 4/9] powerpc: mm: Only check for _PAGE_PRESENT in set_pte/pmd functions
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

We want to make sure we don't use these function when updating a pte
or pmd entry that have a valid hpte entry, because these functions
don't invalidate them. So limit the check to _PAGE_PRESENT bit.
Numafault core changes use these functions for updating _PAGE_NUMA bits.
That should be ok because when _PAGE_NUMA is set we can be sure that
hpte entries are not present.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/mm/pgtable.c    | 2 +-
 arch/powerpc/mm/pgtable_64.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c
index edda589..10c09b6 100644
--- a/arch/powerpc/mm/pgtable.c
+++ b/arch/powerpc/mm/pgtable.c
@@ -187,7 +187,7 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep,
 		pte_t pte)
 {
 #ifdef CONFIG_DEBUG_VM
-	WARN_ON(pte_present(*ptep));
+	WARN_ON(pte_val(*ptep) & _PAGE_PRESENT);
 #endif
 	/* Note: mm->context.id might not yet have been assigned as
 	 * this context might not have been activated yet when this
diff --git a/arch/powerpc/mm/pgtable_64.c b/arch/powerpc/mm/pgtable_64.c
index 536eec72..56b7586 100644
--- a/arch/powerpc/mm/pgtable_64.c
+++ b/arch/powerpc/mm/pgtable_64.c
@@ -686,7 +686,7 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,
 		pmd_t *pmdp, pmd_t pmd)
 {
 #ifdef CONFIG_DEBUG_VM
-	WARN_ON(!pmd_none(*pmdp));
+	WARN_ON(pmd_val(*pmdp) & _PAGE_PRESENT);
 	assert_spin_locked(&mm->page_table_lock);
 	WARN_ON(!pmd_trans_huge(pmd));
 #endif
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 1/9] powerpc: Use HPTE constants when updating hpte bits
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

Even though we have same value for linux PTE bits and hash PTE pits
use the hash pte bits wen updating hash pte

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/platforms/cell/beat_htab.c | 4 ++--
 arch/powerpc/platforms/pseries/lpar.c   | 3 ++-
 2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/platforms/cell/beat_htab.c b/arch/powerpc/platforms/cell/beat_htab.c
index c34ee4e..d4d245c 100644
--- a/arch/powerpc/platforms/cell/beat_htab.c
+++ b/arch/powerpc/platforms/cell/beat_htab.c
@@ -111,7 +111,7 @@ static long beat_lpar_hpte_insert(unsigned long hpte_group,
 		DBG_LOW(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r);
 
 	if (rflags & _PAGE_NO_CACHE)
-		hpte_r &= ~_PAGE_COHERENT;
+		hpte_r &= ~HPTE_R_M;
 
 	raw_spin_lock(&beat_htab_lock);
 	lpar_rc = beat_read_mask(hpte_group);
@@ -337,7 +337,7 @@ static long beat_lpar_hpte_insert_v3(unsigned long hpte_group,
 		DBG_LOW(" hpte_v=%016lx, hpte_r=%016lx\n", hpte_v, hpte_r);
 
 	if (rflags & _PAGE_NO_CACHE)
-		hpte_r &= ~_PAGE_COHERENT;
+		hpte_r &= ~HPTE_R_M;
 
 	/* insert into not-volted entry */
 	lpar_rc = beat_insert_htab_entry3(0, hpte_group, hpte_v, hpte_r,
diff --git a/arch/powerpc/platforms/pseries/lpar.c b/arch/powerpc/platforms/pseries/lpar.c
index 356bc75..c8fbef23 100644
--- a/arch/powerpc/platforms/pseries/lpar.c
+++ b/arch/powerpc/platforms/pseries/lpar.c
@@ -153,7 +153,8 @@ static long pSeries_lpar_hpte_insert(unsigned long hpte_group,
 
 	/* Make pHyp happy */
 	if ((rflags & _PAGE_NO_CACHE) && !(rflags & _PAGE_WRITETHRU))
-		hpte_r &= ~_PAGE_COHERENT;
+		hpte_r &= ~HPTE_R_M;
+
 	if (firmware_has_feature(FW_FEATURE_XCMO) && !(hpte_r & HPTE_R_N))
 		flags |= H_COALESCE_CAND;
 
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 3/9] mm: Move change_prot_numa outside CONFIG_ARCH_USES_NUMA_PROT_NONE
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

change_prot_numa should work even if _PAGE_NUMA != _PAGE_PROTNONE.
On archs like ppc64 that don't use _PAGE_PROTNONE and also have
a separate page table outside linux pagetable, we just need to
make sure that when calling change_prot_numa we flush the
hardware page table entry so that next page access  result in a numa
fault.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 include/linux/mm.h | 3 ---
 mm/mempolicy.c     | 9 ---------
 2 files changed, 12 deletions(-)

diff --git a/include/linux/mm.h b/include/linux/mm.h
index 8b6e55e..5ab0e22 100644
--- a/include/linux/mm.h
+++ b/include/linux/mm.h
@@ -1668,11 +1668,8 @@ static inline pgprot_t vm_get_page_prot(unsigned long vm_flags)
 }
 #endif
 
-#ifdef CONFIG_ARCH_USES_NUMA_PROT_NONE
 unsigned long change_prot_numa(struct vm_area_struct *vma,
 			unsigned long start, unsigned long end);
-#endif
-
 struct vm_area_struct *find_extend_vma(struct mm_struct *, unsigned long addr);
 int remap_pfn_range(struct vm_area_struct *, unsigned long addr,
 			unsigned long pfn, unsigned long size, pgprot_t);
diff --git a/mm/mempolicy.c b/mm/mempolicy.c
index 0472964..efb4300 100644
--- a/mm/mempolicy.c
+++ b/mm/mempolicy.c
@@ -612,7 +612,6 @@ static inline int queue_pages_pgd_range(struct vm_area_struct *vma,
 	return 0;
 }
 
-#ifdef CONFIG_ARCH_USES_NUMA_PROT_NONE
 /*
  * This is used to mark a range of virtual addresses to be inaccessible.
  * These are later cleared by a NUMA hinting fault. Depending on these
@@ -626,7 +625,6 @@ unsigned long change_prot_numa(struct vm_area_struct *vma,
 			unsigned long addr, unsigned long end)
 {
 	int nr_updated;
-	BUILD_BUG_ON(_PAGE_NUMA != _PAGE_PROTNONE);
 
 	nr_updated = change_protection(vma, addr, end, vma->vm_page_prot, 0, 1);
 	if (nr_updated)
@@ -634,13 +632,6 @@ unsigned long change_prot_numa(struct vm_area_struct *vma,
 
 	return nr_updated;
 }
-#else
-static unsigned long change_prot_numa(struct vm_area_struct *vma,
-			unsigned long addr, unsigned long end)
-{
-	return 0;
-}
-#endif /* CONFIG_ARCH_USES_NUMA_PROT_NONE */
 
 /*
  * Walk through page tables and collect pages to be migrated.
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 8/9] powerpc: mm: Support setting _PAGE_NUMA bit on pmd entry which are pointer to PTE page
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/pgtable-ppc64.h | 18 ++++++++++++++++--
 1 file changed, 16 insertions(+), 2 deletions(-)

diff --git a/arch/powerpc/include/asm/pgtable-ppc64.h b/arch/powerpc/include/asm/pgtable-ppc64.h
index 46db094..f828944 100644
--- a/arch/powerpc/include/asm/pgtable-ppc64.h
+++ b/arch/powerpc/include/asm/pgtable-ppc64.h
@@ -150,8 +150,22 @@
 
 #define pmd_set(pmdp, pmdval) 	(pmd_val(*(pmdp)) = (pmdval))
 #define pmd_none(pmd)		(!pmd_val(pmd))
-#define	pmd_bad(pmd)		(!is_kernel_addr(pmd_val(pmd)) \
-				 || (pmd_val(pmd) & PMD_BAD_BITS))
+
+static inline int pmd_bad(pmd_t pmd)
+{
+#ifdef CONFIG_NUMA_BALANCING
+	/*
+	 * For numa balancing we can have this set
+	 */
+	if (pmd_val(pmd) & _PAGE_NUMA)
+		return 0;
+#endif
+	if (!is_kernel_addr(pmd_val(pmd)) ||
+	    (pmd_val(pmd) & PMD_BAD_BITS))
+		return 1;
+	return 0;
+}
+
 #define	pmd_present(pmd)	(pmd_val(pmd) != 0)
 #define	pmd_clear(pmdp)		(pmd_val(*(pmdp)) = 0)
 #define pmd_page_vaddr(pmd)	(pmd_val(pmd) & ~PMD_MASKED_BITS)
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 9/9] powerpc: mm: Enable numa faulting for hugepages
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

Provide numa related functions for updating pmd entries.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/pgtable.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h
index 67ea8fb..aa3add7 100644
--- a/arch/powerpc/include/asm/pgtable.h
+++ b/arch/powerpc/include/asm/pgtable.h
@@ -95,19 +95,19 @@ static inline void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
 #define pmd_numa pmd_numa
 static inline int pmd_numa(pmd_t pmd)
 {
-	return 0;
+	return pte_numa(pmd_pte(pmd));
 }
 
 #define pmd_mknonnuma pmd_mknonnuma
 static inline pmd_t pmd_mknonnuma(pmd_t pmd)
 {
-	return pmd;
+	return pte_pmd(pte_mknonnuma(pmd_pte(pmd)));
 }
 
 #define pmd_mknuma pmd_mknuma
 static inline pmd_t pmd_mknuma(pmd_t pmd)
 {
-	return pmd;
+	return pte_pmd(pte_mknuma(pmd_pte(pmd)));
 }
 
 # else
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 7/9] mm: numafaults: Use change_pmd_protnuma for updating _PAGE_NUMA for regular pmds
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

Archs like ppc64 have different layout for pmd entries pointing to PTE
page. Hence add a separate function for modifying them

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/pgtable.h | 17 +++++++++++++++++
 include/asm-generic/pgtable.h      | 20 ++++++++++++++++++++
 mm/memory.c                        |  2 +-
 mm/mprotect.c                      | 24 ++++++------------------
 4 files changed, 44 insertions(+), 19 deletions(-)

diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h
index 9d87125..67ea8fb 100644
--- a/arch/powerpc/include/asm/pgtable.h
+++ b/arch/powerpc/include/asm/pgtable.h
@@ -75,6 +75,23 @@ static inline pte_t pte_mknuma(pte_t pte)
 	return pte;
 }
 
+#define change_pmd_protnuma change_pmd_protnuma
+static inline void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
+				       pmd_t *pmdp, int prot_numa)
+{
+	/*
+	 * We don't track the _PAGE_PRESENT bit here
+	 */
+	unsigned long pmd_val;
+	pmd_val = pmd_val(*pmdp);
+	if (prot_numa)
+		pmd_val |= _PAGE_NUMA;
+	else
+		pmd_val &= ~_PAGE_NUMA;
+	pmd_set(pmdp, pmd_val | _PAGE_NUMA);
+}
+
+
 #define pmd_numa pmd_numa
 static inline int pmd_numa(pmd_t pmd)
 {
diff --git a/include/asm-generic/pgtable.h b/include/asm-generic/pgtable.h
index f330d28..568a8c4 100644
--- a/include/asm-generic/pgtable.h
+++ b/include/asm-generic/pgtable.h
@@ -697,6 +697,18 @@ static inline pmd_t pmd_mknuma(pmd_t pmd)
 	return pmd_clear_flags(pmd, _PAGE_PRESENT);
 }
 #endif
+
+#ifndef change_pmd_protnuma
+static inline void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
+				       pmd_t *pmd, int prot_numa)
+{
+	if (prot_numa)
+		set_pmd_at(mm, addr & PMD_MASK, pmd, pmd_mknuma(*pmd));
+	else
+		set_pmd_at(mm, addr & PMD_MASK, pmd, pmd_mknonnuma(*pmd));
+}
+
+#endif
 #else
 extern int pte_numa(pte_t pte);
 extern int pmd_numa(pmd_t pmd);
@@ -704,6 +716,8 @@ extern pte_t pte_mknonnuma(pte_t pte);
 extern pmd_t pmd_mknonnuma(pmd_t pmd);
 extern pte_t pte_mknuma(pte_t pte);
 extern pmd_t pmd_mknuma(pmd_t pmd);
+extern void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
+				pmd_t *pmd, int prot_numa);
 #endif /* CONFIG_ARCH_USES_NUMA_PROT_NONE */
 #else
 static inline int pmd_numa(pmd_t pmd)
@@ -735,6 +749,12 @@ static inline pmd_t pmd_mknuma(pmd_t pmd)
 {
 	return pmd;
 }
+
+static inline void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
+				       pmd_t *pmd, int prot_numa)
+{
+	BUG();
+}
 #endif /* CONFIG_NUMA_BALANCING */
 
 #endif /* CONFIG_MMU */
diff --git a/mm/memory.c b/mm/memory.c
index ca00039..e930e50 100644
--- a/mm/memory.c
+++ b/mm/memory.c
@@ -3605,7 +3605,7 @@ static int do_pmd_numa_page(struct mm_struct *mm, struct vm_area_struct *vma,
 	spin_lock(&mm->page_table_lock);
 	pmd = *pmdp;
 	if (pmd_numa(pmd)) {
-		set_pmd_at(mm, _addr, pmdp, pmd_mknonnuma(pmd));
+		change_pmd_protnuma(mm, _addr, pmdp, 0);
 		numa = true;
 	}
 	spin_unlock(&mm->page_table_lock);
diff --git a/mm/mprotect.c b/mm/mprotect.c
index 94722a4..88de575 100644
--- a/mm/mprotect.c
+++ b/mm/mprotect.c
@@ -112,22 +112,6 @@ static unsigned long change_pte_range(struct vm_area_struct *vma, pmd_t *pmd,
 	return pages;
 }
 
-#ifdef CONFIG_NUMA_BALANCING
-static inline void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
-				       pmd_t *pmd)
-{
-	spin_lock(&mm->page_table_lock);
-	set_pmd_at(mm, addr & PMD_MASK, pmd, pmd_mknuma(*pmd));
-	spin_unlock(&mm->page_table_lock);
-}
-#else
-static inline void change_pmd_protnuma(struct mm_struct *mm, unsigned long addr,
-				       pmd_t *pmd)
-{
-	BUG();
-}
-#endif /* CONFIG_NUMA_BALANCING */
-
 static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
 		pud_t *pud, unsigned long addr, unsigned long end,
 		pgprot_t newprot, int dirty_accountable, int prot_numa)
@@ -161,8 +145,12 @@ static inline unsigned long change_pmd_range(struct vm_area_struct *vma,
 		 * node. This allows a regular PMD to be handled as one fault
 		 * and effectively batches the taking of the PTL
 		 */
-		if (prot_numa && all_same_node)
-			change_pmd_protnuma(vma->vm_mm, addr, pmd);
+		if (prot_numa && all_same_node) {
+			spin_lock(&vma->vm_mm->page_table_lock);
+			change_pmd_protnuma(vma->vm_mm, addr, pmd, 1);
+			spin_unlock(&vma->vm_mm->page_table_lock);
+
+		}
 	} while (pmd++, addr = next, addr != end);
 
 	return pages;
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 6/9] powerpc: mm: book3s: Disable hugepaged pmd format for book3s
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

After commit e2b3d202d1dba8f3546ed28224ce485bc50010be we have the
below possible formats for pmd entry

(1) invalid (all zeroes)
(2) pointer to next table, as normal; bottom 6 bits == 0
(3) leaf pte for huge page, bottom two bits != 00
(4) hugepd pointer, bottom two bits == 00, next 4 bits indicate size of table

On book3s we don't really use the (4).  For Numa balancing we need to
tag pmd entries that are pointer to next table with _PAGE_NUMA for
performance reason (9532fec118d485ea37ab6e3ea372d68cd8b4cd0d). This
patch enables that by disabling hugepd support for book3s if
NUMA_BALANCING is enabled. We ideally want to get rid of hugepd pointer
completely.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/page.h | 11 +++++++++++
 arch/powerpc/mm/hugetlbpage.c   |  8 +++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/include/asm/page.h b/arch/powerpc/include/asm/page.h
index b9f4262..791ab56 100644
--- a/arch/powerpc/include/asm/page.h
+++ b/arch/powerpc/include/asm/page.h
@@ -369,11 +369,22 @@ typedef struct { signed long pd; } hugepd_t;
 #ifdef CONFIG_PPC_BOOK3S_64
 static inline int hugepd_ok(hugepd_t hpd)
 {
+#ifdef CONFIG_NUMA_BALANCING
+	/*
+	 * In order to enable batch handling of pte numa faults, Numa balancing
+	 * code use the _PAGE_NUMA bit even on pmd that is pointing to PTE PAGE.
+	 * 9532fec118d485ea37ab6e3ea372d68cd8b4cd0d. After commit
+	 * e2b3d202d1dba8f3546ed28224ce485bc50010be we really don't need to
+	 * support hugepd for ppc64.
+	 */
+	return 0;
+#else
 	/*
 	 * hugepd pointer, bottom two bits == 00 and next 4 bits
 	 * indicate size of table
 	 */
 	return (((hpd.pd & 0x3) == 0x0) && ((hpd.pd & HUGEPD_SHIFT_MASK) != 0));
+#endif
 }
 #else
 static inline int hugepd_ok(hugepd_t hpd)
diff --git a/arch/powerpc/mm/hugetlbpage.c b/arch/powerpc/mm/hugetlbpage.c
index d67db4b..71bd214 100644
--- a/arch/powerpc/mm/hugetlbpage.c
+++ b/arch/powerpc/mm/hugetlbpage.c
@@ -235,8 +235,14 @@ pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr, unsigned long sz
 	if (!hpdp)
 		return NULL;
 
+#ifdef CONFIG_NUMA_BALANCING
+	/*
+	 * We cannot support hugepd format with numa balancing support
+	 * enabled.
+	 */
+	return NULL;
+#endif
 	BUG_ON(!hugepd_none(*hpdp) && !hugepd_ok(*hpdp));
-
 	if (hugepd_none(*hpdp) && __hugepte_alloc(mm, hpdp, addr, pdshift, pshift))
 		return NULL;
 
-- 
1.8.3.2

^ permalink raw reply related

* [RFC PATCH 5/9] powerpc: mm: book3s: Enable _PAGE_NUMA for book3s
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

We steal the _PAGE_COHERENCE bit and use that for indicating NUMA ptes.
This patch still disables the numa hinting using pmd entries. That
require further changes to pmd entry format which is done in later
patches.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/pgtable.h     | 66 +++++++++++++++++++++++++++++++++-
 arch/powerpc/include/asm/pte-hash64.h  |  6 ++++
 arch/powerpc/platforms/Kconfig.cputype |  1 +
 3 files changed, 72 insertions(+), 1 deletion(-)

diff --git a/arch/powerpc/include/asm/pgtable.h b/arch/powerpc/include/asm/pgtable.h
index 7d6eacf..9d87125 100644
--- a/arch/powerpc/include/asm/pgtable.h
+++ b/arch/powerpc/include/asm/pgtable.h
@@ -3,6 +3,7 @@
 #ifdef __KERNEL__
 
 #ifndef __ASSEMBLY__
+#include <linux/mmdebug.h>
 #include <asm/processor.h>		/* For TASK_SIZE */
 #include <asm/mmu.h>
 #include <asm/page.h>
@@ -33,10 +34,73 @@ static inline int pte_dirty(pte_t pte)		{ return pte_val(pte) & _PAGE_DIRTY; }
 static inline int pte_young(pte_t pte)		{ return pte_val(pte) & _PAGE_ACCESSED; }
 static inline int pte_file(pte_t pte)		{ return pte_val(pte) & _PAGE_FILE; }
 static inline int pte_special(pte_t pte)	{ return pte_val(pte) & _PAGE_SPECIAL; }
-static inline int pte_present(pte_t pte)	{ return pte_val(pte) & _PAGE_PRESENT; }
 static inline int pte_none(pte_t pte)		{ return (pte_val(pte) & ~_PTE_NONE_MASK) == 0; }
 static inline pgprot_t pte_pgprot(pte_t pte)	{ return __pgprot(pte_val(pte) & PAGE_PROT_BITS); }
 
+#ifdef CONFIG_NUMA_BALANCING
+
+static inline int pte_present(pte_t pte)
+{
+	return pte_val(pte) & (_PAGE_PRESENT | _PAGE_NUMA);
+}
+
+#define pte_numa pte_numa
+static inline int pte_numa(pte_t pte)
+{
+	return (pte_val(pte) &
+		(_PAGE_NUMA|_PAGE_PRESENT)) == _PAGE_NUMA;
+}
+
+#define pte_mknonnuma pte_mknonnuma
+static inline pte_t pte_mknonnuma(pte_t pte)
+{
+	pte_val(pte) &= ~_PAGE_NUMA;
+	pte_val(pte) |=  _PAGE_PRESENT | _PAGE_ACCESSED;
+	return pte;
+}
+
+#define pte_mknuma pte_mknuma
+static inline pte_t pte_mknuma(pte_t pte)
+{
+	/*
+	 * We should not set _PAGE_NUMA on non present ptes. Also clear the
+	 * present bit so that hash_page will return 1 and we collect this
+	 * as numa fault.
+	 */
+	if (pte_present(pte)) {
+		pte_val(pte) |= _PAGE_NUMA;
+		pte_val(pte) &= ~_PAGE_PRESENT;
+	} else
+		VM_BUG_ON(1);
+	return pte;
+}
+
+#define pmd_numa pmd_numa
+static inline int pmd_numa(pmd_t pmd)
+{
+	return 0;
+}
+
+#define pmd_mknonnuma pmd_mknonnuma
+static inline pmd_t pmd_mknonnuma(pmd_t pmd)
+{
+	return pmd;
+}
+
+#define pmd_mknuma pmd_mknuma
+static inline pmd_t pmd_mknuma(pmd_t pmd)
+{
+	return pmd;
+}
+
+# else
+
+static inline int pte_present(pte_t pte)
+{
+	return pte_val(pte) & _PAGE_PRESENT;
+}
+#endif /* CONFIG_NUMA_BALANCING */
+
 /* Conversion functions: convert a page and protection to a page entry,
  * and a page entry and page directory to the page they refer to.
  *
diff --git a/arch/powerpc/include/asm/pte-hash64.h b/arch/powerpc/include/asm/pte-hash64.h
index 55aea0c..2505d8e 100644
--- a/arch/powerpc/include/asm/pte-hash64.h
+++ b/arch/powerpc/include/asm/pte-hash64.h
@@ -27,6 +27,12 @@
 #define _PAGE_RW		0x0200 /* software: user write access allowed */
 #define _PAGE_BUSY		0x0800 /* software: PTE & hash are busy */
 
+/*
+ * Used for tracking numa faults
+ */
+#define _PAGE_NUMA	0x00000010 /* Gather numa placement stats */
+
+
 /* No separate kernel read-only */
 #define _PAGE_KERNEL_RW		(_PAGE_RW | _PAGE_DIRTY) /* user access blocked by key */
 #define _PAGE_KERNEL_RO		 _PAGE_KERNEL_RW
diff --git a/arch/powerpc/platforms/Kconfig.cputype b/arch/powerpc/platforms/Kconfig.cputype
index 6704e2e..c9d6223 100644
--- a/arch/powerpc/platforms/Kconfig.cputype
+++ b/arch/powerpc/platforms/Kconfig.cputype
@@ -72,6 +72,7 @@ config PPC_BOOK3S_64
 	select PPC_HAVE_PMU_SUPPORT
 	select SYS_SUPPORTS_HUGETLBFS
 	select HAVE_ARCH_TRANSPARENT_HUGEPAGE if PPC_64K_PAGES
+	select ARCH_SUPPORTS_NUMA_BALANCING
 
 config PPC_BOOK3E_64
 	bool "Embedded processors"
-- 
1.8.3.2

^ permalink raw reply related

* Re: [PATCH 1/3] sched: Fix nohz_kick_needed to consider the nr_busy of the parent domain's group
From: Kamalesh Babulal @ 2013-10-22 14:35 UTC (permalink / raw)
  To: Vaidyanathan Srinivasan
  Cc: Michael Neuling, vincent.guittot, suresh.b.siddha, Peter Zijlstra,
	linuxppc-dev, linux-kernel, Mike Galbraith, Anton Blanchard,
	Preeti U Murthy, Paul Turner, Ingo Molnar
In-Reply-To: <20131021114442.13291.99344.stgit@drishya>

* Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> [2013-10-21 17:14:42]:

>  	for_each_domain(cpu, sd) {
> -		struct sched_group *sg = sd->groups;
> -		struct sched_group_power *sgp = sg->sgp;
> -		int nr_busy = atomic_read(&sgp->nr_busy_cpus);
> -
> -		if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
> -			goto need_kick_unlock;
> +		struct sched_domain *sd_parent = sd->parent;
> +		struct sched_group *sg;
> +		struct sched_group_power *sgp;
> +		int nr_busy;
> +
> +		if (sd_parent) {
> +			sg = sd_parent->groups;
> +			sgp = sg->sgp;
> +			nr_busy = atomic_read(&sgp->nr_busy_cpus);
> +
> +			if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
> +				goto need_kick_unlock;
> +		}
> 
>  		if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight
>  		    && (cpumask_first_and(nohz.idle_cpus_mask,

CC'ing Suresh Siddha and Vincent Guittot

Please correct me, If my understanding of idle balancing is wrong.
With proposed approach will not idle load balancer kick in, even if
there are busy cpus across groups or if there are 2 busy cpus which
are spread across sockets.

Consider 2 socket machine with 4 processors each (MC and NUMA domains).
If the machine is partial loaded such that cpus 0,4,5,6,7 are busy, then too
nohz balancing is triggered because with this approach
(NUMA)->groups->sgp->nr_busy_cpus is taken in account for nohz kick, while
iterating over MC domain.

Isn't idle load balancer not suppose kick in, even in the case of two busy
cpu's in a dual-core single socket system.

Thanks,
Kamalesh.

^ permalink raw reply

* Re: [PATCH 1/3] powerpc: sync ppc64, ppc64e and pseries configs
From: Nathan Fontenot @ 2013-10-22 15:34 UTC (permalink / raw)
  To: Anton Blanchard, benh, paulus; +Cc: linuxppc-dev
In-Reply-To: <20131022114450.296ae01d@kryten>

On 10/21/2013 07:44 PM, Anton Blanchard wrote:
> 
> Run savedefconfig over the ppc64, ppc64e and pseries config
> 
> Signed-off-by: Anton Blanchard <anton@samba.org>
> ---
> 
> Index: b/arch/powerpc/configs/ppc64_defconfig
> ===================================================================
> --- a/arch/powerpc/configs/ppc64_defconfig
> +++ b/arch/powerpc/configs/ppc64_defconfig
> @@ -2,7 +2,6 @@ CONFIG_PPC64=y
>  CONFIG_ALTIVEC=y
>  CONFIG_VSX=y
>  CONFIG_SMP=y
> -CONFIG_EXPERIMENTAL=y
>  CONFIG_SYSVIPC=y
>  CONFIG_POSIX_MQUEUE=y
>  CONFIG_IRQ_DOMAIN_DEBUG=y
> @@ -25,7 +24,6 @@ CONFIG_MODULE_UNLOAD=y
>  CONFIG_MODVERSIONS=y
>  CONFIG_MODULE_SRCVERSION_ALL=y
>  CONFIG_PARTITION_ADVANCED=y
> -CONFIG_EFI_PARTITION=y
>  CONFIG_PPC_SPLPAR=y
>  CONFIG_SCANLOG=m
>  CONFIG_PPC_SMLPAR=y
> @@ -50,12 +48,10 @@ CONFIG_CPU_FREQ_PMAC64=y
>  CONFIG_HZ_100=y
>  CONFIG_BINFMT_MISC=m
>  CONFIG_PPC_TRANSACTIONAL_MEM=y
> -CONFIG_HOTPLUG_CPU=y

It looks like your disabling hotplug cpu, is that correct?

You did this for all three config files.

-Nathan

>  CONFIG_KEXEC=y
>  CONFIG_IRQ_ALL_CPUS=y
>  CONFIG_MEMORY_HOTREMOVE=y
>  CONFIG_SCHED_SMT=y
> -CONFIG_PPC_DENORMALISATION=y
>  CONFIG_PCCARD=y
>  CONFIG_ELECTRA_CF=y
>  CONFIG_HOTPLUG_PCI=y
> @@ -89,7 +85,6 @@ CONFIG_NF_CONNTRACK_PPTP=m
>  CONFIG_NF_CONNTRACK_SIP=m
>  CONFIG_NF_CONNTRACK_TFTP=m
>  CONFIG_NF_CT_NETLINK=m
> -CONFIG_NETFILTER_TPROXY=m
>  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
>  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
>  CONFIG_NETFILTER_XT_TARGET_DSCP=m
> @@ -131,7 +126,6 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m
>  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
>  CONFIG_NETFILTER_XT_MATCH_U32=m
>  CONFIG_NF_CONNTRACK_IPV4=m
> -CONFIG_IP_NF_QUEUE=m
>  CONFIG_IP_NF_IPTABLES=m
>  CONFIG_IP_NF_MATCH_AH=m
>  CONFIG_IP_NF_MATCH_ECN=m
> @@ -216,6 +210,7 @@ CONFIG_DUMMY=m
>  CONFIG_NETCONSOLE=y
>  CONFIG_NETPOLL_TRAP=y
>  CONFIG_TUN=m
> +CONFIG_VHOST_NET=m
>  CONFIG_VORTEX=y
>  CONFIG_ACENIC=m
>  CONFIG_ACENIC_OMIT_TIGON_I=y
> @@ -301,7 +296,6 @@ CONFIG_HID_GYRATION=y
>  CONFIG_HID_PANTHERLORD=y
>  CONFIG_HID_PETALYNX=y
>  CONFIG_HID_SAMSUNG=y
> -CONFIG_HID_SONY=y
>  CONFIG_HID_SUNPLUS=y
>  CONFIG_USB_HIDDEV=y
>  CONFIG_USB=y
> @@ -386,21 +380,19 @@ CONFIG_NLS_UTF8=y
>  CONFIG_CRC_T10DIF=y
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_DEBUG_KERNEL=y
> +CONFIG_DEBUG_STACK_USAGE=y
> +CONFIG_DEBUG_STACKOVERFLOW=y
>  CONFIG_LOCKUP_DETECTOR=y
>  CONFIG_DEBUG_MUTEXES=y
> -CONFIG_DEBUG_STACK_USAGE=y
>  CONFIG_LATENCYTOP=y
>  CONFIG_SCHED_TRACER=y
>  CONFIG_BLK_DEV_IO_TRACE=y
> -CONFIG_DEBUG_STACKOVERFLOW=y
>  CONFIG_CODE_PATCHING_SELFTEST=y
>  CONFIG_FTR_FIXUP_SELFTEST=y
>  CONFIG_MSI_BITMAP_SELFTEST=y
>  CONFIG_XMON=y
>  CONFIG_BOOTX_TEXT=y
>  CONFIG_PPC_EARLY_DEBUG=y
> -CONFIG_PPC_EARLY_DEBUG_BOOTX=y
> -CONFIG_CRYPTO_NULL=m
>  CONFIG_CRYPTO_TEST=m
>  CONFIG_CRYPTO_PCBC=m
>  CONFIG_CRYPTO_HMAC=y
> @@ -422,4 +414,3 @@ CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
>  CONFIG_VIRTUALIZATION=y
>  CONFIG_KVM_BOOK3S_64=m
>  CONFIG_KVM_BOOK3S_64_HV=y
> -CONFIG_VHOST_NET=m
> Index: b/arch/powerpc/configs/ppc64e_defconfig
> ===================================================================
> --- a/arch/powerpc/configs/ppc64e_defconfig
> +++ b/arch/powerpc/configs/ppc64e_defconfig
> @@ -1,7 +1,6 @@
>  CONFIG_PPC64=y
>  CONFIG_PPC_BOOK3E_64=y
>  CONFIG_SMP=y
> -CONFIG_EXPERIMENTAL=y
>  CONFIG_SYSVIPC=y
>  CONFIG_POSIX_MQUEUE=y
>  CONFIG_NO_HZ=y
> @@ -22,7 +21,6 @@ CONFIG_MODVERSIONS=y
>  CONFIG_MODULE_SRCVERSION_ALL=y
>  CONFIG_PARTITION_ADVANCED=y
>  CONFIG_MAC_PARTITION=y
> -CONFIG_EFI_PARTITION=y
>  CONFIG_P5020_DS=y
>  CONFIG_CPU_FREQ=y
>  CONFIG_CPU_FREQ_GOV_POWERSAVE=y
> @@ -61,7 +59,6 @@ CONFIG_NF_CONNTRACK_PPTP=m
>  CONFIG_NF_CONNTRACK_SIP=m
>  CONFIG_NF_CONNTRACK_TFTP=m
>  CONFIG_NF_CT_NETLINK=m
> -CONFIG_NETFILTER_TPROXY=m
>  CONFIG_NETFILTER_XT_TARGET_CLASSIFY=m
>  CONFIG_NETFILTER_XT_TARGET_CONNMARK=m
>  CONFIG_NETFILTER_XT_TARGET_DSCP=m
> @@ -103,7 +100,6 @@ CONFIG_NETFILTER_XT_MATCH_STRING=m
>  CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
>  CONFIG_NETFILTER_XT_MATCH_U32=m
>  CONFIG_NF_CONNTRACK_IPV4=m
> -CONFIG_IP_NF_QUEUE=m
>  CONFIG_IP_NF_IPTABLES=m
>  CONFIG_IP_NF_MATCH_AH=m
>  CONFIG_IP_NF_MATCH_ECN=m
> @@ -193,7 +189,6 @@ CONFIG_PPP_SYNC_TTY=m
>  CONFIG_INPUT_EVDEV=m
>  CONFIG_INPUT_MISC=y
>  # CONFIG_SERIO_SERPORT is not set
> -CONFIG_VT_HW_CONSOLE_BINDING=y
>  CONFIG_SERIAL_8250=y
>  CONFIG_SERIAL_8250_CONSOLE=y
>  # CONFIG_HW_RANDOM is not set
> @@ -230,7 +225,6 @@ CONFIG_HID_NTRIG=y
>  CONFIG_HID_PANTHERLORD=y
>  CONFIG_HID_PETALYNX=y
>  CONFIG_HID_SAMSUNG=y
> -CONFIG_HID_SONY=y
>  CONFIG_HID_SUNPLUS=y
>  CONFIG_HID_GREENASIA=y
>  CONFIG_HID_SMARTJOYPLUS=y
> @@ -302,19 +296,18 @@ CONFIG_NLS_UTF8=y
>  CONFIG_CRC_T10DIF=y
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_DEBUG_KERNEL=y
> +CONFIG_DEBUG_STACK_USAGE=y
> +CONFIG_DEBUG_STACKOVERFLOW=y
>  CONFIG_DETECT_HUNG_TASK=y
>  CONFIG_DEBUG_MUTEXES=y
> -CONFIG_DEBUG_STACK_USAGE=y
>  CONFIG_LATENCYTOP=y
>  CONFIG_IRQSOFF_TRACER=y
>  CONFIG_SCHED_TRACER=y
>  CONFIG_BLK_DEV_IO_TRACE=y
> -CONFIG_DEBUG_STACKOVERFLOW=y
>  CONFIG_CODE_PATCHING_SELFTEST=y
>  CONFIG_FTR_FIXUP_SELFTEST=y
>  CONFIG_MSI_BITMAP_SELFTEST=y
>  CONFIG_XMON=y
> -CONFIG_CRYPTO_NULL=m
>  CONFIG_CRYPTO_TEST=m
>  CONFIG_CRYPTO_CCM=m
>  CONFIG_CRYPTO_GCM=m
> Index: b/arch/powerpc/configs/pseries_defconfig
> ===================================================================
> --- a/arch/powerpc/configs/pseries_defconfig
> +++ b/arch/powerpc/configs/pseries_defconfig
> @@ -3,7 +3,6 @@ CONFIG_ALTIVEC=y
>  CONFIG_VSX=y
>  CONFIG_SMP=y
>  CONFIG_NR_CPUS=2048
> -CONFIG_EXPERIMENTAL=y
>  CONFIG_SYSVIPC=y
>  CONFIG_POSIX_MQUEUE=y
>  CONFIG_AUDIT=y
> @@ -33,7 +32,6 @@ CONFIG_MODULE_UNLOAD=y
>  CONFIG_MODVERSIONS=y
>  CONFIG_MODULE_SRCVERSION_ALL=y
>  CONFIG_PARTITION_ADVANCED=y
> -CONFIG_EFI_PARTITION=y
>  CONFIG_PPC_SPLPAR=y
>  CONFIG_SCANLOG=m
>  CONFIG_PPC_SMLPAR=y
> @@ -44,7 +42,6 @@ CONFIG_IBMEBUS=y
>  CONFIG_HZ_100=y
>  CONFIG_BINFMT_MISC=m
>  CONFIG_PPC_TRANSACTIONAL_MEM=y
> -CONFIG_HOTPLUG_CPU=y
>  CONFIG_KEXEC=y
>  CONFIG_IRQ_ALL_CPUS=y
>  CONFIG_MEMORY_HOTPLUG=y
> @@ -52,7 +49,6 @@ CONFIG_MEMORY_HOTREMOVE=y
>  CONFIG_PPC_64K_PAGES=y
>  CONFIG_PPC_SUBPAGE_PROT=y
>  CONFIG_SCHED_SMT=y
> -CONFIG_PPC_DENORMALISATION=y
>  CONFIG_HOTPLUG_PCI=y
>  CONFIG_HOTPLUG_PCI_RPA=m
>  CONFIG_HOTPLUG_PCI_RPA_DLPAR=m
> @@ -113,7 +109,6 @@ CONFIG_NETFILTER_XT_MATCH_TCPMSS=m
>  CONFIG_NETFILTER_XT_MATCH_TIME=m
>  CONFIG_NETFILTER_XT_MATCH_U32=m
>  CONFIG_NF_CONNTRACK_IPV4=m
> -CONFIG_IP_NF_QUEUE=m
>  CONFIG_IP_NF_IPTABLES=m
>  CONFIG_IP_NF_MATCH_AH=m
>  CONFIG_IP_NF_MATCH_ECN=m
> @@ -179,6 +174,7 @@ CONFIG_DUMMY=m
>  CONFIG_NETCONSOLE=y
>  CONFIG_NETPOLL_TRAP=y
>  CONFIG_TUN=m
> +CONFIG_VHOST_NET=m
>  CONFIG_VORTEX=y
>  CONFIG_ACENIC=m
>  CONFIG_ACENIC_OMIT_TIGON_I=y
> @@ -237,7 +233,6 @@ CONFIG_HID_GYRATION=y
>  CONFIG_HID_PANTHERLORD=y
>  CONFIG_HID_PETALYNX=y
>  CONFIG_HID_SAMSUNG=y
> -CONFIG_HID_SONY=y
>  CONFIG_HID_SUNPLUS=y
>  CONFIG_USB_HIDDEV=y
>  CONFIG_USB=y
> @@ -314,18 +309,17 @@ CONFIG_NLS_UTF8=y
>  CONFIG_CRC_T10DIF=y
>  CONFIG_MAGIC_SYSRQ=y
>  CONFIG_DEBUG_KERNEL=y
> -CONFIG_LOCKUP_DETECTOR=y
>  CONFIG_DEBUG_STACK_USAGE=y
> +CONFIG_DEBUG_STACKOVERFLOW=y
> +CONFIG_LOCKUP_DETECTOR=y
>  CONFIG_LATENCYTOP=y
>  CONFIG_SCHED_TRACER=y
>  CONFIG_BLK_DEV_IO_TRACE=y
> -CONFIG_DEBUG_STACKOVERFLOW=y
>  CONFIG_CODE_PATCHING_SELFTEST=y
>  CONFIG_FTR_FIXUP_SELFTEST=y
>  CONFIG_MSI_BITMAP_SELFTEST=y
>  CONFIG_XMON=y
>  CONFIG_XMON_DEFAULT=y
> -CONFIG_CRYPTO_NULL=m
>  CONFIG_CRYPTO_TEST=m
>  CONFIG_CRYPTO_PCBC=m
>  CONFIG_CRYPTO_HMAC=y
> @@ -347,4 +341,3 @@ CONFIG_CRYPTO_DEV_NX_ENCRYPT=m
>  CONFIG_VIRTUALIZATION=y
>  CONFIG_KVM_BOOK3S_64=m
>  CONFIG_KVM_BOOK3S_64_HV=y
> -CONFIG_VHOST_NET=m
> _______________________________________________
> Linuxppc-dev mailing list
> Linuxppc-dev@lists.ozlabs.org
> https://lists.ozlabs.org/listinfo/linuxppc-dev
> 

^ permalink raw reply

* Re: [PATCH 1/3] sched: Fix nohz_kick_needed to consider the nr_busy of the parent domain's group
From: Preeti U Murthy @ 2013-10-22 16:40 UTC (permalink / raw)
  To: Kamalesh Babulal
  Cc: Michael Neuling, vincent.guittot, suresh.b.siddha, Peter Zijlstra,
	linuxppc-dev, linux-kernel, Mike Galbraith, Anton Blanchard,
	Paul Turner, Ingo Molnar
In-Reply-To: <20131022143559.GA3197@linux.vnet.ibm.com>

Hi Kamalesh,

On 10/22/2013 08:05 PM, Kamalesh Babulal wrote:
> * Vaidyanathan Srinivasan <svaidy@linux.vnet.ibm.com> [2013-10-21 17:14:42]:
> 
>>  	for_each_domain(cpu, sd) {
>> -		struct sched_group *sg = sd->groups;
>> -		struct sched_group_power *sgp = sg->sgp;
>> -		int nr_busy = atomic_read(&sgp->nr_busy_cpus);
>> -
>> -		if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
>> -			goto need_kick_unlock;
>> +		struct sched_domain *sd_parent = sd->parent;
>> +		struct sched_group *sg;
>> +		struct sched_group_power *sgp;
>> +		int nr_busy;
>> +
>> +		if (sd_parent) {
>> +			sg = sd_parent->groups;
>> +			sgp = sg->sgp;
>> +			nr_busy = atomic_read(&sgp->nr_busy_cpus);
>> +
>> +			if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
>> +				goto need_kick_unlock;
>> +		}
>>
>>  		if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight
>>  		    && (cpumask_first_and(nohz.idle_cpus_mask,
> 
> CC'ing Suresh Siddha and Vincent Guittot
> 
> Please correct me, If my understanding of idle balancing is wrong.
> With proposed approach will not idle load balancer kick in, even if
> there are busy cpus across groups or if there are 2 busy cpus which
> are spread across sockets.

Yes load balancing will happen on busy cpus periodically.

Wrt idle balancing there are two points here. One, when a CPU is just
about to go idle, it will enter idle_balance(), and trigger load
balancing with itself being the destination CPU to begin with. It will
load balance at every level of the sched domain that it belongs to. If
it manages to pull tasks, good, else it will enter an idle state.

nohz_idle_balancing is triggered by a busy cpu at every tick if it has
more than one task in its runqueue or if it belongs to a group that
shares the package resources and has more than one cpu busy. By
"nohz_idle_balance triggered", it means the busy cpu will send an ipi to
the ilb_cpu to do load balancing on the behalf of the idle cpus in the
nohz mask.

So to answer your question wrt this patch, if there is one busy cpu with
say 2 tasks in one socket and another busy cpu with 1 task on another
socket, the former busy cpu can kick nohz_idle_balance since it has more
than one task in its runqueue. An idle cpu in either socket could be
woken up to balance tasks with it.

The usual idle load balancer that runs on a CPU about to become idle
could pull from either cpu depending on who is more busy as it begins to
load balance across all levels of sched domain that it belongs to.
> 
> Consider 2 socket machine with 4 processors each (MC and NUMA domains).
> If the machine is partial loaded such that cpus 0,4,5,6,7 are busy, then too
> nohz balancing is triggered because with this approach
> (NUMA)->groups->sgp->nr_busy_cpus is taken in account for nohz kick, while
> iterating over MC domain.

For the example that you mention, you will have a CPU domain and a NUMA
domain. When the sockets are NUMA nodes, each socket will belong to a
CPU domain. If the sockets are non-numa nodes, then the domain
encompassing both the nodes will be a CPU domain, possibly with each
socket being an MC domain.
> 
> Isn't idle load balancer not suppose kick in, even in the case of two busy
> cpu's in a dual-core single socket system

nohz_idle_balancing is a special case. It is triggered when the
conditions mentioned in nohz_kick_needed() are true. A CPU just about to
go idle will trigger load balancing without any pre-conditions.

In a single socket machine, there will be a CPU domain encompassing the
socket and the MC domain will encompass a core. nohz_idle load balancer
will kick in if both the threads in the core have tasks running on them.
This is fair enough because the threads share the resources of the core.

Regards
Preeti U Murthy
> 
> Thanks,
> Kamalesh.
> 

^ permalink raw reply

* [RFC PATCH 2/9] powerpc: Free up _PAGE_COHERENCE for numa fault use later
From: Aneesh Kumar K.V @ 2013-10-22 11:28 UTC (permalink / raw)
  To: benh, paulus, linux-mm; +Cc: linuxppc-dev, Aneesh Kumar K.V
In-Reply-To: <1382441300-1513-1-git-send-email-aneesh.kumar@linux.vnet.ibm.com>

From: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com>

Set  memory coherence always on hash64 config. If
a platform cannot have memory coherence always set they
can infer that from _PAGE_NO_CACHE and _PAGE_WRITETHRU
like in lpar. So we dont' really need a separate bit
for tracking _PAGE_COHERENCE.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com>
---
 arch/powerpc/include/asm/pte-hash64.h |  2 +-
 arch/powerpc/mm/hash_low_64.S         | 15 ++++++++++++---
 arch/powerpc/mm/hash_utils_64.c       |  7 ++++---
 arch/powerpc/mm/hugepage-hash64.c     |  6 +++++-
 arch/powerpc/mm/hugetlbpage-hash64.c  |  4 ++++
 5 files changed, 26 insertions(+), 8 deletions(-)

diff --git a/arch/powerpc/include/asm/pte-hash64.h b/arch/powerpc/include/asm/pte-hash64.h
index 0419eeb..55aea0c 100644
--- a/arch/powerpc/include/asm/pte-hash64.h
+++ b/arch/powerpc/include/asm/pte-hash64.h
@@ -19,7 +19,7 @@
 #define _PAGE_FILE		0x0002 /* (!present only) software: pte holds file offset */
 #define _PAGE_EXEC		0x0004 /* No execute on POWER4 and newer (we invert) */
 #define _PAGE_GUARDED		0x0008
-#define _PAGE_COHERENT		0x0010 /* M: enforce memory coherence (SMP systems) */
+/* We can derive Memory coherence from _PAGE_NO_CACHE */
 #define _PAGE_NO_CACHE		0x0020 /* I: cache inhibit */
 #define _PAGE_WRITETHRU		0x0040 /* W: cache write-through */
 #define _PAGE_DIRTY		0x0080 /* C: page changed */
diff --git a/arch/powerpc/mm/hash_low_64.S b/arch/powerpc/mm/hash_low_64.S
index d3cbda6..1136d26 100644
--- a/arch/powerpc/mm/hash_low_64.S
+++ b/arch/powerpc/mm/hash_low_64.S
@@ -148,7 +148,10 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
 	and	r0,r0,r4		/* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/
 	andc	r0,r30,r0		/* r0 = pte & ~r0 */
 	rlwimi	r3,r0,32-1,31,31	/* Insert result into PP lsb */
-	ori	r3,r3,HPTE_R_C		/* Always add "C" bit for perf. */
+	/*
+	 * Always add "C" bit for perf. Memory coherence is always enabled
+	 */
+	ori	r3,r3,HPTE_R_C | HPTE_R_M
 
 	/* We eventually do the icache sync here (maybe inline that
 	 * code rather than call a C function...) 
@@ -457,7 +460,10 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
 	and	r0,r0,r4		/* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/
 	andc	r0,r3,r0		/* r0 = pte & ~r0 */
 	rlwimi	r3,r0,32-1,31,31	/* Insert result into PP lsb */
-	ori	r3,r3,HPTE_R_C		/* Always add "C" bit for perf. */
+	/*
+	 * Always add "C" bit for perf. Memory coherence is always enabled
+	 */
+	ori	r3,r3,HPTE_R_C | HPTE_R_M
 
 	/* We eventually do the icache sync here (maybe inline that
 	 * code rather than call a C function...)
@@ -795,7 +801,10 @@ END_MMU_FTR_SECTION_IFSET(MMU_FTR_1T_SEGMENT)
 	and	r0,r0,r4		/* _PAGE_RW & _PAGE_DIRTY ->r0 bit 30*/
 	andc	r0,r30,r0		/* r0 = pte & ~r0 */
 	rlwimi	r3,r0,32-1,31,31	/* Insert result into PP lsb */
-	ori	r3,r3,HPTE_R_C		/* Always add "C" bit for perf. */
+	/*
+	 * Always add "C" bit for perf. Memory coherence is always enabled
+	 */
+	ori	r3,r3,HPTE_R_C | HPTE_R_M
 
 	/* We eventually do the icache sync here (maybe inline that
 	 * code rather than call a C function...)
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
index bde8b55..fb176e9 100644
--- a/arch/powerpc/mm/hash_utils_64.c
+++ b/arch/powerpc/mm/hash_utils_64.c
@@ -169,9 +169,10 @@ static unsigned long htab_convert_pte_flags(unsigned long pteflags)
 	if ((pteflags & _PAGE_USER) && !((pteflags & _PAGE_RW) &&
 					 (pteflags & _PAGE_DIRTY)))
 		rflags |= 1;
-
-	/* Always add C */
-	return rflags | HPTE_R_C;
+	/*
+	 * Always add "C" bit for perf. Memory coherence is always enabled
+	 */
+	return rflags | HPTE_R_C | HPTE_R_M;
 }
 
 int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
diff --git a/arch/powerpc/mm/hugepage-hash64.c b/arch/powerpc/mm/hugepage-hash64.c
index 34de9e0..826893f 100644
--- a/arch/powerpc/mm/hugepage-hash64.c
+++ b/arch/powerpc/mm/hugepage-hash64.c
@@ -127,7 +127,11 @@ repeat:
 
 		/* Add in WIMG bits */
 		rflags |= (new_pmd & (_PAGE_WRITETHRU | _PAGE_NO_CACHE |
-				      _PAGE_COHERENT | _PAGE_GUARDED));
+				      _PAGE_GUARDED));
+		/*
+		 * enable the memory coherence always
+		 */
+		rflags |= HPTE_R_M;
 
 		/* Insert into the hash table, primary slot */
 		slot = ppc_md.hpte_insert(hpte_group, vpn, pa, rflags, 0,
diff --git a/arch/powerpc/mm/hugetlbpage-hash64.c b/arch/powerpc/mm/hugetlbpage-hash64.c
index 0b7fb67..a5bcf93 100644
--- a/arch/powerpc/mm/hugetlbpage-hash64.c
+++ b/arch/powerpc/mm/hugetlbpage-hash64.c
@@ -99,6 +99,10 @@ int __hash_page_huge(unsigned long ea, unsigned long access, unsigned long vsid,
 		/* Add in WIMG bits */
 		rflags |= (new_pte & (_PAGE_WRITETHRU | _PAGE_NO_CACHE |
 				      _PAGE_COHERENT | _PAGE_GUARDED));
+		/*
+		 * enable the memory coherence always
+		 */
+		rflags |= HPTE_R_M;
 
 		slot = hpte_insert_repeating(hash, vpn, pa, rflags, 0,
 					     mmu_psize, ssize);
-- 
1.8.3.2

^ permalink raw reply related

* Re: [PATCH 1/3] sched: Fix nohz_kick_needed to consider the nr_busy of the parent domain's group
From: Peter Zijlstra @ 2013-10-22 22:11 UTC (permalink / raw)
  To: Vaidyanathan Srinivasan
  Cc: Michael Neuling, Mike Galbraith, linuxppc-dev, linux-kernel,
	Anton Blanchard, Preeti U Murthy, Paul Turner, Ingo Molnar
In-Reply-To: <20131021114442.13291.99344.stgit@drishya>

On Mon, Oct 21, 2013 at 05:14:42PM +0530, Vaidyanathan Srinivasan wrote:
>  kernel/sched/fair.c |   19 +++++++++++++------
>  1 file changed, 13 insertions(+), 6 deletions(-)
> 
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 7c70201..12f0eab 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -5807,12 +5807,19 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
>  
>  	rcu_read_lock();
>  	for_each_domain(cpu, sd) {
> +		struct sched_domain *sd_parent = sd->parent;
> +		struct sched_group *sg;
> +		struct sched_group_power *sgp;
> +		int nr_busy;
> +
> +		if (sd_parent) {
> +			sg = sd_parent->groups;
> +			sgp = sg->sgp;
> +			nr_busy = atomic_read(&sgp->nr_busy_cpus);
> +
> +			if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
> +				goto need_kick_unlock;
> +		}
>  
>  		if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight
>  		    && (cpumask_first_and(nohz.idle_cpus_mask,
> 

Almost I'd say; what happens on !sd_parent && SD_ASYM_PACKING ?

Also, this made me look at the nr_busy stuff again, and somehow that
entire thing makes me a little sad.

Can't we do something like the below and cut that nr_busy sd iteration
short?

This nohz stuff really needs to be re-thought and made more scalable --
its a royal pain :/


 kernel/sched/core.c  |  4 ++++
 kernel/sched/fair.c  | 21 +++++++++++++++------
 kernel/sched/sched.h |  5 ++---
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index c06b8d3..89db8dc 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -5271,6 +5271,7 @@ DEFINE_PER_CPU(struct sched_domain *, sd_llc);
 DEFINE_PER_CPU(int, sd_llc_size);
 DEFINE_PER_CPU(int, sd_llc_id);
 DEFINE_PER_CPU(struct sched_domain *, sd_numa);
+DEFINE_PER_CPU(struct sched_domain *, sd_busy);
 
 static void update_top_cache_domain(int cpu)
 {
@@ -5290,6 +5291,9 @@ static void update_top_cache_domain(int cpu)
 
 	sd = lowest_flag_domain(cpu, SD_NUMA);
 	rcu_assign_pointer(per_cpu(sd_numa, cpu), sd);
+
+	sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES | SD_ASYM_PACKING);
+	rcu_assign_pointer(per_cpu(sd_busy, cpu), sd);
 }
 
 /*
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
index 813dd61..3d5141e 100644
--- a/kernel/sched/fair.c
+++ b/kernel/sched/fair.c
@@ -6512,19 +6512,23 @@ static inline void nohz_balance_exit_idle(int cpu)
 	}
 }
 
-static inline void set_cpu_sd_state_busy(void)
+static inline void set_cpu_sd_state_busy(int cpu)
 {
 	struct sched_domain *sd;
+	struct rq *rq = cpu_rq(cpu);
 
 	rcu_read_lock();
-	sd = rcu_dereference_check_sched_domain(this_rq()->sd);
+	sd = rcu_dereference_check_sched_domain(rq->sd);
 
 	if (!sd || !sd->nohz_idle)
 		goto unlock;
 	sd->nohz_idle = 0;
 
-	for (; sd; sd = sd->parent)
+	for (; sd; sd = sd->parent) {
 		atomic_inc(&sd->groups->sgp->nr_busy_cpus);
+		if (sd == per_cpu(sd_busy, cpu))
+			break;
+	}
 unlock:
 	rcu_read_unlock();
 }
@@ -6532,16 +6536,21 @@ static inline void set_cpu_sd_state_busy(void)
 void set_cpu_sd_state_idle(void)
 {
 	struct sched_domain *sd;
+	int cpu = smp_processor_id();
+	struct rq *rq = cpu_rq(cpu);
 
 	rcu_read_lock();
-	sd = rcu_dereference_check_sched_domain(this_rq()->sd);
+	sd = rcu_dereference_check_sched_domain(rq->sd);
 
 	if (!sd || sd->nohz_idle)
 		goto unlock;
 	sd->nohz_idle = 1;
 
-	for (; sd; sd = sd->parent)
+	for (; sd; sd = sd->parent) {
 		atomic_dec(&sd->groups->sgp->nr_busy_cpus);
+		if (sd == per_cpu(sd_busy, cpu))
+			break;
+	}
 unlock:
 	rcu_read_unlock();
 }
@@ -6756,7 +6765,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
 	* We may be recently in ticked or tickless idle mode. At the first
 	* busy tick after returning from idle, we will update the busy stats.
 	*/
-	set_cpu_sd_state_busy();
+	set_cpu_sd_state_busy(cpu);
 	nohz_balance_exit_idle(cpu);
 
 	/*
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index ffc7087..80c5fd2 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -599,9 +599,8 @@ static inline struct sched_domain *highest_flag_domain(int cpu, int flag)
 	struct sched_domain *sd, *hsd = NULL;
 
 	for_each_domain(cpu, sd) {
-		if (!(sd->flags & flag))
-			break;
-		hsd = sd;
+		if (sd->flags & flag)
+			hsd = sd;
 	}
 
 	return hsd;

^ permalink raw reply related

* Re: [PATCH 2/3] sched: Fix asymmetric scheduling for POWER7
From: Peter Zijlstra @ 2013-10-22 22:18 UTC (permalink / raw)
  To: Vaidyanathan Srinivasan
  Cc: Michael Neuling, Mike Galbraith, linuxppc-dev, linux-kernel,
	Anton Blanchard, Preeti U Murthy, Paul Turner, Ingo Molnar
In-Reply-To: <20131021114452.13291.19947.stgit@drishya>

On Mon, Oct 21, 2013 at 05:14:52PM +0530, Vaidyanathan Srinivasan wrote:
>  kernel/sched/fair.c |    4 ++--
>  1 file changed, 2 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 12f0eab..828ed97 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -5821,8 +5821,8 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
>  				goto need_kick_unlock;
>  		}
>  
> -		if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight
> -		    && (cpumask_first_and(nohz.idle_cpus_mask,
> +		if (sd->flags & SD_ASYM_PACKING &&
> +			(cpumask_first_and(nohz.idle_cpus_mask,
>  					  sched_domain_span(sd)) < cpu))
>  			goto need_kick_unlock;
>  
> 

Ahh, so here you remove the nr_busy usage.. this patch should really go
before the first one that makes this all weird and funny.

^ permalink raw reply

* Re: [PATCH 3/3] sched: Aggressive balance in domains whose groups share package resources
From: Peter Zijlstra @ 2013-10-22 22:23 UTC (permalink / raw)
  To: Vaidyanathan Srinivasan
  Cc: Michael Neuling, Mike Galbraith, linuxppc-dev, linux-kernel,
	Anton Blanchard, Preeti U Murthy, Paul Turner, Ingo Molnar
In-Reply-To: <20131021114502.13291.60794.stgit@drishya>

On Mon, Oct 21, 2013 at 05:15:02PM +0530, Vaidyanathan Srinivasan wrote:
>  kernel/sched/fair.c |   18 ++++++++++++++++++
>  1 file changed, 18 insertions(+)
> 
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 828ed97..bbcd96b 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -5165,6 +5165,8 @@ static int load_balance(int this_cpu, struct rq *this_rq,
>  {
>  	int ld_moved, cur_ld_moved, active_balance = 0;
>  	struct sched_group *group;
> +	struct sched_domain *child;
> +	int share_pkg_res = 0;
>  	struct rq *busiest;
>  	unsigned long flags;
>  	struct cpumask *cpus = __get_cpu_var(load_balance_mask);
> @@ -5190,6 +5192,10 @@ static int load_balance(int this_cpu, struct rq *this_rq,
>  
>  	schedstat_inc(sd, lb_count[idle]);
>  
> +	child = sd->child;
> +	if (child && child->flags & SD_SHARE_PKG_RESOURCES)
> +		share_pkg_res = 1;
> +
>  redo:
>  	if (!should_we_balance(&env)) {
>  		*continue_balancing = 0;
> @@ -5202,6 +5208,7 @@ redo:
>  		goto out_balanced;
>  	}
>  
> +redo_grp:
>  	busiest = find_busiest_queue(&env, group);
>  	if (!busiest) {
>  		schedstat_inc(sd, lb_nobusyq[idle]);
> @@ -5292,6 +5299,11 @@ more_balance:
>  			if (!cpumask_empty(cpus)) {
>  				env.loop = 0;
>  				env.loop_break = sched_nr_migrate_break;
> +				if (share_pkg_res &&
> +					cpumask_intersects(cpus,
> +						to_cpumask(group->cpumask)))

sched_group_cpus()

> +					goto redo_grp;
> +
>  				goto redo;
>  			}
>  			goto out_balanced;
> @@ -5318,9 +5330,15 @@ more_balance:
>  			 */
>  			if (!cpumask_test_cpu(this_cpu,
>  					tsk_cpus_allowed(busiest->curr))) {
> +				cpumask_clear_cpu(cpu_of(busiest), cpus);
>  				raw_spin_unlock_irqrestore(&busiest->lock,
>  							    flags);
>  				env.flags |= LBF_ALL_PINNED;
> +				if (share_pkg_res &&
> +					cpumask_intersects(cpus,
> +						to_cpumask(group->cpumask)))
> +					goto redo_grp;
> +
>  				goto out_one_pinned;
>  			}

Man this retry logic is getting annoying.. isn't there anything saner we
can do?

^ permalink raw reply

* perf events ring buffer memory barrier on powerpc
From: Michael Neuling @ 2013-10-22 23:54 UTC (permalink / raw)
  To: Frederic Weisbecker, benh, anton, linux-kernel, Linux PPC dev,
	Victor Kaplansky, Mathieu Desnoyers, michael

Frederic,

In the perf ring buffer code we have this in perf_output_get_handle():

	if (!local_dec_and_test(&rb->nest))
		goto out;

	/*
	 * Publish the known good head. Rely on the full barrier implied
	 * by atomic_dec_and_test() order the rb->head read and this
	 * write.
	 */
	rb->user_page->data_head = head;

The comment says atomic_dec_and_test() but the code is
local_dec_and_test().

On powerpc, local_dec_and_test() doesn't have a memory barrier but
atomic_dec_and_test() does.  Is the comment wrong, or is
local_dec_and_test() suppose to imply a memory barrier too and we have
it wrongly implemented in powerpc?

My guess is that local_dec_and_test() is correct but we to add an
explicit memory barrier like below:

(Kudos to Victor Kaplansky for finding this)

Mikey

diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
index cd55144..95768c6 100644
--- a/kernel/events/ring_buffer.c
+++ b/kernel/events/ring_buffer.c
@@ -87,10 +87,10 @@ again:
 		goto out;
 
 	/*
-	 * Publish the known good head. Rely on the full barrier implied
-	 * by atomic_dec_and_test() order the rb->head read and this
-	 * write.
+	 * Publish the known good head. We need a memory barrier to order the
+	 * order the rb->head read and this write.
 	 */
+	smp_mb ();
 	rb->user_page->data_head = head;
 
 	/*

^ permalink raw reply related

* Re: [PATCH 1/3] sched: Fix nohz_kick_needed to consider the nr_busy of the parent domain's group
From: Preeti U Murthy @ 2013-10-23  4:00 UTC (permalink / raw)
  To: Peter Zijlstra
  Cc: Michael Neuling, Mike Galbraith, linuxppc-dev, linux-kernel,
	Anton Blanchard, Paul Turner, Ingo Molnar
In-Reply-To: <20131022221138.GJ2490@laptop.programming.kicks-ass.net>

Hi Peter,

On 10/23/2013 03:41 AM, Peter Zijlstra wrote:
> On Mon, Oct 21, 2013 at 05:14:42PM +0530, Vaidyanathan Srinivasan wrote:
>>  kernel/sched/fair.c |   19 +++++++++++++------
>>  1 file changed, 13 insertions(+), 6 deletions(-)
>>
>> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
>> index 7c70201..12f0eab 100644
>> --- a/kernel/sched/fair.c
>> +++ b/kernel/sched/fair.c
>> @@ -5807,12 +5807,19 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
>>  
>>  	rcu_read_lock();
>>  	for_each_domain(cpu, sd) {
>> +		struct sched_domain *sd_parent = sd->parent;
>> +		struct sched_group *sg;
>> +		struct sched_group_power *sgp;
>> +		int nr_busy;
>> +
>> +		if (sd_parent) {
>> +			sg = sd_parent->groups;
>> +			sgp = sg->sgp;
>> +			nr_busy = atomic_read(&sgp->nr_busy_cpus);
>> +
>> +			if (sd->flags & SD_SHARE_PKG_RESOURCES && nr_busy > 1)
>> +				goto need_kick_unlock;
>> +		}
>>  
>>  		if (sd->flags & SD_ASYM_PACKING && nr_busy != sg->group_weight
>>  		    && (cpumask_first_and(nohz.idle_cpus_mask,
>>
> 
> Almost I'd say; what happens on !sd_parent && SD_ASYM_PACKING ?

You are right, sorry about this. The idea was to correct the nr_busy
computation before the patch that would remove its usage in the second
patch. But that would mean the condition nr_busy != sg->group_weight
would be invalid with this patch. The second patch needs to go first to
avoid this confusion.

> 
> Also, this made me look at the nr_busy stuff again, and somehow that
> entire thing makes me a little sad.
> 
> Can't we do something like the below and cut that nr_busy sd iteration
> short?

We can surely cut the nr_busy sd iteration but not like what is done
with this patch. You stop the nr_busy computation at the sched domain
that has the flag SD_SHARE_PKG_RESOURCES set. But nohz_kick_needed()
would want to know the nr_busy for one level above this.
   Consider a core. Assume it is the highest domain with this flag set.
The nr_busy of its groups, which are logical threads are set to 1/0
each. But nohz_kick_needed() would like to know the sum of the nr_busy
parameter of all the groups, i.e. the threads in a core before it
decides if it can kick nohz_idle balancing. The information about the
individual group's nr_busy is of no relevance here.

Thats why the above patch tries to get the
sd->parent->groups->sgp->nr_busy_cpus. This will translate rightly to
the core's busy cpus in this example. But the below patch stops before
updating this parameter at the sd->parent level, where sd is the highest
level sched domain with the SD_SHARE_PKG_RESOURCES flag set.

But we can get around all this confusion if we can move the nr_busy
parameter to be included in the sched_domain structure rather than the
sched_groups_power structure. Anyway the only place where nr_busy is
used, that is at nohz_kick_needed(), is done to know the total number of
busy cpus at a sched domain level which has the SD_SHARE_PKG_RESOURCES
set and not at a sched group level.

So why not move nr_busy to struct sched_domain  and having the below
patch which just updates this parameter for the sched domain, sd_busy ?
This will avoid iterating through all the levels of sched domains and
should resolve the scalability issue. We also don't need to get to
sd->parent to get the nr_busy parameter for the sake of nohz_kick_needed().

What do you think?

Regards
Preeti U Murthy
> 
> This nohz stuff really needs to be re-thought and made more scalable --
> its a royal pain :/
> 
> 
>  kernel/sched/core.c  |  4 ++++
>  kernel/sched/fair.c  | 21 +++++++++++++++------
>  kernel/sched/sched.h |  5 ++---
>  3 files changed, 21 insertions(+), 9 deletions(-)
> 
> diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> index c06b8d3..89db8dc 100644
> --- a/kernel/sched/core.c
> +++ b/kernel/sched/core.c
> @@ -5271,6 +5271,7 @@ DEFINE_PER_CPU(struct sched_domain *, sd_llc);
>  DEFINE_PER_CPU(int, sd_llc_size);
>  DEFINE_PER_CPU(int, sd_llc_id);
>  DEFINE_PER_CPU(struct sched_domain *, sd_numa);
> +DEFINE_PER_CPU(struct sched_domain *, sd_busy);
> 
>  static void update_top_cache_domain(int cpu)
>  {
> @@ -5290,6 +5291,9 @@ static void update_top_cache_domain(int cpu)
> 
>  	sd = lowest_flag_domain(cpu, SD_NUMA);
>  	rcu_assign_pointer(per_cpu(sd_numa, cpu), sd);
> +
> +	sd = highest_flag_domain(cpu, SD_SHARE_PKG_RESOURCES | SD_ASYM_PACKING);
> +	rcu_assign_pointer(per_cpu(sd_busy, cpu), sd);
>  }
> 
>  /*
> diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c
> index 813dd61..3d5141e 100644
> --- a/kernel/sched/fair.c
> +++ b/kernel/sched/fair.c
> @@ -6512,19 +6512,23 @@ static inline void nohz_balance_exit_idle(int cpu)
>  	}
>  }
> 
> -static inline void set_cpu_sd_state_busy(void)
> +static inline void set_cpu_sd_state_busy(int cpu)
>  {
>  	struct sched_domain *sd;
> +	struct rq *rq = cpu_rq(cpu);
> 
>  	rcu_read_lock();
> -	sd = rcu_dereference_check_sched_domain(this_rq()->sd);
> +	sd = rcu_dereference_check_sched_domain(rq->sd);
> 
>  	if (!sd || !sd->nohz_idle)
>  		goto unlock;
>  	sd->nohz_idle = 0;
> 
> -	for (; sd; sd = sd->parent)
> +	for (; sd; sd = sd->parent) {
>  		atomic_inc(&sd->groups->sgp->nr_busy_cpus);
> +		if (sd == per_cpu(sd_busy, cpu))
> +			break;
> +	}
>  unlock:
>  	rcu_read_unlock();
>  }
> @@ -6532,16 +6536,21 @@ static inline void set_cpu_sd_state_busy(void)
>  void set_cpu_sd_state_idle(void)
>  {
>  	struct sched_domain *sd;
> +	int cpu = smp_processor_id();
> +	struct rq *rq = cpu_rq(cpu);
> 
>  	rcu_read_lock();
> -	sd = rcu_dereference_check_sched_domain(this_rq()->sd);
> +	sd = rcu_dereference_check_sched_domain(rq->sd);
> 
>  	if (!sd || sd->nohz_idle)
>  		goto unlock;
>  	sd->nohz_idle = 1;
> 
> -	for (; sd; sd = sd->parent)
> +	for (; sd; sd = sd->parent) {
>  		atomic_dec(&sd->groups->sgp->nr_busy_cpus);
> +		if (sd == per_cpu(sd_busy, cpu))
> +			break;
> +	}
>  unlock:
>  	rcu_read_unlock();
>  }
> @@ -6756,7 +6765,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
>  	* We may be recently in ticked or tickless idle mode. At the first
>  	* busy tick after returning from idle, we will update the busy stats.
>  	*/
> -	set_cpu_sd_state_busy();
> +	set_cpu_sd_state_busy(cpu);
>  	nohz_balance_exit_idle(cpu);
> 
>  	/*
> diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
> index ffc7087..80c5fd2 100644
> --- a/kernel/sched/sched.h
> +++ b/kernel/sched/sched.h
> @@ -599,9 +599,8 @@ static inline struct sched_domain *highest_flag_domain(int cpu, int flag)
>  	struct sched_domain *sd, *hsd = NULL;
> 
>  	for_each_domain(cpu, sd) {
> -		if (!(sd->flags & flag))
> -			break;
> -		hsd = sd;
> +		if (sd->flags & flag)
> +			hsd = sd;
>  	}
> 
>  	return hsd;
> 

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox