* Re: [PATCH ppc-next] powerpc/fsl-booke: don't load early TLB at once
From: David Lamparter @ 2018-09-21 1:00 UTC (permalink / raw)
To: Scott Wood; +Cc: linuxppc-dev, Scott Wood, York Sun
In-Reply-To: <1537489893.7689.38.camel@redhat.com>
On Thu, Sep 20, 2018 at 07:31:33PM -0500, Scott Wood wrote:
> On Fri, 2018-09-21 at 00:48 +0200, David Lamparter wrote:
> > This is a *partial* revert of "powerpc/85xx: Load all early TLB entries
> > at once" (d9e1831a420267a7ced708bb259d65b0a3c0344d.)
> >
> > My dusty old P4080DS just completely fails to boot (no output at all)
> > without this revert. I have no clue what's going on here, I just
> > bisected it down and since it looks like an optimization to me I just
> > reverted it - and voilá, the P4080 boots again.
>
> It's not an optimization; it was required to get kdump working, at least
Oh, my apologies for misunderstanding the code.
> for certain choices of crash kernel location. I just tried booting a 32-
> bit kernel and did not see this problem -- but I don't have access to a
> p4080ds anymore. I tried with qemu e500mc, and also running a 32-bit
> kernel on e6500 (needs a tiny change to get past SMP init, since 32-bit
> isn't really supported on e6500, but you do get output even without that).
Hrm, maybe I should just make it use the old mechanism under an #ifdef
CONFIG_PPC32? Better to boot and have kdump not work than not boot.
(But obviously finding the actual problem would be best.)
> Do you have a JTAG that can be used to find out where it's hanging? If
> not, I can try to get early debug working (needs an early IOMMU mapping).
I only have JTAG tools for ARM chips available; hardware wise I could
probably solder up an adapter but software wise I have absoutely no clue
how to fire up a session on anything PPC... I'm a novice openocd user,
that's it.
> York, can you try booting the latest kernel on p4080ds?
d9e1831a42 has been around for quite some time, 4.4 already has it. I
was a bit surprised noone has run into this, but then again P4080 is not
exactly the most recent/interesting hardware.
Cheers,
-David
^ permalink raw reply
* Re: [PATCH net-next 00/22] net: fix return type of ndo_start_xmit function
From: YueHaibing @ 2018-09-21 1:33 UTC (permalink / raw)
To: David Miller
Cc: dmitry.tarnyagin, wg, mkl, michal.simek, hsweeten, madalin.bucur,
pantelis.antoniou, claudiu.manoil, leoyang.li, linux, sammy, ralf,
nico, steve.glendinning, f.fainelli, grygorii.strashko, w-kwok2,
m-karicheri2, t.sailer, jreuter, kys, haiyangz, wei.liu2,
paul.durrant, arvid.brodin, pshelar, linux-kernel, netdev,
linux-can, linux-arm-kernel, linuxppc-dev, linux-mips, linux-omap,
linux-hams, devel, linux-usb, xen-devel, dev
In-Reply-To: <20180920.085055.1188796939437872993.davem@davemloft.net>
On 2018/9/20 23:50, David Miller wrote:
> From: YueHaibing <yuehaibing@huawei.com>
> Date: Thu, 20 Sep 2018 20:32:44 +0800
>
>> The method ndo_start_xmit() is defined as returning an 'netdev_tx_t',
>> which is a typedef for an enum type, so make sure the implementation in
>> this driver has returns 'netdev_tx_t' value, and change the function
>> return type to netdev_tx_t.
>
> I would advise you not to send so many of these changes as a group.
>
> If one of the patches needs feedback addressed, which is already the
> case, you will have to resubmit the entire series all over again with
> the fixes.
>
Yes, I will send it separately after test and review again.
Thank you for your advice.
> .
>
^ permalink raw reply
* Re: [PATCH net-next 17/22] hv_netvsc: fix return type of ndo_start_xmit function
From: YueHaibing @ 2018-09-21 1:35 UTC (permalink / raw)
To: Haiyang Zhang, Stephen Hemminger
Cc: davem@davemloft.net, dmitry.tarnyagin@lockless.no,
wg@grandegger.com, mkl@pengutronix.de, michal.simek@xilinx.com,
hsweeten@visionengravers.com, madalin.bucur@nxp.com,
pantelis.antoniou@gmail.com, claudiu.manoil@nxp.com,
leoyang.li@nxp.com, linux@armlinux.org.uk, sammy@sammy.net,
ralf@linux-mips.org, nico@fluxnic.net,
steve.glendinning@shawell.net, f.fainelli@gmail.com,
grygorii.strashko@ti.com, w-kwok2@ti.com, m-karicheri2@ti.com,
t.sailer@alumni.ethz.ch, jreuter@yaina.de, KY Srinivasan,
wei.liu2@citrix.com, paul.durrant@citrix.com,
arvid.brodin@alten.se, pshelar@ovn.org, dev@openvswitch.org,
linux-mips@linux-mips.org, xen-devel@lists.xenproject.org,
netdev@vger.kernel.org, linux-usb@vger.kernel.org,
linux-kernel@vger.kernel.org, linux-can@vger.kernel.org,
devel@linuxdriverproject.org, linux-hams@vger.kernel.org,
linux-omap@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
linux-arm-kernel@lists.infradead.org
In-Reply-To: <BN6PR21MB016180C794F26A279345A17FCA130@BN6PR21MB0161.namprd21.prod.outlook.com>
On 2018/9/20 22:50, Haiyang Zhang wrote:
>
>
>> -----Original Message-----
>> From: Stephen Hemminger <stephen@networkplumber.org>
>> Sent: Thursday, September 20, 2018 10:44 AM
>> To: YueHaibing <yuehaibing@huawei.com>
>> Cc: davem@davemloft.net; dmitry.tarnyagin@lockless.no;
>> wg@grandegger.com; mkl@pengutronix.de; michal.simek@xilinx.com;
>> hsweeten@visionengravers.com; madalin.bucur@nxp.com;
>> pantelis.antoniou@gmail.com; claudiu.manoil@nxp.com; leoyang.li@nxp.com;
>> linux@armlinux.org.uk; sammy@sammy.net; ralf@linux-mips.org;
>> nico@fluxnic.net; steve.glendinning@shawell.net; f.fainelli@gmail.com;
>> grygorii.strashko@ti.com; w-kwok2@ti.com; m-karicheri2@ti.com;
>> t.sailer@alumni.ethz.ch; jreuter@yaina.de; KY Srinivasan <kys@microsoft.com>;
>> Haiyang Zhang <haiyangz@microsoft.com>; wei.liu2@citrix.com;
>> paul.durrant@citrix.com; arvid.brodin@alten.se; pshelar@ovn.org;
>> dev@openvswitch.org; linux-mips@linux-mips.org; xen-
>> devel@lists.xenproject.org; netdev@vger.kernel.org; linux-usb@vger.kernel.org;
>> linux-kernel@vger.kernel.org; linux-can@vger.kernel.org;
>> devel@linuxdriverproject.org; linux-hams@vger.kernel.org; linux-
>> omap@vger.kernel.org; linuxppc-dev@lists.ozlabs.org; linux-arm-
>> kernel@lists.infradead.org
>> Subject: Re: [PATCH net-next 17/22] hv_netvsc: fix return type of
>> ndo_start_xmit function
>>
>> On Thu, 20 Sep 2018 20:33:01 +0800
>> YueHaibing <yuehaibing@huawei.com> wrote:
>>> int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
>>> */
>>> vf_netdev = rcu_dereference_bh(net_device_ctx->vf_netdev);
>>> if (vf_netdev && netif_running(vf_netdev) &&
>>> - !netpoll_tx_running(net))
>>> - return netvsc_vf_xmit(net, vf_netdev, skb);
>>> + !netpoll_tx_running(net)) {
>>> + ret = netvsc_vf_xmit(net, vf_netdev, skb);
>>> + if (ret)
>>> + return NETDEV_TX_BUSY;
>>> + }
>>
>> Sorry, the new code is wrong. It will fall through if ret == 0 (NETDEV_TX_OK)
>> Please review and test your patches.
>
> Plus consideration of -- For error case, please just return NETDEV_TX_OK. We
> are not sure if the error can go away after retrying, returning NETDEV_TX_BUSY
> may cause infinite retry from the upper layer.
>
> So, let's just always return NETDEV_TX_OK like this:
> netvsc_vf_xmit(net, vf_netdev, skb);
> return NETDEV_TX_OK;
Thank you for review.
Will do that in v2.
>
> Thanks,
> - Haiyang
>
> .
>
^ permalink raw reply
* Re: [PATCH net-next 17/22] hv_netvsc: fix return type of ndo_start_xmit function
From: YueHaibing @ 2018-09-21 1:37 UTC (permalink / raw)
To: Stephen Hemminger
Cc: davem, dmitry.tarnyagin, wg, mkl, michal.simek, hsweeten,
madalin.bucur, pantelis.antoniou, claudiu.manoil, leoyang.li,
linux, sammy, ralf, nico, steve.glendinning, f.fainelli,
grygorii.strashko, w-kwok2, m-karicheri2, t.sailer, jreuter, kys,
haiyangz, wei.liu2, paul.durrant, arvid.brodin, pshelar, dev,
linux-mips, xen-devel, netdev, linux-usb, linux-kernel, linux-can,
devel, linux-hams, linux-omap, linuxppc-dev, linux-arm-kernel
In-Reply-To: <20180920074341.3acef75c@xeon-e3>
On 2018/9/20 22:43, Stephen Hemminger wrote:
> On Thu, 20 Sep 2018 20:33:01 +0800
> YueHaibing <yuehaibing@huawei.com> wrote:
>
>> The method ndo_start_xmit() is defined as returning an 'netdev_tx_t',
>> which is a typedef for an enum type, so make sure the implementation in
>> this driver has returns 'netdev_tx_t' value, and change the function
>> return type to netdev_tx_t.
>>
>> Found by coccinelle.
>>
>> Signed-off-by: YueHaibing <yuehaibing@huawei.com>
>> ---
>> drivers/net/hyperv/netvsc_drv.c | 10 +++++++---
>> 1 file changed, 7 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/net/hyperv/netvsc_drv.c b/drivers/net/hyperv/netvsc_drv.c
>> index 3af6d8d..056c472 100644
>> --- a/drivers/net/hyperv/netvsc_drv.c
>> +++ b/drivers/net/hyperv/netvsc_drv.c
>> @@ -511,7 +511,8 @@ static int netvsc_vf_xmit(struct net_device *net, struct net_device *vf_netdev,
>> return rc;
>> }
>>
>> -static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
>> +static netdev_tx_t
>> +netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
>> {
>> struct net_device_context *net_device_ctx = netdev_priv(net);
>> struct hv_netvsc_packet *packet = NULL;
>> @@ -528,8 +529,11 @@ static int netvsc_start_xmit(struct sk_buff *skb, struct net_device *net)
>> */
>> vf_netdev = rcu_dereference_bh(net_device_ctx->vf_netdev);
>> if (vf_netdev && netif_running(vf_netdev) &&
>> - !netpoll_tx_running(net))
>> - return netvsc_vf_xmit(net, vf_netdev, skb);
>> + !netpoll_tx_running(net)) {
>> + ret = netvsc_vf_xmit(net, vf_netdev, skb);
>> + if (ret)
>> + return NETDEV_TX_BUSY;
>> + }
>
> Sorry, the new code is wrong. It will fall through if ret == 0 (NETDEV_TX_OK)
> Please review and test your patches.
I'm sorry for this, will correct it as Haiyang's suggestion.
>
> .
>
^ permalink raw reply
* Re: [PATCH] lib/xz: Fix powerpc build with KERNEL_XZ
From: Joel Stanley @ 2018-09-21 2:30 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: Herbert Xu, Linux Kernel Mailing List, Michael Ellerman,
Oliver O'Halloran, linuxppc-dev, christophe.leroy
In-Reply-To: <CAJKOXPd4dCyuXKxAz-V=ujtiuKcumHzAx28y5J+6m+L7ZRLsZQ@mail.gmail.com>
On Wed, 19 Sep 2018 at 16:09, Krzysztof Kozlowski <krzk@kernel.org> wrote:
>
> On Wed, 19 Sep 2018 at 01:08, Joel Stanley <joel@jms.id.au> wrote:
> >
> > This partially reverts faa16bc404d72a5 ("lib: Use existing define with
> > polynomial").
> >
> > The cleanup added a dependency on include/linux, which broke the PowerPC
> > boot wrapper/decompresser when KERNEL_XZ is enabled:
> >
> > BOOTCC arch/powerpc/boot/decompress.o
> > In file included from arch/powerpc/boot/../../../lib/decompress_unxz.c:233,
> > from arch/powerpc/boot/decompress.c:42:
> > arch/powerpc/boot/../../../lib/xz/xz_crc32.c:18:10: fatal error:
> > linux/crc32poly.h: No such file or directory
> > #include <linux/crc32poly.h>
> > ^~~~~~~~~~~~~~~~~~~
> >
> > The powerpc decompressor is a hairy corner of the kernel. Even while building
> > a 64-bit kernel it needs to build a 32-bit binary and therefore avoid including
> > files from include/linux.
>
> I fixed the build error here:
> https://lkml.org/lkml/2018/8/29/179
>
> If you choose to remove any includes from /linux, then go ahead but
> please use original reported-by :)
Okay. I'll try Christophe's suggestion instead.
Cheers,
Joel
^ permalink raw reply
* [PATCH net-next] net: freescale: fix return type of ndo_start_xmit function
From: YueHaibing @ 2018-09-21 2:50 UTC (permalink / raw)
To: davem, madalin.bucur, pantelis.antoniou, claudiu.manoil,
leoyang.li
Cc: linux-kernel, netdev, linuxppc-dev, YueHaibing
The method ndo_start_xmit() is defined as returning an 'netdev_tx_t',
which is a typedef for an enum type, so make sure the implementation in
this driver has returns 'netdev_tx_t' value, and change the function
return type to netdev_tx_t.
Found by coccinelle.
Signed-off-by: YueHaibing <yuehaibing@huawei.com>
---
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 3 ++-
drivers/net/ethernet/freescale/fec_mpc52xx.c | 3 ++-
drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c | 3 ++-
drivers/net/ethernet/freescale/gianfar.c | 4 ++--
drivers/net/ethernet/freescale/ucc_geth.c | 3 ++-
5 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
index a5131a5..84843de 100644
--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
@@ -2044,7 +2044,8 @@ static inline int dpaa_xmit(struct dpaa_priv *priv,
return 0;
}
-static int dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
+static netdev_tx_t
+dpaa_start_xmit(struct sk_buff *skb, struct net_device *net_dev)
{
const int queue_mapping = skb_get_queue_mapping(skb);
bool nonlinear = skb_is_nonlinear(skb);
diff --git a/drivers/net/ethernet/freescale/fec_mpc52xx.c b/drivers/net/ethernet/freescale/fec_mpc52xx.c
index 6d7269d..b90bab7 100644
--- a/drivers/net/ethernet/freescale/fec_mpc52xx.c
+++ b/drivers/net/ethernet/freescale/fec_mpc52xx.c
@@ -305,7 +305,8 @@ static int mpc52xx_fec_close(struct net_device *dev)
* invariant will hold if you make sure that the netif_*_queue()
* calls are done at the proper times.
*/
-static int mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t
+mpc52xx_fec_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct mpc52xx_fec_priv *priv = netdev_priv(dev);
struct bcom_fec_bd *bd;
diff --git a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
index 2c2976a..7c548ed 100644
--- a/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
+++ b/drivers/net/ethernet/freescale/fs_enet/fs_enet-main.c
@@ -481,7 +481,8 @@ static struct sk_buff *tx_skb_align_workaround(struct net_device *dev,
}
#endif
-static int fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t
+fs_enet_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct fs_enet_private *fep = netdev_priv(dev);
cbd_t __iomem *bdp;
diff --git a/drivers/net/ethernet/freescale/gianfar.c b/drivers/net/ethernet/freescale/gianfar.c
index c488d31..0bd21a4 100644
--- a/drivers/net/ethernet/freescale/gianfar.c
+++ b/drivers/net/ethernet/freescale/gianfar.c
@@ -110,7 +110,7 @@
const char gfar_driver_version[] = "2.0";
static int gfar_enet_open(struct net_device *dev);
-static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev);
+static netdev_tx_t gfar_start_xmit(struct sk_buff *skb, struct net_device *dev);
static void gfar_reset_task(struct work_struct *work);
static void gfar_timeout(struct net_device *dev);
static int gfar_close(struct net_device *dev);
@@ -2332,7 +2332,7 @@ static inline bool gfar_csum_errata_76(struct gfar_private *priv,
/* This is called by the kernel when a frame is ready for transmission.
* It is pointed to by the dev->hard_start_xmit function pointer
*/
-static int gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t gfar_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct gfar_private *priv = netdev_priv(dev);
struct gfar_priv_tx_q *tx_queue = NULL;
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
index 9600837..32e0270 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -3078,7 +3078,8 @@ static int ucc_geth_startup(struct ucc_geth_private *ugeth)
/* This is called by the kernel when a frame is ready for transmission. */
/* It is pointed to by the dev->hard_start_xmit function pointer */
-static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
+static netdev_tx_t
+ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
struct ucc_geth_private *ugeth = netdev_priv(dev);
#ifdef CONFIG_UGETH_TX_ON_DEMAND
--
1.8.3.1
^ permalink raw reply related
* [PATCH] lib/xz: Put CRC32_POLY_LE in xz_private.h
From: Joel Stanley @ 2018-09-21 2:54 UTC (permalink / raw)
To: Krzysztof Kozlowski, Greg Kroah-Hartman
Cc: Herbert Xu, Michael Ellerman, Christophe LEROY, Meelis Roos,
linuxppc-dev, linux-kernel
This fixes a regression introduced by faa16bc404d72a5 ("lib: Use
existing define with polynomial").
The cleanup added a dependency on include/linux, which broke the PowerPC
boot wrapper/decompresser when KERNEL_XZ is enabled:
BOOTCC arch/powerpc/boot/decompress.o
In file included from arch/powerpc/boot/../../../lib/decompress_unxz.c:233,
from arch/powerpc/boot/decompress.c:42:
arch/powerpc/boot/../../../lib/xz/xz_crc32.c:18:10: fatal error:
linux/crc32poly.h: No such file or directory
#include <linux/crc32poly.h>
^~~~~~~~~~~~~~~~~~~
The powerpc decompresser is a hairy corner of the kernel. Even while building
a 64-bit kernel it needs to build a 32-bit binary and therefore avoid including
files from include/linux.
This allows users of the xz library to avoid including headers from
'include/linux/' while still achieving the cleanup of the magic number.
Fixes: faa16bc404d72a5 ("lib: Use existing define with polynomial")
Reported-by: Meelis Roos <mroos@linux.ee>
Reported-by: kbuild test robot <lkp@intel.com>
Suggested-by: Christophe LEROY <christophe.leroy@c-s.fr>
Signed-off-by: Joel Stanley <joel@jms.id.au>
---
lib/xz/xz_crc32.c | 1 -
lib/xz/xz_private.h | 4 ++++
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/lib/xz/xz_crc32.c b/lib/xz/xz_crc32.c
index 25a5d87e2e4c..912aae5fa09e 100644
--- a/lib/xz/xz_crc32.c
+++ b/lib/xz/xz_crc32.c
@@ -15,7 +15,6 @@
* but they are bigger and use more memory for the lookup table.
*/
-#include <linux/crc32poly.h>
#include "xz_private.h"
/*
diff --git a/lib/xz/xz_private.h b/lib/xz/xz_private.h
index 482b90f363fe..09360ebb510e 100644
--- a/lib/xz/xz_private.h
+++ b/lib/xz/xz_private.h
@@ -102,6 +102,10 @@
# endif
#endif
+#ifndef CRC32_POLY_LE
+#define CRC32_POLY_LE 0xedb88320
+#endif
+
/*
* Allocate memory for LZMA2 decoder. xz_dec_lzma2_reset() must be used
* before calling xz_dec_lzma2_run().
--
2.17.1
^ permalink raw reply related
* Re: [PATCH v8 1/3] powerpc: Detect the presence of big-cores via "ibm,thread-groups"
From: Michael Neuling @ 2018-09-21 3:02 UTC (permalink / raw)
To: Gautham R. Shenoy, Aneesh Kumar K.V, Srikar Dronamraju,
Michael Ellerman, Benjamin Herrenschmidt, Vaidyanathan Srinivasan,
Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran,
Nicholas Piggin, Murilo Opsfelder Araujo, Anton Blanchard
Cc: linuxppc-dev, linux-kernel
In-Reply-To: <1537464159-25919-2-git-send-email-ego@linux.vnet.ibm.com>
This doesn't compile for me with:
arch/powerpc/kernel/smp.c: In function =E2=80=98smp_prepare_cpus=E2=80=99:
arch/powerpc/kernel/smp.c:812:23: error: =E2=80=98tg.threads_per_group=E2=
=80=99 may be used uninitialized in this function [-Werror=3Dmaybe-uninitia=
lized]
struct thread_groups tg;
^
arch/powerpc/kernel/smp.c:812:23: error: =E2=80=98tg.nr_groups=E2=80=99 may=
be used uninitialized in this function [-Werror=3Dmaybe-uninitialized]
cc1: all warnings being treated as errors
/home/mikey/src/linux-ozlabs/scripts/Makefile.build:305: recipe for target =
'arch/powerpc/kernel/smp.o' failed
On Thu, 2018-09-20 at 22:52 +0530, Gautham R. Shenoy wrote:
> From: "Gautham R. Shenoy" <ego@linux.vnet.ibm.com>
>=20
> On IBM POWER9, the device tree exposes a property array identifed by
> "ibm,thread-groups" which will indicate which groups of threads share a
> particular set of resources.
>=20
> As of today we only have one form of grouping identifying the group of
> threads in the core that share the L1 cache, translation cache and
> instruction data flow.
>=20
> This patch
>=20
> 1) Defines the helper function to parse the contents of
> "ibm,thread-groups".
>=20
> 2) On boot, it parses the "ibm,thread-groups" property and caches
> the CPU-threads sharing the L1 cache in a per-cpu variable named
> cpu_l1_cache_map.
>=20
> 3) Initializes a global variable named "has_big_cores" on
> big-core systems.
>=20
> 4) Each time a CPU is onlined, it initializes the
> cpu_smallcore_mask which contains the online siblings of the
> CPU that share the L1 cache with this CPU.
>=20
> Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
> ---
> arch/powerpc/include/asm/cputhreads.h | 2 +
> arch/powerpc/include/asm/smp.h | 6 +
> arch/powerpc/kernel/smp.c | 221
> ++++++++++++++++++++++++++++++++++
> 3 files changed, 229 insertions(+)
>=20
> diff --git a/arch/powerpc/include/asm/cputhreads.h
> b/arch/powerpc/include/asm/cputhreads.h
> index d71a909..deb99fd 100644
> --- a/arch/powerpc/include/asm/cputhreads.h
> +++ b/arch/powerpc/include/asm/cputhreads.h
> @@ -23,11 +23,13 @@
> extern int threads_per_core;
> extern int threads_per_subcore;
> extern int threads_shift;
> +extern bool has_big_cores;
> extern cpumask_t threads_core_mask;
> #else
> #define threads_per_core 1
> #define threads_per_subcore 1
> #define threads_shift 0
> +#define has_big_cores 0
> #define threads_core_mask (*get_cpu_mask(0))
> #endif
> =20
> diff --git a/arch/powerpc/include/asm/smp.h b/arch/powerpc/include/asm/sm=
p.h
> index 95b66a0..4439893 100644
> --- a/arch/powerpc/include/asm/smp.h
> +++ b/arch/powerpc/include/asm/smp.h
> @@ -100,6 +100,7 @@ static inline void set_hard_smp_processor_id(int cpu,=
int
> phys)
> DECLARE_PER_CPU(cpumask_var_t, cpu_sibling_map);
> DECLARE_PER_CPU(cpumask_var_t, cpu_l2_cache_map);
> DECLARE_PER_CPU(cpumask_var_t, cpu_core_map);
> +DECLARE_PER_CPU(cpumask_var_t, cpu_smallcore_map);
> =20
> static inline struct cpumask *cpu_sibling_mask(int cpu)
> {
> @@ -116,6 +117,11 @@ static inline struct cpumask *cpu_l2_cache_mask(int =
cpu)
> return per_cpu(cpu_l2_cache_map, cpu);
> }
> =20
> +static inline struct cpumask *cpu_smallcore_mask(int cpu)
> +{
> + return per_cpu(cpu_smallcore_map, cpu);
> +}
> +
> extern int cpu_to_core_id(int cpu);
> =20
> /* Since OpenPIC has only 4 IPIs, we use slightly different message numb=
ers.
> diff --git a/arch/powerpc/kernel/smp.c b/arch/powerpc/kernel/smp.c
> index 61c1fad..15095110 100644
> --- a/arch/powerpc/kernel/smp.c
> +++ b/arch/powerpc/kernel/smp.c
> @@ -74,14 +74,32 @@
> #endif
> =20
> struct thread_info *secondary_ti;
> +bool has_big_cores;
> =20
> DEFINE_PER_CPU(cpumask_var_t, cpu_sibling_map);
> +DEFINE_PER_CPU(cpumask_var_t, cpu_smallcore_map);
> DEFINE_PER_CPU(cpumask_var_t, cpu_l2_cache_map);
> DEFINE_PER_CPU(cpumask_var_t, cpu_core_map);
> =20
> EXPORT_PER_CPU_SYMBOL(cpu_sibling_map);
> EXPORT_PER_CPU_SYMBOL(cpu_l2_cache_map);
> EXPORT_PER_CPU_SYMBOL(cpu_core_map);
> +EXPORT_SYMBOL_GPL(has_big_cores);
> +
> +#define MAX_THREAD_LIST_SIZE 8
> +#define THREAD_GROUP_SHARE_L1 1
> +struct thread_groups {
> + unsigned int property;
> + unsigned int nr_groups;
> + unsigned int threads_per_group;
> + unsigned int thread_list[MAX_THREAD_LIST_SIZE];
> +};
> +
> +/*
> + * On big-cores system, cpu_l1_cache_map for each CPU corresponds to
> + * the set its siblings that share the L1-cache.
> + */
> +DEFINE_PER_CPU(cpumask_var_t, cpu_l1_cache_map);
> =20
> /* SMP operations for this machine */
> struct smp_ops_t *smp_ops;
> @@ -674,6 +692,184 @@ static void set_cpus_unrelated(int i, int j,
> }
> #endif
> =20
> +/*
> + * parse_thread_groups: Parses the "ibm,thread-groups" device tree
> + * property for the CPU device node @dn and stores
> + * the parsed output in the thread_groups
> + * structure @tg if the ibm,thread-groups[0]
> + * matches @property.
> + *
> + * @dn: The device node of the CPU device.
> + * @tg: Pointer to a thread group structure into which the parsed
> + * output of "ibm,thread-groups" is stored.
> + * @property: The property of the thread-group that the caller is
> + * interested in.
> + *
> + * ibm,thread-groups[0..N-1] array defines which group of threads in
> + * the CPU-device node can be grouped together based on the property.
> + *
> + * ibm,thread-groups[0] tells us the property based on which the
> + * threads are being grouped together. If this value is 1, it implies
> + * that the threads in the same group share L1, translation cache.
> + *
> + * ibm,thread-groups[1] tells us how many such thread groups exist.
> + *
> + * ibm,thread-groups[2] tells us the number of threads in each such
> + * group.
> + *
> + * ibm,thread-groups[3..N-1] is the list of threads identified by
> + * "ibm,ppc-interrupt-server#s" arranged as per their membership in
> + * the grouping.
> + *
> + * Example: If ibm,thread-groups =3D [1,2,4,5,6,7,8,9,10,11,12] it
> + * implies that there are 2 groups of 4 threads each, where each group
> + * of threads share L1, translation cache.
> + *
> + * The "ibm,ppc-interrupt-server#s" of the first group is {5,6,7,8}
> + * and the "ibm,ppc-interrupt-server#s" of the second group is {9, 10,
> + * 11, 12} structure
> + *
> + * Returns 0 on success, -EINVAL if the property does not exist,
> + * -ENODATA if property does not have a value, and -EOVERFLOW if the
> + * property data isn't large enough.
> + */
> +static int parse_thread_groups(struct device_node *dn,
> + struct thread_groups *tg,
> + unsigned int property)
> +{
> + int i;
> + u32 thread_group_array[3 + MAX_THREAD_LIST_SIZE];
> + u32 *thread_list;
> + size_t total_threads;
> + int ret;
> +
> + ret =3D of_property_read_u32_array(dn, "ibm,thread-groups",
> + thread_group_array, 3);
> + if (ret)
> + return ret;
> +
> + tg->property =3D thread_group_array[0];
> + tg->nr_groups =3D thread_group_array[1];
> + tg->threads_per_group =3D thread_group_array[2];
> + if (tg->property !=3D property ||
> + tg->nr_groups < 1 ||
> + tg->threads_per_group < 1)
> + return -ENODATA;
> +
> + total_threads =3D tg->nr_groups * tg->threads_per_group;
> +
> + ret =3D of_property_read_u32_array(dn, "ibm,thread-groups",
> + thread_group_array,
> + 3 + total_threads);
> + if (ret)
> + return ret;
> +
> + thread_list =3D &thread_group_array[3];
> +
> + for (i =3D 0 ; i < total_threads; i++)
> + tg->thread_list[i] =3D thread_list[i];
> +
> + return 0;
> +}
> +
> +/*
> + * get_cpu_thread_group_start : Searches the thread group in tg->thread_=
list
> + * that @cpu belongs to.
> + *
> + * @cpu : The logical CPU whose thread group is being searched.
> + * @tg : The thread-group structure of the CPU node which @cpu belongs
> + * to.
> + *
> + * Returns the index to tg->thread_list that points to the the start
> + * of the thread_group that @cpu belongs to.
> + *
> + * Returns -1 if cpu doesn't belong to any of the groups pointed to by
> + * tg->thread_list.
> + */
> +static int get_cpu_thread_group_start(int cpu, struct thread_groups *tg)
> +{
> + int hw_cpu_id =3D get_hard_smp_processor_id(cpu);
> + int i, j;
> +
> + for (i =3D 0; i < tg->nr_groups; i++) {
> + int group_start =3D i * tg->threads_per_group;
> +
> + for (j =3D 0; j < tg->threads_per_group; j++) {
> + int idx =3D group_start + j;
> +
> + if (tg->thread_list[idx] =3D=3D hw_cpu_id)
> + return group_start;
> + }
> + }
> +
> + return -1;
> +}
> +
> +static int init_cpu_l1_cache_map(int cpu)
> +
> +{
> + struct device_node *dn =3D of_get_cpu_node(cpu, NULL);
> + struct thread_groups tg;
> +
> + int first_thread =3D cpu_first_thread_sibling(cpu);
> + int i, cpu_group_start =3D -1, err =3D 0;
> +
> + if (!dn)
> + return -ENODATA;
> +
> + err =3D parse_thread_groups(dn, &tg, THREAD_GROUP_SHARE_L1);
> + if (err)
> + goto out;
> +
> + zalloc_cpumask_var_node(&per_cpu(cpu_l1_cache_map, cpu),
> + GFP_KERNEL,
> + cpu_to_node(cpu));
> +
> + cpu_group_start =3D get_cpu_thread_group_start(cpu, &tg);
> +
> + if (unlikely(cpu_group_start =3D=3D -1)) {
> + WARN_ON_ONCE(1);
> + err =3D -ENODATA;
> + goto out;
> + }
> +
> + for (i =3D first_thread; i < first_thread + threads_per_core; i++) {
> + int i_group_start =3D get_cpu_thread_group_start(i, &tg);
> +
> + if (unlikely(i_group_start =3D=3D -1)) {
> + WARN_ON_ONCE(1);
> + err =3D -ENODATA;
> + goto out;
> + }
> +
> + if (i_group_start =3D=3D cpu_group_start)
> + cpumask_set_cpu(i, per_cpu(cpu_l1_cache_map, cpu));
> + }
> +
> +out:
> + of_node_put(dn);
> + return err;
> +}
> +
> +static int init_big_cores(void)
> +{
> + int cpu;
> +
> + for_each_possible_cpu(cpu) {
> + int err =3D init_cpu_l1_cache_map(cpu);
> +
> + if (err)
> + return err;
> +
> + zalloc_cpumask_var_node(&per_cpu(cpu_smallcore_map, cpu),
> + GFP_KERNEL,
> + cpu_to_node(cpu));
> + }
> +
> + has_big_cores =3D true;
> + return 0;
> +}
> +
> void __init smp_prepare_cpus(unsigned int max_cpus)
> {
> unsigned int cpu;
> @@ -712,6 +908,12 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
> cpumask_set_cpu(boot_cpuid, cpu_l2_cache_mask(boot_cpuid));
> cpumask_set_cpu(boot_cpuid, cpu_core_mask(boot_cpuid));
> =20
> + init_big_cores();
> + if (has_big_cores) {
> + cpumask_set_cpu(boot_cpuid,
> + cpu_smallcore_mask(boot_cpuid));
> + }
> +
> if (smp_ops && smp_ops->probe)
> smp_ops->probe();
> }
> @@ -995,10 +1197,28 @@ static void remove_cpu_from_masks(int cpu)
> set_cpus_unrelated(cpu, i, cpu_core_mask);
> set_cpus_unrelated(cpu, i, cpu_l2_cache_mask);
> set_cpus_unrelated(cpu, i, cpu_sibling_mask);
> + if (has_big_cores)
> + set_cpus_unrelated(cpu, i, cpu_smallcore_mask);
> }
> }
> #endif
> =20
> +static inline void add_cpu_to_smallcore_masks(int cpu)
> +{
> + struct cpumask *this_l1_cache_map =3D per_cpu(cpu_l1_cache_map, cpu);
> + int i, first_thread =3D cpu_first_thread_sibling(cpu);
> +
> + if (!has_big_cores)
> + return;
> +
> + cpumask_set_cpu(cpu, cpu_smallcore_mask(cpu));
> +
> + for (i =3D first_thread; i < first_thread + threads_per_core; i++) {
> + if (cpu_online(i) && cpumask_test_cpu(i, this_l1_cache_map))
> + set_cpus_related(i, cpu, cpu_smallcore_mask);
> + }
> +}
> +
> static void add_cpu_to_masks(int cpu)
> {
> int first_thread =3D cpu_first_thread_sibling(cpu);
> @@ -1015,6 +1235,7 @@ static void add_cpu_to_masks(int cpu)
> if (cpu_online(i))
> set_cpus_related(i, cpu, cpu_sibling_mask);
> =20
> + add_cpu_to_smallcore_masks(cpu);
> /*
> * Copy the thread sibling mask into the cache sibling mask
> * and mark any CPUs that share an L2 with this CPU.
^ permalink raw reply
* Re: [PATCH V3 1/6] powerpc/mm/book3s: Update pmd_present to look at _PAGE_PRESENT bit
From: Christophe LEROY @ 2018-09-21 5:55 UTC (permalink / raw)
To: Aneesh Kumar K.V, npiggin, benh, paulus, mpe; +Cc: linuxppc-dev
In-Reply-To: <20180920180947.17893-1-aneesh.kumar@linux.ibm.com>
Le 20/09/2018 à 20:09, Aneesh Kumar K.V a écrit :
> With this patch we use 0x8000000000000000UL (_PAGE_PRESENT) to indicate a valid
> pgd/pud/pmd entry. We also switch the p**_present() to look at this bit.
>
> With pmd_present, we have a special case. We need to make sure we consider a
> pmd marked invalid during THP split as present. Right now we clear the
> _PAGE_PRESENT bit during a pmdp_invalidate. Inorder to consider this special
> case we add a new pte bit _PAGE_INVALID (mapped to _RPAGE_SW0). This bit is
> only used with _PAGE_PRESENT cleared. Hence we are not really losing a pte bit
> for this special case. pmd_present is also updated to look at _PAGE_INVALID.
>
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
> ---
> arch/powerpc/include/asm/book3s/64/hash.h | 5 +++++
> arch/powerpc/include/asm/book3s/64/pgtable.h | 14 +++++++++++---
> arch/powerpc/mm/hash_utils_64.c | 6 +++---
> arch/powerpc/mm/pgtable-book3s64.c | 8 ++++++--
> arch/powerpc/mm/pgtable.c | 7 +++----
> 5 files changed, 28 insertions(+), 12 deletions(-)
>
> diff --git a/arch/powerpc/include/asm/book3s/64/hash.h b/arch/powerpc/include/asm/book3s/64/hash.h
> index d52a51b2ce7b..fcf8b10a209f 100644
> --- a/arch/powerpc/include/asm/book3s/64/hash.h
> +++ b/arch/powerpc/include/asm/book3s/64/hash.h
> @@ -18,6 +18,11 @@
> #include <asm/book3s/64/hash-4k.h>
> #endif
>
> +/* Bits to set in a PMD/PUD/PGD entry valid bit*/
> +#define HASH_PMD_VAL_BITS (0x8000000000000000UL)
> +#define HASH_PUD_VAL_BITS (0x8000000000000000UL)
> +#define HASH_PGD_VAL_BITS (0x8000000000000000UL)
> +
> /*
> * Size of EA range mapped by our pagetables.
> */
> diff --git a/arch/powerpc/include/asm/book3s/64/pgtable.h b/arch/powerpc/include/asm/book3s/64/pgtable.h
> index 13a688fc8cd0..8feb4a3240d5 100644
> --- a/arch/powerpc/include/asm/book3s/64/pgtable.h
> +++ b/arch/powerpc/include/asm/book3s/64/pgtable.h
> @@ -875,8 +875,16 @@ static inline int pmd_none(pmd_t pmd)
>
> static inline int pmd_present(pmd_t pmd)
> {
> + /*
> + * A pmd is considerent present if _PAGE_PRESENT is set.
> + * We also need to consider the pmd present which is marked
> + * invalid during a split. Hence we look for _PAGE_INVALID
> + * if we find _PAGE_PRESENT cleared.
> + */
> + if (pmd_raw(pmd) & cpu_to_be64(_PAGE_PRESENT | _PAGE_INVALID))
> + return true;
>
> - return !pmd_none(pmd);
> + return false;
> }
>
> static inline int pmd_bad(pmd_t pmd)
> @@ -903,7 +911,7 @@ static inline int pud_none(pud_t pud)
>
> static inline int pud_present(pud_t pud)
> {
> - return !pud_none(pud);
> + return (pud_raw(pud) & cpu_to_be64(_PAGE_PRESENT));
> }
>
> extern struct page *pud_page(pud_t pud);
> @@ -950,7 +958,7 @@ static inline int pgd_none(pgd_t pgd)
>
> static inline int pgd_present(pgd_t pgd)
> {
> - return !pgd_none(pgd);
> + return (pgd_raw(pgd) & cpu_to_be64(_PAGE_PRESENT));
> }
>
> static inline pte_t pgd_pte(pgd_t pgd)
> diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
> index 88c95dc8b141..13ba718c9680 100644
> --- a/arch/powerpc/mm/hash_utils_64.c
> +++ b/arch/powerpc/mm/hash_utils_64.c
> @@ -1001,9 +1001,9 @@ void __init hash__early_init_mmu(void)
> * 4k use hugepd format, so for hash set then to
> * zero
> */
> - __pmd_val_bits = 0;
> - __pud_val_bits = 0;
> - __pgd_val_bits = 0;
> + __pmd_val_bits = HASH_PMD_VAL_BITS;
> + __pud_val_bits = HASH_PUD_VAL_BITS;
> + __pgd_val_bits = HASH_PGD_VAL_BITS;
>
> __kernel_virt_start = H_KERN_VIRT_START;
> __kernel_virt_size = H_KERN_VIRT_SIZE;
> diff --git a/arch/powerpc/mm/pgtable-book3s64.c b/arch/powerpc/mm/pgtable-book3s64.c
> index 01d7c0f7c4f0..654000da8b15 100644
> --- a/arch/powerpc/mm/pgtable-book3s64.c
> +++ b/arch/powerpc/mm/pgtable-book3s64.c
> @@ -69,7 +69,11 @@ void set_pmd_at(struct mm_struct *mm, unsigned long addr,
> pmd_t *pmdp, pmd_t pmd)
> {
> #ifdef CONFIG_DEBUG_VM
> - WARN_ON(pte_present(pmd_pte(*pmdp)) && !pte_protnone(pmd_pte(*pmdp)));
> + /*
> + * Make sure hardware valid bit is not set. We don't do
> + * tlb flush for this update.
> + */
> + WARN_ON(pte_val(pmd_pte(*pmdp)) & _PAGE_PRESENT);
> assert_spin_locked(pmd_lockptr(mm, pmdp));
> WARN_ON(!(pmd_trans_huge(pmd) || pmd_devmap(pmd)));
> #endif
> @@ -106,7 +110,7 @@ pmd_t pmdp_invalidate(struct vm_area_struct *vma, unsigned long address,
> {
> unsigned long old_pmd;
>
> - old_pmd = pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, 0);
> + old_pmd = pmd_hugepage_update(vma->vm_mm, address, pmdp, _PAGE_PRESENT, _PAGE_INVALID);
> flush_pmd_tlb_range(vma, address, address + HPAGE_PMD_SIZE);
> /*
> * This ensures that generic code that rely on IRQ disabling
> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c
> index d71c7777669c..aee04b209b51 100644
> --- a/arch/powerpc/mm/pgtable.c
> +++ b/arch/powerpc/mm/pgtable.c
> @@ -188,11 +188,10 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep,
> pte_t pte)
> {
> /*
> - * When handling numa faults, we already have the pte marked
> - * _PAGE_PRESENT, but we can be sure that it is not in hpte.
> - * Hence we can use set_pte_at for them.
> + * Make sure hardware valid bit is not set. We don't do
> + * tlb flush for this update.
> */
> - VM_WARN_ON(pte_present(*ptep) && !pte_protnone(*ptep));
> + VM_WARN_ON(pte_val(*ptep) & _PAGE_PRESENT);
Why not using pte_present() anymore ?
Also, you are removing the pte_protnone() check, won't it change the
behaviour ?
If we can't use pte_present(), can we create a new helper for that
(allthough _PAGE_PRESENT exists on all platforms).
Christophe
>
> /* Add the pte bit when trying to set a pte */
> pte = __pte(pte_val(pte) | _PAGE_PTE);
>
^ permalink raw reply
* Re: [PATCH v8 3/3] powerpc/sysfs: Add topology/smallcore_thread_siblings[_list]
From: kbuild test robot @ 2018-09-21 6:20 UTC (permalink / raw)
To: Gautham R. Shenoy
Cc: kbuild-all, Aneesh Kumar K.V, Srikar Dronamraju, Michael Ellerman,
Benjamin Herrenschmidt, Michael Neuling, Vaidyanathan Srinivasan,
Akshay Adiga, Shilpasri G Bhat, Oliver O'Halloran,
Nicholas Piggin, Murilo Opsfelder Araujo, Anton Blanchard,
linuxppc-dev, linux-kernel, Gautham R. Shenoy
In-Reply-To: <1537464159-25919-4-git-send-email-ego@linux.vnet.ibm.com>
[-- Attachment #1: Type: text/plain, Size: 3746 bytes --]
Hi Gautham,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on powerpc/next]
[also build test ERROR on v4.19-rc4 next-20180919]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Gautham-R-Shenoy/powerpc-Detection-and-scheduler-optimization-for-POWER9-bigcore/20180921-085812
base: https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git next
config: powerpc-mpc837x_mds_defconfig (attached as .config)
compiler: powerpc-linux-gnu-gcc (Debian 7.2.0-11) 7.2.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# save the attached .config to linux build tree
GCC_VERSION=7.2.0 make.cross ARCH=powerpc
All errors (new ones prefixed by >>):
arch/powerpc/kernel/sysfs.c: In function 'smallcore_thread_siblings_show':
>> arch/powerpc/kernel/sysfs.c:724:45: error: implicit declaration of function 'cpu_smallcore_mask'; did you mean 'cpu_all_mask'? [-Werror=implicit-function-declaration]
return cpumap_print_to_pagebuf(false, buf, cpu_smallcore_mask(cpu));
^~~~~~~~~~~~~~~~~~
cpu_all_mask
>> arch/powerpc/kernel/sysfs.c:724:45: error: passing argument 3 of 'cpumap_print_to_pagebuf' makes pointer from integer without a cast [-Werror=int-conversion]
In file included from include/linux/rcupdate.h:44:0,
from include/linux/radix-tree.h:28,
from include/linux/idr.h:15,
from include/linux/kernfs.h:14,
from include/linux/sysfs.h:16,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from arch/powerpc/kernel/sysfs.c:1:
include/linux/cpumask.h:892:1: note: expected 'const struct cpumask *' but argument is of type 'int'
cpumap_print_to_pagebuf(bool list, char *buf, const struct cpumask *mask)
^~~~~~~~~~~~~~~~~~~~~~~
arch/powerpc/kernel/sysfs.c: In function 'smallcore_thread_siblings_list_show':
arch/powerpc/kernel/sysfs.c:734:44: error: passing argument 3 of 'cpumap_print_to_pagebuf' makes pointer from integer without a cast [-Werror=int-conversion]
return cpumap_print_to_pagebuf(true, buf, cpu_smallcore_mask(cpu));
^~~~~~~~~~~~~~~~~~
In file included from include/linux/rcupdate.h:44:0,
from include/linux/radix-tree.h:28,
from include/linux/idr.h:15,
from include/linux/kernfs.h:14,
from include/linux/sysfs.h:16,
from include/linux/kobject.h:20,
from include/linux/device.h:16,
from arch/powerpc/kernel/sysfs.c:1:
include/linux/cpumask.h:892:1: note: expected 'const struct cpumask *' but argument is of type 'int'
cpumap_print_to_pagebuf(bool list, char *buf, const struct cpumask *mask)
^~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
vim +724 arch/powerpc/kernel/sysfs.c
717
718 static ssize_t smallcore_thread_siblings_show(struct device *dev,
719 struct device_attribute *attr,
720 char *buf)
721 {
722 int cpu = dev->id;
723
> 724 return cpumap_print_to_pagebuf(false, buf, cpu_smallcore_mask(cpu));
725 }
726 static DEVICE_ATTR_RO(smallcore_thread_siblings);
727
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 15057 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 1/9] signal/powerpc: Use force_sig_mceerr as appropriate
From: Stephen Rothwell @ 2018-09-21 8:20 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-1-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 533 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:42 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> In do_sigbus isolate the mceerr signaling code and call
> force_sig_mceerr instead of falling through to the force_sig_info that
> works for all of the other signals.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Looks good to me. I was going to mention further cleanup, but I see
you do that in a later patch.
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 2/9] signal/powerpc: Remove pkey parameter from __bad_area
From: Stephen Rothwell @ 2018-09-21 8:23 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-2-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 391 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:43 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> There are no callers of __bad_area that pass in a pkey parameter so it makes
> no sense to take one.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Fairly straight forward.
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 3/9] signal/powerpc: Call _exception_pkey directly from bad_key_fault_exception
From: Stephen Rothwell @ 2018-09-21 8:27 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-3-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 365 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:44 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> This removes the need for other code paths to deal with pkey exceptions.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Straight forward expansion.
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 4/9] signal/powerpc: Remove pkey parameter from __bad_area_nosemaphore
From: Stephen Rothwell @ 2018-09-21 8:32 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-4-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 493 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:45 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> Now that bad_key_fault_exception no longer calls __bad_area_nosemaphore
> there is no reason for __bad_area_nosemaphore to handle pkeys.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Again, very straight forward given that _exception(a,b,c,d) -> _exception_pkey(a,b,c,d,0).
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 5/9] signal/powerpc: Factor the common exception code into exception_common
From: Stephen Rothwell @ 2018-09-21 8:38 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-5-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 669 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:46 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> It is brittle and wrong to populate si_pkey when there was not a pkey
> exception. The field does not exist for all si_codes and in some
> cases another field exists in the same memory location.
>
> So factor out the code that all exceptions handlers must run
> into exception_common, leaving the individual exception handlers
> to generate the signals themselves.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Clearly no change in semantics.
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [PATCH 3/3] mm: optimise pte dirty/accessed bit setting by demand based pte insertion
From: Ley Foon Tan @ 2018-09-21 8:42 UTC (permalink / raw)
To: Nicholas Piggin, Guenter Roeck
Cc: linux-mm, linux-arch, linux-kernel, linuxppc-dev, Andrew Morton,
Linus Torvalds, Ley Foon Tan, nios2-dev
In-Reply-To: <20180918035337.0727dad0@roar.ozlabs.ibm.com>
On Tue, 2018-09-18 at 03:53 +1000, Nicholas Piggin wrote:
> On Wed, 5 Sep 2018 07:29:51 -0700
> Guenter Roeck <linux@roeck-us.net> wrote:
>=20
> >=20
> > Hi,
> >=20
> > On Tue, Aug 28, 2018 at 09:20:34PM +1000, Nicholas Piggin wrote:
> > >=20
> > > Similarly to the previous patch, this tries to optimise
> > > dirty/accessed
> > > bits in ptes to avoid access costs of hardware setting them.
> > >=20
> > This patch results in silent nios2 boot failures, silent meaning
> > that
> > the boot stalls.
> Okay I just got back to looking at this. The reason for the hang is
> I think a bug in the nios2 TLB code, but maybe other archs have
> similar
> issues.
>=20
> In case of a missing / !present Linux pte, nios2 installs a TLB entry
> with no permissions via its fast TLB exception handler (software TLB
> fill). Then it relies on that causing a TLB permission exception in a
> slower handler that calls handle_mm_fault to set the Linux pte and
> flushes the old TLB. Then the fast exception handler will find the
> new
> Linux pte.
>=20
> With this patch, nios2 has a case where handle_mm_fault does not
> flush
> the old TLB, which results in the TLB permission exception
> continually
> being retried.
>=20
> What happens now is that fault paths like do_read_fault will install
> a
> Linux pte with the young bit clear and return. That will cause nios2
> to
> fault again but this time go down the bottom of handle_pte_fault and
> to
> the access flags update with the young bit set. The young bit is seen
> to
> be different, so that causes ptep_set_access_flags to do a TLB flush
> and
> that finally allows the fast TLB handler to fire and pick up the new
> Linux pte.
>=20
> With this patch, the young bit is set in the first handle_mm_fault,
> so
> the second handle_mm_fault no longer sees the ptes are different and
> does not flush the TLB. The spurious fault handler also does not
> flush
> them unless FAULT_FLAG_WRITE is set.
>=20
> What nios2 should do is invalidate the TLB in update_mmu_cache. What
> it
> *really* should do is install the new TLB entry, I have some patches
> to
> make that work in qemu I can submit. But I would like to try getting
> these dirty/accessed bit optimisation in 4.20, so I will send a
> simple
> path to just do the TLB invalidate that could go in Andrew's git
> tree.
>=20
> Is that agreeable with the nios2 maintainers?
>=20
> Thanks,
> Nick
>=20
Hi
Do you have patches to test?
Regards
Ley Foon
^ permalink raw reply
* Re: [REVIEW][PATCH 6/9] signal/powerpc: Call force_sig_fault from _exception
From: Stephen Rothwell @ 2018-09-21 8:48 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-6-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 546 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:47 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> The callers of _exception don't need the pkey exception logic because
> they are not processing a pkey exception. So just call exception_common
> directly and then call force_sig_fault to generate the appropriate siginfo
> and deliver the appropriate signal.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Looks right to me.
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 7/9] signal/poewrpc: Specialize _exception_pkey for handling pkey exceptions
From: Stephen Rothwell @ 2018-09-21 8:54 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-7-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 956 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:48 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> Now that _exception no longer calls _exception_pkey it is no longer
> necessary to handle any signal with any si_code. All pkey exceptions
> are SIGSEGV with paired with SEGV_PKUERR. So just handle
> that case and remove the now unnecessary parameters from _exception_pkey.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Looks fine to me (small query below).
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
> clear_siginfo(&info);
> - info.si_signo = signr;
> - info.si_code = code;
> + info.si_signo = SIGSEGV;
> + info.si_code = SEGV_PKUERR;
> info.si_addr = (void __user *) addr;
> info.si_pkey = key;
>
> - force_sig_info(signr, &info, current);
> + force_sig_info(info.si_signo, &info, current);
^^^^^^^^^^^^^
Why not just SIGSEGV?
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 8/9] signal/powerpc: Simplify _exception_pkey by using force_sig_pkuerr
From: Stephen Rothwell @ 2018-09-21 8:57 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-8-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 402 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:49 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> Call force_sig_pkuerr directly instead of rolling it by hand
> in _exception_pkey.
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
You can ignore the question in the previous email :-)
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 7/9] signal/poewrpc: Specialize _exception_pkey for handling pkey exceptions
From: Christophe LEROY @ 2018-09-21 8:58 UTC (permalink / raw)
To: Stephen Rothwell, Eric W. Biederman
Cc: linux-arch, linux-kernel, Paul Mackerras, linuxppc-dev
In-Reply-To: <20180921185429.4cda432e@canb.auug.org.au>
Le 21/09/2018 à 10:54, Stephen Rothwell a écrit :
> Hi Eric,
>
> On Tue, 18 Sep 2018 19:58:48 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>>
>> Now that _exception no longer calls _exception_pkey it is no longer
>> necessary to handle any signal with any si_code. All pkey exceptions
>> are SIGSEGV with paired with SEGV_PKUERR. So just handle
>> that case and remove the now unnecessary parameters from _exception_pkey.
>>
>> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
>
> Looks fine to me (small query below).
>
> Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
In the patch title, s/poewrpc/powerpc
>
>> clear_siginfo(&info);
>> - info.si_signo = signr;
>> - info.si_code = code;
>> + info.si_signo = SIGSEGV;
>> + info.si_code = SEGV_PKUERR;
>> info.si_addr = (void __user *) addr;
>> info.si_pkey = key;
>>
>> - force_sig_info(signr, &info, current);
>> + force_sig_info(info.si_signo, &info, current);
> ^^^^^^^^^^^^^
> Why not just SIGSEGV?
>
^ permalink raw reply
* Re: [REVIEW][PATCH 9/9] signal/powerpc: Use force_sig_fault where appropriate
From: Stephen Rothwell @ 2018-09-21 9:05 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <20180918175850.4437-9-ebiederm@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 284 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:58:50 +0200 "Eric W. Biederman" <ebiederm@xmission.com> wrote:
>
> Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
Again, looks all good to me.
Reviewed-by: Stephen Rothwell <sfr@canb.auug.org.au>
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [REVIEW][PATCH 0/9] signal/powerpc: siginfo cleanups
From: Stephen Rothwell @ 2018-09-21 9:06 UTC (permalink / raw)
To: Eric W. Biederman
Cc: linux-kernel, linux-arch, linuxppc-dev, Benjamin Herrenschmidt,
Paul Mackerras, Michael Ellerman
In-Reply-To: <878t3yitze.fsf@xmission.com>
[-- Attachment #1: Type: text/plain, Size: 353 bytes --]
Hi Eric,
On Tue, 18 Sep 2018 19:41:09 +0200 ebiederm@xmission.com (Eric W. Biederman) wrote:
>
> Folks please review and double check me. I think I have kept these
> changes simple and obviously correct but I am human and mess up
> sometimes.
Its always good to see a nicely set out patch series like this.
--
Cheers,
Stephen Rothwell
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
^ permalink raw reply
* Re: [PATCH V3 1/6] powerpc/mm/book3s: Update pmd_present to look at _PAGE_PRESENT bit
From: Aneesh Kumar K.V @ 2018-09-21 10:26 UTC (permalink / raw)
To: Christophe LEROY, npiggin, benh, paulus, mpe; +Cc: linuxppc-dev
In-Reply-To: <71b953af-5063-2440-62aa-9c3a7a738dc6@c-s.fr>
On 9/21/18 11:25 AM, Christophe LEROY wrote:
>
>
> Le 20/09/2018 à 20:09, Aneesh Kumar K.V a écrit :
>> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c
>> index d71c7777669c..aee04b209b51 100644
>> --- a/arch/powerpc/mm/pgtable.c
>> +++ b/arch/powerpc/mm/pgtable.c
>> @@ -188,11 +188,10 @@ void set_pte_at(struct mm_struct *mm, unsigned
>> long addr, pte_t *ptep,
>> pte_t pte)
>> {
>> /*
>> - * When handling numa faults, we already have the pte marked
>> - * _PAGE_PRESENT, but we can be sure that it is not in hpte.
>> - * Hence we can use set_pte_at for them.
>> + * Make sure hardware valid bit is not set. We don't do
>> + * tlb flush for this update.
>> */
>> - VM_WARN_ON(pte_present(*ptep) && !pte_protnone(*ptep));
>> + VM_WARN_ON(pte_val(*ptep) & _PAGE_PRESENT);
>
> Why not using pte_present() anymore ?
>
> Also, you are removing the pte_protnone() check, won't it change the
> behaviour ?
>
> If we can't use pte_present(), can we create a new helper for that
> (allthough _PAGE_PRESENT exists on all platforms).
>
> Christophe
>
This patch update a page table clear to clear _PAGE_PRESENT and mark it
invalid via _PAGE_INVALID. The pte_present now looks at both the flag.
That is we want these transient clear of pte to be considered as present
pte even if _PAGE_PRESENT is cleared. What we are catching by the debug
BUG_ON in these function is we are not using them to set a pte where the
old entry has a hadware valid bit set. This is because we don't do any
tlb flush with set_pte_at.
So the reason for pte_present -> pte_val() & _PAGE_PRESENT is because we
swtiched the clear to clear _PAGE_PRESENT and set _PAGE_INVALID and
pte_present now check both.
The reason for the removal of pte_protnone is because we dropped that
set_pte_at usage from core autonuma code long time back.
Now Considering we are calling this from mm/pgtable.c With your approach
of not using pte flags directly in core code we could switch this to
pte_hw_valid(). May be we can do that as an addon patch?
-aneesh
^ permalink raw reply
* [PATCH -next] powerpc/pseries/memory-hotplug: Fix return value type of find_aa_index
From: YueHaibing @ 2018-09-21 10:37 UTC (permalink / raw)
To: benh, paulus, mpe, nfont; +Cc: linux-kernel, linuxppc-dev, YueHaibing
find_aa_index will return -1 when dlpar_clone_property fails,
its return value type should be int. Also the caller
update_lmb_associativity_index should use a int variable to
get it,then compared with 0.
Fixes: c05a5a40969e ("powerpc/pseries: Dynamic add entires to associativity lookup array")
Signed-off-by: YueHaibing <yuehaibing@huawei.com>
---
arch/powerpc/platforms/pseries/hotplug-memory.c | 7 +++----
1 file changed, 3 insertions(+), 4 deletions(-)
diff --git a/arch/powerpc/platforms/pseries/hotplug-memory.c b/arch/powerpc/platforms/pseries/hotplug-memory.c
index 9a15d39..6aad17c 100644
--- a/arch/powerpc/platforms/pseries/hotplug-memory.c
+++ b/arch/powerpc/platforms/pseries/hotplug-memory.c
@@ -101,13 +101,12 @@ static struct property *dlpar_clone_property(struct property *prop,
return new_prop;
}
-static u32 find_aa_index(struct device_node *dr_node,
+static int find_aa_index(struct device_node *dr_node,
struct property *ala_prop, const u32 *lmb_assoc)
{
u32 *assoc_arrays;
- u32 aa_index;
int aa_arrays, aa_array_entries, aa_array_sz;
- int i, index;
+ int i, index, aa_index;
/*
* The ibm,associativity-lookup-arrays property is defined to be
@@ -168,7 +167,7 @@ static int update_lmb_associativity_index(struct drmem_lmb *lmb)
struct device_node *parent, *lmb_node, *dr_node;
struct property *ala_prop;
const u32 *lmb_assoc;
- u32 aa_index;
+ int aa_index;
parent = of_find_node_by_path("/");
if (!parent)
--
2.7.0
^ permalink raw reply related
* Re: [PATCH V3 1/6] powerpc/mm/book3s: Update pmd_present to look at _PAGE_PRESENT bit
From: Christophe LEROY @ 2018-09-21 10:52 UTC (permalink / raw)
To: Aneesh Kumar K.V, npiggin, benh, paulus, mpe; +Cc: linuxppc-dev
In-Reply-To: <e64affb4-858b-1424-e850-07442fd45912@linux.ibm.com>
Le 21/09/2018 à 12:26, Aneesh Kumar K.V a écrit :
> On 9/21/18 11:25 AM, Christophe LEROY wrote:
>>
>>
>> Le 20/09/2018 à 20:09, Aneesh Kumar K.V a écrit :
>
>>> diff --git a/arch/powerpc/mm/pgtable.c b/arch/powerpc/mm/pgtable.c
>>> index d71c7777669c..aee04b209b51 100644
>>> --- a/arch/powerpc/mm/pgtable.c
>>> +++ b/arch/powerpc/mm/pgtable.c
>>> @@ -188,11 +188,10 @@ void set_pte_at(struct mm_struct *mm, unsigned
>>> long addr, pte_t *ptep,
>>> pte_t pte)
>>> {
>>> /*
>>> - * When handling numa faults, we already have the pte marked
>>> - * _PAGE_PRESENT, but we can be sure that it is not in hpte.
>>> - * Hence we can use set_pte_at for them.
>>> + * Make sure hardware valid bit is not set. We don't do
>>> + * tlb flush for this update.
>>> */
>>> - VM_WARN_ON(pte_present(*ptep) && !pte_protnone(*ptep));
>>> + VM_WARN_ON(pte_val(*ptep) & _PAGE_PRESENT);
>>
>> Why not using pte_present() anymore ?
>>
>> Also, you are removing the pte_protnone() check, won't it change the
>> behaviour ?
>>
>> If we can't use pte_present(), can we create a new helper for that
>> (allthough _PAGE_PRESENT exists on all platforms).
>>
>> Christophe
>>
>
> This patch update a page table clear to clear _PAGE_PRESENT and mark it
> invalid via _PAGE_INVALID. The pte_present now looks at both the flag.
> That is we want these transient clear of pte to be considered as present
> pte even if _PAGE_PRESENT is cleared. What we are catching by the debug
> BUG_ON in these function is we are not using them to set a pte where the
> old entry has a hadware valid bit set. This is because we don't do any
> tlb flush with set_pte_at.
>
>
> So the reason for pte_present -> pte_val() & _PAGE_PRESENT is because we
> swtiched the clear to clear _PAGE_PRESENT and set _PAGE_INVALID and
> pte_present now check both.
>
> The reason for the removal of pte_protnone is because we dropped that
> set_pte_at usage from core autonuma code long time back.
>
> Now Considering we are calling this from mm/pgtable.c With your approach
> of not using pte flags directly in core code we could switch this to
> pte_hw_valid(). May be we can do that as an addon patch?
>
Ok, depending on which serie goes first, I'll add it in mine if I have
to rebase.
Christophe
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox