Consider namespace with size as active namespace
diff mbox series

Message ID 20190807043915.30239-1-aneesh.kumar@linux.ibm.com
State New
Headers show
Series
  • Consider namespace with size as active namespace
Related show

Commit Message

Aneesh Kumar K.V Aug. 7, 2019, 4:39 a.m. UTC
This enables us to mark a namespace as disabled due to pfn_sb
mismatch. We have pending kernel patches at that will mark the
namespace disabled when the PAGE_SIZE or struct page size didn't
match with the value stored in pfn_sb.

We need to make sure we don't use this disabled namespace as seed namespace
for new namespace creation.

Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
---
 ndctl/namespace.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

Comments

Verma, Vishal L Oct. 16, 2019, 10:31 p.m. UTC | #1
On Wed, 2019-08-07 at 10:09 +0530, Aneesh Kumar K.V wrote:
> This enables us to mark a namespace as disabled due to pfn_sb
> mismatch. We have pending kernel patches at that will mark the
> namespace disabled when the PAGE_SIZE or struct page size didn't
> match with the value stored in pfn_sb.
> 
> We need to make sure we don't use this disabled namespace as seed namespace
> for new namespace creation.
> 
> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
> ---
>  ndctl/namespace.c | 3 ++-
>  1 file changed, 2 insertions(+), 1 deletion(-)
> 
> diff --git a/ndctl/namespace.c b/ndctl/namespace.c
> index 58a9e3c53474..1f212a2b3a9b 100644
> --- a/ndctl/namespace.c
> +++ b/ndctl/namespace.c
> @@ -455,7 +455,8 @@ static int is_namespace_active(struct ndctl_namespace *ndns)
>  	return ndns && (ndctl_namespace_is_enabled(ndns)
>  		|| ndctl_namespace_get_pfn(ndns)
>  		|| ndctl_namespace_get_dax(ndns)
> -		|| ndctl_namespace_get_btt(ndns));
> +		|| ndctl_namespace_get_btt(ndns)
> +		|| ndctl_namespace_get_size(ndns));
>  }
>  
>  /*

Hi Aneesh,

I was going through pending ndctl patches and found this - this seems to
break some of the unit tests. Also, have the relevant kernel patches
been posted?

The failing unit tests are sector-mode.sh and dax.sh

	-Vishal
Aneesh Kumar K.V Oct. 17, 2019, 3:05 a.m. UTC | #2
On 10/17/19 4:01 AM, Verma, Vishal L wrote:
> On Wed, 2019-08-07 at 10:09 +0530, Aneesh Kumar K.V wrote:
>> This enables us to mark a namespace as disabled due to pfn_sb
>> mismatch. We have pending kernel patches at that will mark the
>> namespace disabled when the PAGE_SIZE or struct page size didn't
>> match with the value stored in pfn_sb.
>>
>> We need to make sure we don't use this disabled namespace as seed namespace
>> for new namespace creation.
>>
>> Signed-off-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
>> ---
>>   ndctl/namespace.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/ndctl/namespace.c b/ndctl/namespace.c
>> index 58a9e3c53474..1f212a2b3a9b 100644
>> --- a/ndctl/namespace.c
>> +++ b/ndctl/namespace.c
>> @@ -455,7 +455,8 @@ static int is_namespace_active(struct ndctl_namespace *ndns)
>>   	return ndns && (ndctl_namespace_is_enabled(ndns)
>>   		|| ndctl_namespace_get_pfn(ndns)
>>   		|| ndctl_namespace_get_dax(ndns)
>> -		|| ndctl_namespace_get_btt(ndns));
>> +		|| ndctl_namespace_get_btt(ndns)
>> +		|| ndctl_namespace_get_size(ndns));
>>   }
>>   
>>   /*
> 
> Hi Aneesh,
> 
> I was going through pending ndctl patches and found this - this seems to
> break some of the unit tests. Also, have the relevant kernel patches
> been posted?

Yes. The required changes in kernel got merged as part of

commit 1c97afa714098aab2ca588cc654f8ff67dd46dcb
Author: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Date:   Thu Sep 5 21:15:58 2019 +0530

     libnvdimm/pmem: Advance namespace seed for specific probe errors


> 
> The failing unit tests are sector-mode.sh and dax.sh
> 

I will see if i can run them on ppc64. We still had issues in getting 
ndctl check to be running on ppc64.

-aneesh
Verma, Vishal L Oct. 30, 2019, 11:39 p.m. UTC | #3
On Thu, 2019-10-17 at 08:35 +0530, Aneesh Kumar K.V wrote:
> 
> > > ---
> > >   ndctl/namespace.c | 3 ++-
> > >   1 file changed, 2 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/ndctl/namespace.c b/ndctl/namespace.c
> > > index 58a9e3c53474..1f212a2b3a9b 100644
> > > --- a/ndctl/namespace.c
> > > +++ b/ndctl/namespace.c
> > > @@ -455,7 +455,8 @@ static int is_namespace_active(struct ndctl_namespace *ndns)
> > >   	return ndns && (ndctl_namespace_is_enabled(ndns)
> > >   		|| ndctl_namespace_get_pfn(ndns)
> > >   		|| ndctl_namespace_get_dax(ndns)
> > > -		|| ndctl_namespace_get_btt(ndns));
> > > +		|| ndctl_namespace_get_btt(ndns)
> > > +		|| ndctl_namespace_get_size(ndns));
> > >   }
> > >   
> > >   /*
[..]
> 
> > The failing unit tests are sector-mode.sh and dax.sh
> > 
> 
> I will see if i can run them on ppc64. We still had issues in getting 
> ndctl check to be running on ppc64.
> 

I dug into this a bit more.

The failure happens on 'legacy' namespaces (ND_DEVICE_NAMESPACE_IO).

There is an assumption that legacy namespaces cannot be fully deleted,
so as part of a reconfigure, when it comes time to delete the namespace
(ndctl_namespace_delete()), we refuse to do that, and bail, before
setting the size to zero.

libndctl.c:4467

	case ND_DEVICE_NAMESPACE_BLK:
		break;
	default:
		dbg(ctx, "%s: nstype: %d not deletable\n",
				ndctl_namespace_get_devname(ndns),
				ndctl_namespace_get_type(ndns));
		return 0;
	}

	rc = namespace_set_size(ndns, 0);
...

Indeed, destroy namespace wouldn't even get to that point, because that
assumption is repeated in namespace_destroy(), where we switch on
namespace type, and potentially skip over the ndctl_namespace_destroy
call entirely.

If setting the size to zero is now significant we'd need to rework both
of these sites. In destroy_namespace(), delay the did_zero checking
until after ndctl_namespace_delete(), and in ndctl_namespace_delete(),
set the size to zero before the type check.

Dan, does the above make sense - was there reason to refrain from
touching the size on legacy namespaces?

	-Vishal
Dan Williams Oct. 31, 2019, 6:10 p.m. UTC | #4
On Wed, Oct 30, 2019 at 4:39 PM Verma, Vishal L
<vishal.l.verma@intel.com> wrote:
>
> On Thu, 2019-10-17 at 08:35 +0530, Aneesh Kumar K.V wrote:
> >
> > > > ---
> > > >   ndctl/namespace.c | 3 ++-
> > > >   1 file changed, 2 insertions(+), 1 deletion(-)
> > > >
> > > > diff --git a/ndctl/namespace.c b/ndctl/namespace.c
> > > > index 58a9e3c53474..1f212a2b3a9b 100644
> > > > --- a/ndctl/namespace.c
> > > > +++ b/ndctl/namespace.c
> > > > @@ -455,7 +455,8 @@ static int is_namespace_active(struct ndctl_namespace *ndns)
> > > >           return ndns && (ndctl_namespace_is_enabled(ndns)
> > > >                   || ndctl_namespace_get_pfn(ndns)
> > > >                   || ndctl_namespace_get_dax(ndns)
> > > > -         || ndctl_namespace_get_btt(ndns));
> > > > +         || ndctl_namespace_get_btt(ndns)
> > > > +         || ndctl_namespace_get_size(ndns));
> > > >   }
> > > >
> > > >   /*
> [..]
> >
> > > The failing unit tests are sector-mode.sh and dax.sh
> > >
> >
> > I will see if i can run them on ppc64. We still had issues in getting
> > ndctl check to be running on ppc64.
> >
>
> I dug into this a bit more.
>
> The failure happens on 'legacy' namespaces (ND_DEVICE_NAMESPACE_IO).
>
> There is an assumption that legacy namespaces cannot be fully deleted,
> so as part of a reconfigure, when it comes time to delete the namespace
> (ndctl_namespace_delete()), we refuse to do that, and bail, before
> setting the size to zero.
>
> libndctl.c:4467
>
>         case ND_DEVICE_NAMESPACE_BLK:
>                 break;
>         default:
>                 dbg(ctx, "%s: nstype: %d not deletable\n",
>                                 ndctl_namespace_get_devname(ndns),
>                                 ndctl_namespace_get_type(ndns));
>                 return 0;
>         }
>
>         rc = namespace_set_size(ndns, 0);
> ...
>
> Indeed, destroy namespace wouldn't even get to that point, because that
> assumption is repeated in namespace_destroy(), where we switch on
> namespace type, and potentially skip over the ndctl_namespace_destroy
> call entirely.
>
> If setting the size to zero is now significant we'd need to rework both
> of these sites. In destroy_namespace(), delay the did_zero checking
> until after ndctl_namespace_delete(), and in ndctl_namespace_delete(),
> set the size to zero before the type check.
>
> Dan, does the above make sense - was there reason to refrain from
> touching the size on legacy namespaces?

It's because the size is read-only on legacy namespaces, so writes
will always fail so the assumption is that ndctl_namespace_delete() is
a nop. Hmm, but that makes me think that size == read-only might be a
good gate for this idle check, i.e.:

if (size_is_writable(ndns) && size(ndns) != 0)
    return not_idle;

Patch
diff mbox series

diff --git a/ndctl/namespace.c b/ndctl/namespace.c
index 58a9e3c53474..1f212a2b3a9b 100644
--- a/ndctl/namespace.c
+++ b/ndctl/namespace.c
@@ -455,7 +455,8 @@  static int is_namespace_active(struct ndctl_namespace *ndns)
 	return ndns && (ndctl_namespace_is_enabled(ndns)
 		|| ndctl_namespace_get_pfn(ndns)
 		|| ndctl_namespace_get_dax(ndns)
-		|| ndctl_namespace_get_btt(ndns));
+		|| ndctl_namespace_get_btt(ndns)
+		|| ndctl_namespace_get_size(ndns));
 }
 
 /*