Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1210792 > unrolled thread
| Started by | Andrew Morton <akpm@linux-foundation.org> |
|---|---|
| First post | 2015-08-21 01:40 +0200 |
| Last post | 2015-08-27 21:20 +0200 |
| Articles | 20 on this page of 26 — 7 participants |
Back to article view | Back to linux.kernel
This discussion starts older than the indexed window; earlier articles aren't shown. The article labeled Started by
below is the oldest one visible, not the original post.
Re: [PATCHv3 4/5] mm: make compound_head() robust Andrew Morton <akpm@linux-foundation.org> - 2015-08-21 01:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Kirill A. Shutemov" <kirill@shutemov.name> - 2015-08-21 14:20 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Christoph Lameter <cl@linux.com> - 2015-08-21 18:20 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Kirill A. Shutemov" <kirill@shutemov.name> - 2015-08-21 21:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Andrew Morton <akpm@linux-foundation.org> - 2015-08-21 21:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Christoph Lameter <cl@linux.com> - 2015-08-21 23:20 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Vlastimil Babka <vbabka@suse.cz> - 2015-08-24 17:50 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Vlastimil Babka <vbabka@suse.cz> - 2015-08-25 13:50 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Kirill A. Shutemov" <kirill@shutemov.name> - 2015-08-25 20:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-25 22:20 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Vlastimil Babka <vbabka@suse.cz> - 2015-08-25 22:50 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-25 23:30 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Kirill A. Shutemov" <kirill@shutemov.name> - 2015-08-26 17:10 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Vlastimil Babka <vbabka@suse.cz> - 2015-08-26 17:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-26 18:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Hugh Dickins <hughd@google.com> - 2015-08-26 20:20 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-26 23:30 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Hugh Dickins <hughd@google.com> - 2015-08-27 00:30 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-27 01:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Michal Hocko <mhocko@kernel.org> - 2015-08-27 17:10 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Michal Hocko <mhocko@kernel.org> - 2015-08-27 18:10 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Hugh Dickins <hughd@google.com> - 2015-08-27 19:30 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Michal Hocko <mhocko@kernel.org> - 2015-08-27 20:10 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-27 18:40 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust Michal Hocko <mhocko@kernel.org> - 2015-08-27 20:20 +0200
Re: [PATCHv3 4/5] mm: make compound_head() robust "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> - 2015-08-27 21:20 +0200
Page 1 of 2 [1] 2 Next page →
| From | Andrew Morton <akpm@linux-foundation.org> |
|---|---|
| Date | 2015-08-21 01:40 +0200 |
| Subject | Re: [PATCHv3 4/5] mm: make compound_head() robust |
| Message-ID | <pZHB8-33E-19@gated-at.bofh.it> |
On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
> Hugh has pointed that compound_head() call can be unsafe in some
> context. There's one example:
>
> CPU0 CPU1
>
> isolate_migratepages_block()
> page_count()
> compound_head()
> !!PageTail() == true
> put_page()
> tail->first_page = NULL
> head = tail->first_page
> alloc_pages(__GFP_COMP)
> prep_compound_page()
> tail->first_page = head
> __SetPageTail(p);
> !!PageTail() == true
> <head == NULL dereferencing>
>
> The race is pure theoretical. I don't it's possible to trigger it in
> practice. But who knows.
>
> We can fix the race by changing how encode PageTail() and compound_head()
> within struct page to be able to update them in one shot.
>
> The patch introduces page->compound_head into third double word block in
> front of compound_dtor and compound_order. That means it shares storage
> space with:
>
> - page->lru.next;
> - page->next;
> - page->rcu_head.next;
> - page->pmd_huge_pte;
>
> That's too long list to be absolutely sure, but looks like nobody uses
> bit 0 of the word. It can be used to encode PageTail(). And if the bit
> set, rest of the word is pointer to head page.
So nothing else which participates in the union in the "Third double
word block" is allowed to use bit zero of the first word.
Is this really true? For example if it's a slab page, will that page
ever be inspected by code which is looking for the PageTail bit?
Anyway, this is quite subtle and there's a risk that people will
accidentally break it later on. I don't think the patch puts
sufficient documentation in place to prevent this. And even
documentation might not be enough to prevent accidents.
>
> ...
>
> --- a/include/linux/mm_types.h
> +++ b/include/linux/mm_types.h
> @@ -120,7 +120,12 @@ struct page {
> };
> };
>
> - /* Third double word block */
> + /*
> + * Third double word block
> + *
> + * WARNING: bit 0 of the first word encode PageTail and *must* be 0
> + * for non-tail pages.
> + */
> union {
> struct list_head lru; /* Pageout list, eg. active_list
> * protected by zone->lru_lock !
> @@ -143,6 +148,7 @@ struct page {
> */
> /* First tail page of compound page */
> struct {
> + unsigned long compound_head; /* If bit zero is set */
I think the comments around here should have more details and should
be louder!
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [next] | [standalone]
| From | "Kirill A. Shutemov" <kirill@shutemov.name> |
|---|---|
| Date | 2015-08-21 14:20 +0200 |
| Message-ID | <pZTsC-3k5-17@gated-at.bofh.it> |
| In reply to | #1210792 |
On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote:
> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
>
> > Hugh has pointed that compound_head() call can be unsafe in some
> > context. There's one example:
> >
> > CPU0 CPU1
> >
> > isolate_migratepages_block()
> > page_count()
> > compound_head()
> > !!PageTail() == true
> > put_page()
> > tail->first_page = NULL
> > head = tail->first_page
> > alloc_pages(__GFP_COMP)
> > prep_compound_page()
> > tail->first_page = head
> > __SetPageTail(p);
> > !!PageTail() == true
> > <head == NULL dereferencing>
> >
> > The race is pure theoretical. I don't it's possible to trigger it in
> > practice. But who knows.
> >
> > We can fix the race by changing how encode PageTail() and compound_head()
> > within struct page to be able to update them in one shot.
> >
> > The patch introduces page->compound_head into third double word block in
> > front of compound_dtor and compound_order. That means it shares storage
> > space with:
> >
> > - page->lru.next;
> > - page->next;
> > - page->rcu_head.next;
> > - page->pmd_huge_pte;
> >
> > That's too long list to be absolutely sure, but looks like nobody uses
> > bit 0 of the word. It can be used to encode PageTail(). And if the bit
> > set, rest of the word is pointer to head page.
>
> So nothing else which participates in the union in the "Third double
> word block" is allowed to use bit zero of the first word.
Correct.
> Is this really true? For example if it's a slab page, will that page
> ever be inspected by code which is looking for the PageTail bit?
+Christoph.
What we know for sure is that space is not used in tail pages, otherwise
it would collide with current compound_dtor.
For head/small pages it gets trickier. I convinced myself that it should
be safe this way:
All fields it shares space with are pointers (with possible exception of
pmd_huge_pte, see below) to objects with sizeof() > 1. I think it's
reasonable to expect that the bit 0 in such pointers would be clear due
alignment. We do the same for page->mapping.
On pmd_huge_pte: it's pgtable_t which on most architectures is typedef to
struct page *. That should not create any conflicts. On some architectures
it's pte_t *, which is fine too. On arc it's virtual address of the page
in form of unsigned long. It should work.
The worry I have about pmd_huge_pte is that some new architecture may
choose to implement pgtable_t as pfn and that will collide on bit 0. :-/
We can address this worry by shifting pmd_huge_pte to the second word in
the double word block. But I'm not sure if we should.
And of course there's chance that these field are used not according to
its type. I didn't find such cases, but I can't guarantee that they don't
exist.
I tested patched kernel with all three SLAB allocator and was not able to
crash it under trinity. More testing is required.
> Anyway, this is quite subtle and there's a risk that people will
> accidentally break it later on. I don't think the patch puts
> sufficient documentation in place to prevent this.
I would appreciate for suggestion on place and form of documentation.
> And even documentation might not be enough to prevent accidents.
The only think I can propose is VM_BUG_ON() in PageTail() and
compound_head() which would ensure that page->compound_page points to
place within MAX_ORDER_NR_PAGES before the current page if bit 0 is set.
Do you consider this helpful?
> >
> > ...
> >
> > --- a/include/linux/mm_types.h
> > +++ b/include/linux/mm_types.h
> > @@ -120,7 +120,12 @@ struct page {
> > };
> > };
> >
> > - /* Third double word block */
> > + /*
> > + * Third double word block
> > + *
> > + * WARNING: bit 0 of the first word encode PageTail and *must* be 0
> > + * for non-tail pages.
> > + */
> > union {
> > struct list_head lru; /* Pageout list, eg. active_list
> > * protected by zone->lru_lock !
> > @@ -143,6 +148,7 @@ struct page {
> > */
> > /* First tail page of compound page */
> > struct {
> > + unsigned long compound_head; /* If bit zero is set */
>
> I think the comments around here should have more details and should
> be louder!
I'm always bad when it comes to documentation. Is it enough?
/*
* Third double word block
*
* WARNING: bit 0 of the first word encode PageTail(). That means
* the rest users of the storage space MUST NOT use the bit to
* avoid collision and false-positive PageTail().
*/
--
Kirill A. Shutemov
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Christoph Lameter <cl@linux.com> |
|---|---|
| Date | 2015-08-21 18:20 +0200 |
| Message-ID | <pZXcS-kI-37@gated-at.bofh.it> |
| In reply to | #1211128 |
On Fri, 21 Aug 2015, Kirill A. Shutemov wrote: > > Is this really true? For example if it's a slab page, will that page > > ever be inspected by code which is looking for the PageTail bit? > > +Christoph. > > What we know for sure is that space is not used in tail pages, otherwise > it would collide with current compound_dtor. Sl*b allocators only do a virt_to_head_page on tail pages. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Kirill A. Shutemov" <kirill@shutemov.name> |
|---|---|
| Date | 2015-08-21 21:40 +0200 |
| Message-ID | <q00kr-4Le-25@gated-at.bofh.it> |
| In reply to | #1211233 |
On Fri, Aug 21, 2015 at 11:11:27AM -0500, Christoph Lameter wrote: > On Fri, 21 Aug 2015, Kirill A. Shutemov wrote: > > > > Is this really true? For example if it's a slab page, will that page > > > ever be inspected by code which is looking for the PageTail bit? > > > > +Christoph. > > > > What we know for sure is that space is not used in tail pages, otherwise > > it would collide with current compound_dtor. > > Sl*b allocators only do a virt_to_head_page on tail pages. The question was whether it's safe to assume that the bit 0 is always zero in the word as this bit will encode PageTail(). -- Kirill A. Shutemov -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Andrew Morton <akpm@linux-foundation.org> |
|---|---|
| Date | 2015-08-21 21:40 +0200 |
| Message-ID | <q00kt-4Le-71@gated-at.bofh.it> |
| In reply to | #1211306 |
On Fri, 21 Aug 2015 22:31:09 +0300 "Kirill A. Shutemov" <kirill@shutemov.name> wrote: > On Fri, Aug 21, 2015 at 11:11:27AM -0500, Christoph Lameter wrote: > > On Fri, 21 Aug 2015, Kirill A. Shutemov wrote: > > > > > > Is this really true? For example if it's a slab page, will that page > > > > ever be inspected by code which is looking for the PageTail bit? > > > > > > +Christoph. > > > > > > What we know for sure is that space is not used in tail pages, otherwise > > > it would collide with current compound_dtor. > > > > Sl*b allocators only do a virt_to_head_page on tail pages. > > The question was whether it's safe to assume that the bit 0 is always zero > in the word as this bit will encode PageTail(). That wasn't my question actually... What I'm wondering is: if this page is being used for slab, will any code path ever run PageTail() against it? If not, we don't need to be concerned about that bit. And slab was just the example I chose. The same question petains to all other uses of that union. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Christoph Lameter <cl@linux.com> |
|---|---|
| Date | 2015-08-21 23:20 +0200 |
| Message-ID | <q01Tc-74X-13@gated-at.bofh.it> |
| In reply to | #1211307 |
On Fri, 21 Aug 2015, Andrew Morton wrote: > On Fri, 21 Aug 2015 22:31:09 +0300 "Kirill A. Shutemov" <kirill@shutemov.name> wrote: > > > On Fri, Aug 21, 2015 at 11:11:27AM -0500, Christoph Lameter wrote: > > > On Fri, 21 Aug 2015, Kirill A. Shutemov wrote: > > > > > > > > Is this really true? For example if it's a slab page, will that page > > > > > ever be inspected by code which is looking for the PageTail bit? > > > > > > > > +Christoph. > > > > > > > > What we know for sure is that space is not used in tail pages, otherwise > > > > it would collide with current compound_dtor. > > > > > > Sl*b allocators only do a virt_to_head_page on tail pages. > > > > The question was whether it's safe to assume that the bit 0 is always zero > > in the word as this bit will encode PageTail(). > > That wasn't my question actually... > > What I'm wondering is: if this page is being used for slab, will any > code path ever run PageTail() against it? If not, we don't need to be > concerned about that bit. virt_to_head_page will run PageTail because it uses compound_head(). And compound_head needs to use the first_page pointer if its a tail page. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-08-24 17:50 +0200 |
| Message-ID | <q12au-3Av-7@gated-at.bofh.it> |
| In reply to | #1211307 |
On 08/21/2015 09:34 PM, Andrew Morton wrote: > On Fri, 21 Aug 2015 22:31:09 +0300 "Kirill A. Shutemov" <kirill@shutemov.name> wrote: > >> On Fri, Aug 21, 2015 at 11:11:27AM -0500, Christoph Lameter wrote: >>> On Fri, 21 Aug 2015, Kirill A. Shutemov wrote: >>> >>>>> Is this really true? For example if it's a slab page, will that page >>>>> ever be inspected by code which is looking for the PageTail bit? >>>> >>>> +Christoph. >>>> >>>> What we know for sure is that space is not used in tail pages, otherwise >>>> it would collide with current compound_dtor. >>> >>> Sl*b allocators only do a virt_to_head_page on tail pages. >> >> The question was whether it's safe to assume that the bit 0 is always zero >> in the word as this bit will encode PageTail(). > > That wasn't my question actually... > > What I'm wondering is: if this page is being used for slab, will any > code path ever run PageTail() against it? If not, we don't need to be > concerned about that bit. Pfn scanners such as compaction might inspect such pages and run compound_head() (and thus PageTail) on them. I think no kind of page within a zone (slab or otherwise) is "protected" from this, which is why it needs to be robust. > And slab was just the example I chose. The same question petains to > all other uses of that union. > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-08-25 13:50 +0200 |
| Message-ID | <q1kTL-5od-9@gated-at.bofh.it> |
| In reply to | #1211128 |
On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote:
> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote:
>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
>>
>>> The patch introduces page->compound_head into third double word block in
>>> front of compound_dtor and compound_order. That means it shares storage
>>> space with:
>>>
>>> - page->lru.next;
>>> - page->next;
>>> - page->rcu_head.next;
>>> - page->pmd_huge_pte;
>>>
We should probably ask Paul about the chances that rcu_head.next would
like to use the bit too one day?
For pgtable_t I can't think of anything better than a warning in the
generic definition in include/asm-generic/page.h and hope that anyone
reimplementing it for a new arch will look there first.
The lru part is probably the hardest to prevent danger. It can be used
for any private purposes. Hopefully everyone currently uses only
standard list operations here, and the list poison values don't set bit
0. But I see there can be some arbitrary CONFIG_ILLEGAL_POINTER_VALUE
added to the poisons, so maybe that's worth some build error check?
Anyway we would be imposing restrictions on types that are not ours, so
there might be some resistance...
>
>> Anyway, this is quite subtle and there's a risk that people will
>> accidentally break it later on. I don't think the patch puts
>> sufficient documentation in place to prevent this.
>
> I would appreciate for suggestion on place and form of documentation.
>
>> And even documentation might not be enough to prevent accidents.
>
> The only think I can propose is VM_BUG_ON() in PageTail() and
> compound_head() which would ensure that page->compound_page points to
> place within MAX_ORDER_NR_PAGES before the current page if bit 0 is set.
That should probably catch some bad stuff, but probably only moments
before it would crash anyway if the pointer was bogus. But I also don't
see better way, because we can't proactively put checks in those who
would "misbehave", as we don't know who they are. Putting more debug
checks in e.g. page freeing might help, but probably not much.
> Do you consider this helpful?
>
>>>
>>> ...
>>>
>>> --- a/include/linux/mm_types.h
>>> +++ b/include/linux/mm_types.h
>>> @@ -120,7 +120,12 @@ struct page {
>>> };
>>> };
>>>
>>> - /* Third double word block */
>>> + /*
>>> + * Third double word block
>>> + *
>>> + * WARNING: bit 0 of the first word encode PageTail and *must* be 0
>>> + * for non-tail pages.
>>> + */
>>> union {
>>> struct list_head lru; /* Pageout list, eg. active_list
>>> * protected by zone->lru_lock !
>>> @@ -143,6 +148,7 @@ struct page {
>>> */
>>> /* First tail page of compound page */
Note that compound_head is not just in the *first* tail page. Only the
rest is.
>>> struct {
>>> + unsigned long compound_head; /* If bit zero is set */
>>
>> I think the comments around here should have more details and should
>> be louder!
>
> I'm always bad when it comes to documentation. Is it enough?
>
> /*
> * Third double word block
> *
> * WARNING: bit 0 of the first word encode PageTail(). That means
> * the rest users of the storage space MUST NOT use the bit to
> * avoid collision and false-positive PageTail().
> */
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Kirill A. Shutemov" <kirill@shutemov.name> |
|---|---|
| Date | 2015-08-25 20:40 +0200 |
| Message-ID | <q1riz-6ju-51@gated-at.bofh.it> |
| In reply to | #1212985 |
On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote:
> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote:
> >On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote:
> >>On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
> >>
> >>>The patch introduces page->compound_head into third double word block in
> >>>front of compound_dtor and compound_order. That means it shares storage
> >>>space with:
> >>>
> >>> - page->lru.next;
> >>> - page->next;
> >>> - page->rcu_head.next;
> >>> - page->pmd_huge_pte;
> >>>
>
> We should probably ask Paul about the chances that rcu_head.next would like
> to use the bit too one day?
+Paul.
> For pgtable_t I can't think of anything better than a warning in the generic
> definition in include/asm-generic/page.h and hope that anyone reimplementing
> it for a new arch will look there first.
I will move it to other word, just in case.
> The lru part is probably the hardest to prevent danger. It can be used for
> any private purposes. Hopefully everyone currently uses only standard list
> operations here, and the list poison values don't set bit 0. But I see there
> can be some arbitrary CONFIG_ILLEGAL_POINTER_VALUE added to the poisons, so
> maybe that's worth some build error check? Anyway we would be imposing
> restrictions on types that are not ours, so there might be some
> resistance...
I will add BUILD_BUG_ON((unsigned long)LIST_POISON1 & 1);
> >>Anyway, this is quite subtle and there's a risk that people will
> >>accidentally break it later on. I don't think the patch puts
> >>sufficient documentation in place to prevent this.
> >
> >I would appreciate for suggestion on place and form of documentation.
> >
> >>And even documentation might not be enough to prevent accidents.
> >
> >The only think I can propose is VM_BUG_ON() in PageTail() and
> >compound_head() which would ensure that page->compound_page points to
> >place within MAX_ORDER_NR_PAGES before the current page if bit 0 is set.
>
> That should probably catch some bad stuff, but probably only moments before
> it would crash anyway if the pointer was bogus. But I also don't see better
> way, because we can't proactively put checks in those who would "misbehave",
> as we don't know who they are. Putting more debug checks in e.g. page
> freeing might help, but probably not much.
So, do you think it worth it or not after all?
>
> >Do you consider this helpful?
> >
> >>>
> >>>...
> >>>
> >>>--- a/include/linux/mm_types.h
> >>>+++ b/include/linux/mm_types.h
> >>>@@ -120,7 +120,12 @@ struct page {
> >>> };
> >>> };
> >>>
> >>>- /* Third double word block */
> >>>+ /*
> >>>+ * Third double word block
> >>>+ *
> >>>+ * WARNING: bit 0 of the first word encode PageTail and *must* be 0
> >>>+ * for non-tail pages.
> >>>+ */
> >>> union {
> >>> struct list_head lru; /* Pageout list, eg. active_list
> >>> * protected by zone->lru_lock !
> >>>@@ -143,6 +148,7 @@ struct page {
> >>> */
> >>> /* First tail page of compound page */
>
> Note that compound_head is not just in the *first* tail page. Only the rest
> is.
Right.
--
Kirill A. Shutemov
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
|---|---|
| Date | 2015-08-25 22:20 +0200 |
| Message-ID | <q1sRk-ky-23@gated-at.bofh.it> |
| In reply to | #1213238 |
On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote:
> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote:
> > On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote:
> > >On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote:
> > >>On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote:
> > >>
> > >>>The patch introduces page->compound_head into third double word block in
> > >>>front of compound_dtor and compound_order. That means it shares storage
> > >>>space with:
> > >>>
> > >>> - page->lru.next;
> > >>> - page->next;
> > >>> - page->rcu_head.next;
> > >>> - page->pmd_huge_pte;
> > >>>
> >
> > We should probably ask Paul about the chances that rcu_head.next would like
> > to use the bit too one day?
>
> +Paul.
The call_rcu() function does stomp that bit, but if you stop using that
bit before you invoke call_rcu(), no problem.
Thanx, Paul
> > For pgtable_t I can't think of anything better than a warning in the generic
> > definition in include/asm-generic/page.h and hope that anyone reimplementing
> > it for a new arch will look there first.
>
> I will move it to other word, just in case.
>
> > The lru part is probably the hardest to prevent danger. It can be used for
> > any private purposes. Hopefully everyone currently uses only standard list
> > operations here, and the list poison values don't set bit 0. But I see there
> > can be some arbitrary CONFIG_ILLEGAL_POINTER_VALUE added to the poisons, so
> > maybe that's worth some build error check? Anyway we would be imposing
> > restrictions on types that are not ours, so there might be some
> > resistance...
>
> I will add BUILD_BUG_ON((unsigned long)LIST_POISON1 & 1);
>
> > >>Anyway, this is quite subtle and there's a risk that people will
> > >>accidentally break it later on. I don't think the patch puts
> > >>sufficient documentation in place to prevent this.
> > >
> > >I would appreciate for suggestion on place and form of documentation.
> > >
> > >>And even documentation might not be enough to prevent accidents.
> > >
> > >The only think I can propose is VM_BUG_ON() in PageTail() and
> > >compound_head() which would ensure that page->compound_page points to
> > >place within MAX_ORDER_NR_PAGES before the current page if bit 0 is set.
> >
> > That should probably catch some bad stuff, but probably only moments before
> > it would crash anyway if the pointer was bogus. But I also don't see better
> > way, because we can't proactively put checks in those who would "misbehave",
> > as we don't know who they are. Putting more debug checks in e.g. page
> > freeing might help, but probably not much.
>
> So, do you think it worth it or not after all?
> >
> > >Do you consider this helpful?
> > >
> > >>>
> > >>>...
> > >>>
> > >>>--- a/include/linux/mm_types.h
> > >>>+++ b/include/linux/mm_types.h
> > >>>@@ -120,7 +120,12 @@ struct page {
> > >>> };
> > >>> };
> > >>>
> > >>>- /* Third double word block */
> > >>>+ /*
> > >>>+ * Third double word block
> > >>>+ *
> > >>>+ * WARNING: bit 0 of the first word encode PageTail and *must* be 0
> > >>>+ * for non-tail pages.
> > >>>+ */
> > >>> union {
> > >>> struct list_head lru; /* Pageout list, eg. active_list
> > >>> * protected by zone->lru_lock !
> > >>>@@ -143,6 +148,7 @@ struct page {
> > >>> */
> > >>> /* First tail page of compound page */
> >
> > Note that compound_head is not just in the *first* tail page. Only the rest
> > is.
>
> Right.
>
> --
> Kirill A. Shutemov
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-08-25 22:50 +0200 |
| Message-ID | <q1tkm-SD-15@gated-at.bofh.it> |
| In reply to | #1213303 |
On 25.8.2015 22:11, Paul E. McKenney wrote: > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: >>>>> >>>>>> The patch introduces page->compound_head into third double word block in >>>>>> front of compound_dtor and compound_order. That means it shares storage >>>>>> space with: >>>>>> >>>>>> - page->lru.next; >>>>>> - page->next; >>>>>> - page->rcu_head.next; >>>>>> - page->pmd_huge_pte; >>>>>> >>> >>> We should probably ask Paul about the chances that rcu_head.next would like >>> to use the bit too one day? >> >> +Paul. > > The call_rcu() function does stomp that bit, but if you stop using that > bit before you invoke call_rcu(), no problem. You mean that it sets the bit 0 of rcu_head.next during its processing? That's bad news then. It's not that we would trigger that bit when the rcu_head part of the union is "active". It's that pfn scanners could inspect such page at arbitrary time, see the bit 0 set (due to RCU processing) and think that it's a tail page of a compound page, and interpret the rest of the pointer as a pointer to the head page (to test it for flags etc). -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
|---|---|
| Date | 2015-08-25 23:30 +0200 |
| Message-ID | <q1tX4-1RJ-27@gated-at.bofh.it> |
| In reply to | #1213333 |
On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > On 25.8.2015 22:11, Paul E. McKenney wrote: > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > >>>>> > >>>>>> The patch introduces page->compound_head into third double word block in > >>>>>> front of compound_dtor and compound_order. That means it shares storage > >>>>>> space with: > >>>>>> > >>>>>> - page->lru.next; > >>>>>> - page->next; > >>>>>> - page->rcu_head.next; > >>>>>> - page->pmd_huge_pte; > >>>>>> > >>> > >>> We should probably ask Paul about the chances that rcu_head.next would like > >>> to use the bit too one day? > >> > >> +Paul. > > > > The call_rcu() function does stomp that bit, but if you stop using that > > bit before you invoke call_rcu(), no problem. > > You mean that it sets the bit 0 of rcu_head.next during its processing? Not at the moment, though RCU will splat if given a misaligned rcu_head structure because of the possibility to use that bit to flag callbacks that do nothing but free memory. If RCU needs to do that (e.g., to promote energy efficiency), then that bit might well be set during RCU grace-period processing. > That's > bad news then. It's not that we would trigger that bit when the rcu_head part of > the union is "active". It's that pfn scanners could inspect such page at > arbitrary time, see the bit 0 set (due to RCU processing) and think that it's a > tail page of a compound page, and interpret the rest of the pointer as a pointer > to the head page (to test it for flags etc). On the other hand, if you avoid scanning rcu_head structures for pages that are currently waiting for a grace period, no problem. RCU does not use the rcu_head structure at all except for during the time between when call_rcu() is invoked on that rcu_head structure and the time that the callback is invoked. Is there some other page state that indicates that the page is waiting for a grace period? If so, you could simply avoid testing that bit in that case. Thanx, Paul -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Kirill A. Shutemov" <kirill@shutemov.name> |
|---|---|
| Date | 2015-08-26 17:10 +0200 |
| Message-ID | <q1KuR-Rx-5@gated-at.bofh.it> |
| In reply to | #1213370 |
On Tue, Aug 25, 2015 at 02:19:54PM -0700, Paul E. McKenney wrote: > On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > > On 25.8.2015 22:11, Paul E. McKenney wrote: > > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > > >>>>> > > >>>>>> The patch introduces page->compound_head into third double word block in > > >>>>>> front of compound_dtor and compound_order. That means it shares storage > > >>>>>> space with: > > >>>>>> > > >>>>>> - page->lru.next; > > >>>>>> - page->next; > > >>>>>> - page->rcu_head.next; > > >>>>>> - page->pmd_huge_pte; > > >>>>>> > > >>> > > >>> We should probably ask Paul about the chances that rcu_head.next would like > > >>> to use the bit too one day? > > >> > > >> +Paul. > > > > > > The call_rcu() function does stomp that bit, but if you stop using that > > > bit before you invoke call_rcu(), no problem. > > > > You mean that it sets the bit 0 of rcu_head.next during its processing? > > Not at the moment, though RCU will splat if given a misaligned rcu_head > structure because of the possibility to use that bit to flag callbacks > that do nothing but free memory. If RCU needs to do that (e.g., to > promote energy efficiency), then that bit might well be set during > RCU grace-period processing. Ugh.. :-/ > > That's > > bad news then. It's not that we would trigger that bit when the rcu_head part of > > the union is "active". It's that pfn scanners could inspect such page at > > arbitrary time, see the bit 0 set (due to RCU processing) and think that it's a > > tail page of a compound page, and interpret the rest of the pointer as a pointer > > to the head page (to test it for flags etc). > > On the other hand, if you avoid scanning rcu_head structures for pages > that are currently waiting for a grace period, no problem. RCU does > not use the rcu_head structure at all except for during the time between > when call_rcu() is invoked on that rcu_head structure and the time that > the callback is invoked. > > Is there some other page state that indicates that the page is waiting > for a grace period? If so, you could simply avoid testing that bit in > that case. No, I don't think so. For compound pages most of info of its state is stored in head page (e.g. page_count(), flags, etc). So if we examine random page (pfn scanner case) the very first thing we want to know if we stepped on tail page. PageTail() is what I wanted to encode in the bit... What if we change order of fields within rcu_head and put ->func first? Can we expect this pointer to have bit 0 always clear? -- Kirill A. Shutemov -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Vlastimil Babka <vbabka@suse.cz> |
|---|---|
| Date | 2015-08-26 17:40 +0200 |
| Message-ID | <q1KXT-1pg-19@gated-at.bofh.it> |
| In reply to | #1213949 |
On 08/26/2015 05:04 PM, Kirill A. Shutemov wrote: >>> That's >>> bad news then. It's not that we would trigger that bit when the rcu_head part of >>> the union is "active". It's that pfn scanners could inspect such page at >>> arbitrary time, see the bit 0 set (due to RCU processing) and think that it's a >>> tail page of a compound page, and interpret the rest of the pointer as a pointer >>> to the head page (to test it for flags etc). >> >> On the other hand, if you avoid scanning rcu_head structures for pages >> that are currently waiting for a grace period, no problem. RCU does >> not use the rcu_head structure at all except for during the time between >> when call_rcu() is invoked on that rcu_head structure and the time that >> the callback is invoked. >> >> Is there some other page state that indicates that the page is waiting >> for a grace period? If so, you could simply avoid testing that bit in >> that case. > > No, I don't think so. > > For compound pages most of info of its state is stored in head page (e.g. > page_count(), flags, etc). So if we examine random page (pfn scanner case) > the very first thing we want to know if we stepped on tail page. > PageTail() is what I wanted to encode in the bit... > > What if we change order of fields within rcu_head and put ->func first? Or change the order of compound_head wrt the rest? > Can we expect this pointer to have bit 0 always clear? That's probably a question whether $compiler is guaranteed to align functions on all architectures... -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
|---|---|
| Date | 2015-08-26 18:40 +0200 |
| Message-ID | <q1LTY-2LN-23@gated-at.bofh.it> |
| In reply to | #1213949 |
On Wed, Aug 26, 2015 at 06:04:12PM +0300, Kirill A. Shutemov wrote: > On Tue, Aug 25, 2015 at 02:19:54PM -0700, Paul E. McKenney wrote: > > On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > > > On 25.8.2015 22:11, Paul E. McKenney wrote: > > > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > > > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > > > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > > > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > > > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > > > >>>>> > > > >>>>>> The patch introduces page->compound_head into third double word block in > > > >>>>>> front of compound_dtor and compound_order. That means it shares storage > > > >>>>>> space with: > > > >>>>>> > > > >>>>>> - page->lru.next; > > > >>>>>> - page->next; > > > >>>>>> - page->rcu_head.next; > > > >>>>>> - page->pmd_huge_pte; > > > >>>>>> > > > >>> > > > >>> We should probably ask Paul about the chances that rcu_head.next would like > > > >>> to use the bit too one day? > > > >> > > > >> +Paul. > > > > > > > > The call_rcu() function does stomp that bit, but if you stop using that > > > > bit before you invoke call_rcu(), no problem. > > > > > > You mean that it sets the bit 0 of rcu_head.next during its processing? > > > > Not at the moment, though RCU will splat if given a misaligned rcu_head > > structure because of the possibility to use that bit to flag callbacks > > that do nothing but free memory. If RCU needs to do that (e.g., to > > promote energy efficiency), then that bit might well be set during > > RCU grace-period processing. > > Ugh.. :-/ > > > > bad news then. It's not that we would trigger that bit when the rcu_head part of > > > the union is "active". It's that pfn scanners could inspect such page at > > > arbitrary time, see the bit 0 set (due to RCU processing) and think that it's a > > > tail page of a compound page, and interpret the rest of the pointer as a pointer > > > to the head page (to test it for flags etc). > > > > On the other hand, if you avoid scanning rcu_head structures for pages > > that are currently waiting for a grace period, no problem. RCU does > > not use the rcu_head structure at all except for during the time between > > when call_rcu() is invoked on that rcu_head structure and the time that > > the callback is invoked. > > > > Is there some other page state that indicates that the page is waiting > > for a grace period? If so, you could simply avoid testing that bit in > > that case. > > No, I don't think so. OK, I'll bite... How do you know that it is safe to invoke call_rcu(), given that you are not allowed to invoke call_rcu() until the previous callback has been invoked? > For compound pages most of info of its state is stored in head page (e.g. > page_count(), flags, etc). So if we examine random page (pfn scanner case) > the very first thing we want to know if we stepped on tail page. > PageTail() is what I wanted to encode in the bit... Ah, so that would require the page scanner to do reverse mapping or some such, then. Which is perhaps what you are trying to avoid. > What if we change order of fields within rcu_head and put ->func first? > Can we expect this pointer to have bit 0 always clear? I asked that question some time back, and the answer was "no". You can apparently have functions that start at odd addresses on some architectures. That said, there are likely to be reserved bits somewhere in the function address, perhaps varying depending on architecture and/or boot, in the case of address-space randomization. Perhaps some way of identifying those bits with architecture-independent ways of querying and setting them? Thanx, Paul -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Hugh Dickins <hughd@google.com> |
|---|---|
| Date | 2015-08-26 20:20 +0200 |
| Message-ID | <q1NsK-55Y-29@gated-at.bofh.it> |
| In reply to | #1213370 |
On Tue, 25 Aug 2015, Paul E. McKenney wrote: > On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > > On 25.8.2015 22:11, Paul E. McKenney wrote: > > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > > >>>>> > > >>>>>> The patch introduces page->compound_head into third double word block in > > >>>>>> front of compound_dtor and compound_order. That means it shares storage > > >>>>>> space with: > > >>>>>> > > >>>>>> - page->lru.next; > > >>>>>> - page->next; > > >>>>>> - page->rcu_head.next; > > >>>>>> - page->pmd_huge_pte; > > >>>>>> > > >>> > > >>> We should probably ask Paul about the chances that rcu_head.next would like > > >>> to use the bit too one day? > > >> > > >> +Paul. > > > > > > The call_rcu() function does stomp that bit, but if you stop using that > > > bit before you invoke call_rcu(), no problem. > > > > You mean that it sets the bit 0 of rcu_head.next during its processing? > > Not at the moment, though RCU will splat if given a misaligned rcu_head > structure because of the possibility to use that bit to flag callbacks > that do nothing but free memory. If RCU needs to do that (e.g., to > promote energy efficiency), then that bit might well be set during > RCU grace-period processing. But if you do one day implement that, wouldn't sl?b.c have to use call_rcu_with_added_meaning() instead of call_rcu(), to be in danger of getting that bit set? (No rcu_head is placed in a PageTail page.) So although it might be a little strange not to use a variant intended for freeing memory when indeed that's what it's doing, it would not be the end of the world for SLAB_DESTROY_BY_RCU to carry on using straight call_rcu(), in defence of the struct page safety Kirill is proposing. hUgh -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
|---|---|
| Date | 2015-08-26 23:30 +0200 |
| Message-ID | <q1QqB-RP-7@gated-at.bofh.it> |
| In reply to | #1214096 |
On Wed, Aug 26, 2015 at 11:18:45AM -0700, Hugh Dickins wrote: > On Tue, 25 Aug 2015, Paul E. McKenney wrote: > > On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > > > On 25.8.2015 22:11, Paul E. McKenney wrote: > > > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > > > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > > > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > > > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > > > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > > > >>>>> > > > >>>>>> The patch introduces page->compound_head into third double word block in > > > >>>>>> front of compound_dtor and compound_order. That means it shares storage > > > >>>>>> space with: > > > >>>>>> > > > >>>>>> - page->lru.next; > > > >>>>>> - page->next; > > > >>>>>> - page->rcu_head.next; > > > >>>>>> - page->pmd_huge_pte; > > > >>>>>> > > > >>> > > > >>> We should probably ask Paul about the chances that rcu_head.next would like > > > >>> to use the bit too one day? > > > >> > > > >> +Paul. > > > > > > > > The call_rcu() function does stomp that bit, but if you stop using that > > > > bit before you invoke call_rcu(), no problem. > > > > > > You mean that it sets the bit 0 of rcu_head.next during its processing? > > > > Not at the moment, though RCU will splat if given a misaligned rcu_head > > structure because of the possibility to use that bit to flag callbacks > > that do nothing but free memory. If RCU needs to do that (e.g., to > > promote energy efficiency), then that bit might well be set during > > RCU grace-period processing. > > But if you do one day implement that, wouldn't sl?b.c have to use > call_rcu_with_added_meaning() instead of call_rcu(), to be in danger > of getting that bit set? (No rcu_head is placed in a PageTail page.) Good point, call_rcu_lazy(), but yes. > So although it might be a little strange not to use a variant intended > for freeing memory when indeed that's what it's doing, it would not be > the end of the world for SLAB_DESTROY_BY_RCU to carry on using straight > call_rcu(), in defence of the struct page safety Kirill is proposing. As long as you are OK with the bottom bit being zero throughout the RCU processing, yes. Thanx, Paul -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Hugh Dickins <hughd@google.com> |
|---|---|
| Date | 2015-08-27 00:30 +0200 |
| Message-ID | <q1RmG-2ei-7@gated-at.bofh.it> |
| In reply to | #1214202 |
On Wed, 26 Aug 2015, Paul E. McKenney wrote: > On Wed, Aug 26, 2015 at 11:18:45AM -0700, Hugh Dickins wrote: > > On Tue, 25 Aug 2015, Paul E. McKenney wrote: > > > On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > > > > On 25.8.2015 22:11, Paul E. McKenney wrote: > > > > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > > > > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > > > > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > > > > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > > > > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > > > > >>>>> > > > > >>>>>> The patch introduces page->compound_head into third double word block in > > > > >>>>>> front of compound_dtor and compound_order. That means it shares storage > > > > >>>>>> space with: > > > > >>>>>> > > > > >>>>>> - page->lru.next; > > > > >>>>>> - page->next; > > > > >>>>>> - page->rcu_head.next; > > > > >>>>>> - page->pmd_huge_pte; > > > > >>>>>> > > > > >>> > > > > >>> We should probably ask Paul about the chances that rcu_head.next would like > > > > >>> to use the bit too one day? > > > > >> > > > > >> +Paul. > > > > > > > > > > The call_rcu() function does stomp that bit, but if you stop using that > > > > > bit before you invoke call_rcu(), no problem. > > > > > > > > You mean that it sets the bit 0 of rcu_head.next during its processing? > > > > > > Not at the moment, though RCU will splat if given a misaligned rcu_head > > > structure because of the possibility to use that bit to flag callbacks > > > that do nothing but free memory. If RCU needs to do that (e.g., to > > > promote energy efficiency), then that bit might well be set during > > > RCU grace-period processing. > > > > But if you do one day implement that, wouldn't sl?b.c have to use > > call_rcu_with_added_meaning() instead of call_rcu(), to be in danger > > of getting that bit set? (No rcu_head is placed in a PageTail page.) > > Good point, call_rcu_lazy(), but yes. > > > So although it might be a little strange not to use a variant intended > > for freeing memory when indeed that's what it's doing, it would not be > > the end of the world for SLAB_DESTROY_BY_RCU to carry on using straight > > call_rcu(), in defence of the struct page safety Kirill is proposing. > > As long as you are OK with the bottom bit being zero throughout the RCU > processing, yes. That's exactly what we want: sounds like we have no problem, thanks Paul. Hugh -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | "Paul E. McKenney" <paulmck@linux.vnet.ibm.com> |
|---|---|
| Date | 2015-08-27 01:40 +0200 |
| Message-ID | <q1Ssr-3Ko-27@gated-at.bofh.it> |
| In reply to | #1214223 |
On Wed, Aug 26, 2015 at 03:28:39PM -0700, Hugh Dickins wrote: > On Wed, 26 Aug 2015, Paul E. McKenney wrote: > > On Wed, Aug 26, 2015 at 11:18:45AM -0700, Hugh Dickins wrote: > > > On Tue, 25 Aug 2015, Paul E. McKenney wrote: > > > > On Tue, Aug 25, 2015 at 10:46:44PM +0200, Vlastimil Babka wrote: > > > > > On 25.8.2015 22:11, Paul E. McKenney wrote: > > > > > > On Tue, Aug 25, 2015 at 09:33:54PM +0300, Kirill A. Shutemov wrote: > > > > > >> On Tue, Aug 25, 2015 at 01:44:13PM +0200, Vlastimil Babka wrote: > > > > > >>> On 08/21/2015 02:10 PM, Kirill A. Shutemov wrote: > > > > > >>>> On Thu, Aug 20, 2015 at 04:36:43PM -0700, Andrew Morton wrote: > > > > > >>>>> On Wed, 19 Aug 2015 12:21:45 +0300 "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com> wrote: > > > > > >>>>> > > > > > >>>>>> The patch introduces page->compound_head into third double word block in > > > > > >>>>>> front of compound_dtor and compound_order. That means it shares storage > > > > > >>>>>> space with: > > > > > >>>>>> > > > > > >>>>>> - page->lru.next; > > > > > >>>>>> - page->next; > > > > > >>>>>> - page->rcu_head.next; > > > > > >>>>>> - page->pmd_huge_pte; > > > > > >>>>>> > > > > > >>> > > > > > >>> We should probably ask Paul about the chances that rcu_head.next would like > > > > > >>> to use the bit too one day? > > > > > >> > > > > > >> +Paul. > > > > > > > > > > > > The call_rcu() function does stomp that bit, but if you stop using that > > > > > > bit before you invoke call_rcu(), no problem. > > > > > > > > > > You mean that it sets the bit 0 of rcu_head.next during its processing? > > > > > > > > Not at the moment, though RCU will splat if given a misaligned rcu_head > > > > structure because of the possibility to use that bit to flag callbacks > > > > that do nothing but free memory. If RCU needs to do that (e.g., to > > > > promote energy efficiency), then that bit might well be set during > > > > RCU grace-period processing. > > > > > > But if you do one day implement that, wouldn't sl?b.c have to use > > > call_rcu_with_added_meaning() instead of call_rcu(), to be in danger > > > of getting that bit set? (No rcu_head is placed in a PageTail page.) > > > > Good point, call_rcu_lazy(), but yes. > > > > > So although it might be a little strange not to use a variant intended > > > for freeing memory when indeed that's what it's doing, it would not be > > > the end of the world for SLAB_DESTROY_BY_RCU to carry on using straight > > > call_rcu(), in defence of the struct page safety Kirill is proposing. > > > > As long as you are OK with the bottom bit being zero throughout the RCU > > processing, yes. > > That's exactly what we want: sounds like we have no problem, thanks Paul. Whew! ;-) Thanx, Paul -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
| From | Michal Hocko <mhocko@kernel.org> |
|---|---|
| Date | 2015-08-27 17:10 +0200 |
| Message-ID | <q26Yq-828-3@gated-at.bofh.it> |
| In reply to | #1214202 |
On Wed 26-08-15 14:29:16, Paul E. McKenney wrote:
> On Wed, Aug 26, 2015 at 11:18:45AM -0700, Hugh Dickins wrote:
[...]
> > But if you do one day implement that, wouldn't sl?b.c have to use
> > call_rcu_with_added_meaning() instead of call_rcu(), to be in danger
> > of getting that bit set? (No rcu_head is placed in a PageTail page.)
>
> Good point, call_rcu_lazy(), but yes.
>
> > So although it might be a little strange not to use a variant intended
> > for freeing memory when indeed that's what it's doing, it would not be
> > the end of the world for SLAB_DESTROY_BY_RCU to carry on using straight
> > call_rcu(), in defence of the struct page safety Kirill is proposing.
>
> As long as you are OK with the bottom bit being zero throughout the RCU
> processing, yes.
I am really not sure I udnerstand. What will prevent
call_rcu(&page->rcu_head, free_page_rcu) done in a random driver?
Cannot the RCU simply claim bit1? I can see 1146edcbef37 ("rcu: Loosen
__call_rcu()'s rcu_head alignment constraint") but AFAIU all it would
take to fix this would be to require struct rcu_head to be aligned to
32b no?
Btw. Do we need the same think for page::mapping and KSM?
--
Michal Hocko
SUSE Labs
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[toc] | [prev] | [next] | [standalone]
Page 1 of 2 [1] 2 Next page →
Back to top | Article view | linux.kernel
csiph-web