* [PATCH] Sys V shared memory limited to 8TiB.
@ 2013-04-10 2:39 Robin Holt
2013-04-10 23:15 ` Andrew Morton
0 siblings, 1 reply; 5+ messages in thread
From: Robin Holt @ 2013-04-10 2:39 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-kernel, Alex Thorlton
Trying to run an application which was trying to put data into half
of memory using shmget(), we found that having a shmall value below
8EiB-8TiB would prevent us from using anything more than 8TiB. By setting
kernel.shmall greater that 8EiB-8TiB would make the job work.
In the newseg() function, ns->shm_tot which, at 8TiB is INT_MAX.
ipc/shm.c:
458 static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
459 {
...
465 int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT;
...
474 if (ns->shm_tot + numpages > ns->shm_ctlall)
475 return -ENOSPC;
Signed-off-by: Robin Holt <holt@sgi.com>
Reported-by: Alex Thorlton <athorlton@sgi.com>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: Stable Kernel Maintainers <stable@vger.kernel.org>
Cc: lkml <linux-kernel@vger.kernel.org>
---
include/linux/ipc_namespace.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
index ae221a7..ca62eca 100644
--- a/include/linux/ipc_namespace.h
+++ b/include/linux/ipc_namespace.h
@@ -43,8 +43,8 @@ struct ipc_namespace {
size_t shm_ctlmax;
size_t shm_ctlall;
+ unsigned long shm_tot;
int shm_ctlmni;
- int shm_tot;
/*
* Defines whether IPC_RMID is forced for _all_ shm segments regardless
* of shmctl()
--
1.8.1.2
^ permalink raw reply related [flat|nested] 5+ messages in thread* Re: [PATCH] Sys V shared memory limited to 8TiB. 2013-04-10 2:39 [PATCH] Sys V shared memory limited to 8TiB Robin Holt @ 2013-04-10 23:15 ` Andrew Morton 2013-04-11 2:42 ` Robin Holt 0 siblings, 1 reply; 5+ messages in thread From: Andrew Morton @ 2013-04-10 23:15 UTC (permalink / raw) To: Robin Holt; +Cc: linux-kernel, Alex Thorlton On Tue, 9 Apr 2013 21:39:24 -0500 Robin Holt <holt@sgi.com> wrote: > Trying to run an application which was trying to put data into half > of memory using shmget(), we found that having a shmall value below > 8EiB-8TiB would prevent us from using anything more than 8TiB. By setting > kernel.shmall greater that 8EiB-8TiB would make the job work. > > In the newseg() function, ns->shm_tot which, at 8TiB is INT_MAX. You have way too much memory. > ipc/shm.c: > 458 static int newseg(struct ipc_namespace *ns, struct ipc_params *params) > 459 { > ... > 465 int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > ... > 474 if (ns->shm_tot + numpages > ns->shm_ctlall) > 475 return -ENOSPC; > > ... > > --- a/include/linux/ipc_namespace.h > +++ b/include/linux/ipc_namespace.h > @@ -43,8 +43,8 @@ struct ipc_namespace { > > size_t shm_ctlmax; > size_t shm_ctlall; > + unsigned long shm_tot; > int shm_ctlmni; > - int shm_tot; > /* > * Defines whether IPC_RMID is forced for _all_ shm segments regardless > * of shmctl() I reviewed everything for fallout from this and don't see any obvious issues. I do wonder about the appropriateness of the unsigned long type. Most (but by no means all) code in this area uses size_t, and the above-quoted ns->shm_ctlall is size_t. And the above-quoted num_pages is `int'. Both the size and signedness of `int' make no sense - what happens if the incoming ipc_params.u.size is >2G? So I'll add this, and ask whether ipc_namespace.shm_tot should be size_t? --- a/ipc/shm.c~ipc-sysv-shared-memory-limited-to-8tib-fix +++ a/ipc/shm.c @@ -462,7 +462,7 @@ static int newseg(struct ipc_namespace * size_t size = params->u.size; int error; struct shmid_kernel *shp; - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; struct file * file; char name[13]; int id; _ ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Sys V shared memory limited to 8TiB. 2013-04-10 23:15 ` Andrew Morton @ 2013-04-11 2:42 ` Robin Holt 2013-04-11 21:07 ` Andrew Morton 0 siblings, 1 reply; 5+ messages in thread From: Robin Holt @ 2013-04-11 2:42 UTC (permalink / raw) To: Andrew Morton; +Cc: Robin Holt, linux-kernel, Alex Thorlton On Wed, Apr 10, 2013 at 04:15:07PM -0700, Andrew Morton wrote: > On Tue, 9 Apr 2013 21:39:24 -0500 Robin Holt <holt@sgi.com> wrote: > > > Trying to run an application which was trying to put data into half > > of memory using shmget(), we found that having a shmall value below > > 8EiB-8TiB would prevent us from using anything more than 8TiB. By setting > > kernel.shmall greater that 8EiB-8TiB would make the job work. > > > > In the newseg() function, ns->shm_tot which, at 8TiB is INT_MAX. > > You have way too much memory. > > > ipc/shm.c: > > 458 static int newseg(struct ipc_namespace *ns, struct ipc_params *params) > > 459 { > > ... > > 465 int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > > ... > > 474 if (ns->shm_tot + numpages > ns->shm_ctlall) > > 475 return -ENOSPC; > > > > ... > > > > --- a/include/linux/ipc_namespace.h > > +++ b/include/linux/ipc_namespace.h > > @@ -43,8 +43,8 @@ struct ipc_namespace { > > > > size_t shm_ctlmax; > > size_t shm_ctlall; > > + unsigned long shm_tot; > > int shm_ctlmni; > > - int shm_tot; > > /* > > * Defines whether IPC_RMID is forced for _all_ shm segments regardless > > * of shmctl() > > I reviewed everything for fallout from this and don't see any obvious > issues. > > I do wonder about the appropriateness of the unsigned long type. Most > (but by no means all) code in this area uses size_t, and the > above-quoted ns->shm_ctlall is size_t. The only reason I went with unsigned long instead of size_t was most places in the kernel track stuff I recalled that was tracking stuff in pages used unsigned longs. Also, I found shm_tot field in shm_info structure was an unsigned long so this felt like a natural fit. I would happily changed to size_t. Whatever you feel is right. > And the above-quoted num_pages is `int'. Both the size and signedness > of `int' make no sense - what happens if the incoming ipc_params.u.size > is >2G? > > So I'll add this, and ask whether ipc_namespace.shm_tot should be size_t? > > --- a/ipc/shm.c~ipc-sysv-shared-memory-limited-to-8tib-fix > +++ a/ipc/shm.c > @@ -462,7 +462,7 @@ static int newseg(struct ipc_namespace * > size_t size = params->u.size; > int error; > struct shmid_kernel *shp; > - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; I was holding off from that change only because I was asking for this to go to stable and this doubles the size of the patch. ;) > struct file * file; > char name[13]; > int id; > _ Thank you, Robin ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Sys V shared memory limited to 8TiB. 2013-04-11 2:42 ` Robin Holt @ 2013-04-11 21:07 ` Andrew Morton 2013-04-11 21:10 ` Robin Holt 0 siblings, 1 reply; 5+ messages in thread From: Andrew Morton @ 2013-04-11 21:07 UTC (permalink / raw) To: Robin Holt; +Cc: linux-kernel, Alex Thorlton On Wed, 10 Apr 2013 21:42:23 -0500 Robin Holt <holt@sgi.com> wrote: > On Wed, Apr 10, 2013 at 04:15:07PM -0700, Andrew Morton wrote: > > On Tue, 9 Apr 2013 21:39:24 -0500 Robin Holt <holt@sgi.com> wrote: > > > > > Trying to run an application which was trying to put data into half > > > of memory using shmget(), we found that having a shmall value below > > > 8EiB-8TiB would prevent us from using anything more than 8TiB. By setting > > > kernel.shmall greater that 8EiB-8TiB would make the job work. > > > > > > In the newseg() function, ns->shm_tot which, at 8TiB is INT_MAX. > > > > You have way too much memory. > > > > > ipc/shm.c: > > > 458 static int newseg(struct ipc_namespace *ns, struct ipc_params *params) > > > 459 { > > > ... > > > 465 int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > > > ... > > > 474 if (ns->shm_tot + numpages > ns->shm_ctlall) > > > 475 return -ENOSPC; > > > > > > ... > > > > > > --- a/include/linux/ipc_namespace.h > > > +++ b/include/linux/ipc_namespace.h > > > @@ -43,8 +43,8 @@ struct ipc_namespace { > > > > > > size_t shm_ctlmax; > > > size_t shm_ctlall; > > > + unsigned long shm_tot; > > > int shm_ctlmni; > > > - int shm_tot; > > > /* > > > * Defines whether IPC_RMID is forced for _all_ shm segments regardless > > > * of shmctl() > > > > I reviewed everything for fallout from this and don't see any obvious > > issues. > > > > I do wonder about the appropriateness of the unsigned long type. Most > > (but by no means all) code in this area uses size_t, and the > > above-quoted ns->shm_ctlall is size_t. > > The only reason I went with unsigned long instead of size_t was most > places in the kernel track stuff I recalled that was tracking stuff > in pages used unsigned longs. Also, I found shm_tot field in shm_info > structure was an unsigned long so this felt like a natural fit. I would > happily changed to size_t. Whatever you feel is right. I have no really strong feelings, but let's at least put some thought into it. I do prefer ulong and find size_t to be a PITA. I guess it doesn't matter much. > > --- a/ipc/shm.c~ipc-sysv-shared-memory-limited-to-8tib-fix > > +++ a/ipc/shm.c > > @@ -462,7 +462,7 @@ static int newseg(struct ipc_namespace * > > size_t size = params->u.size; > > int error; > > struct shmid_kernel *shp; > > - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > > + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; > > I was holding off from that change only because I was asking for this > to go to stable and this doubles the size of the patch. ;) It's a bug, isn't it? Is there anything else which prevents creation of segments which are >=8TB? ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] Sys V shared memory limited to 8TiB. 2013-04-11 21:07 ` Andrew Morton @ 2013-04-11 21:10 ` Robin Holt 0 siblings, 0 replies; 5+ messages in thread From: Robin Holt @ 2013-04-11 21:10 UTC (permalink / raw) To: Andrew Morton; +Cc: Robin Holt, linux-kernel, Alex Thorlton On Thu, Apr 11, 2013 at 02:07:08PM -0700, Andrew Morton wrote: > On Wed, 10 Apr 2013 21:42:23 -0500 Robin Holt <holt@sgi.com> wrote: > > > On Wed, Apr 10, 2013 at 04:15:07PM -0700, Andrew Morton wrote: > > > On Tue, 9 Apr 2013 21:39:24 -0500 Robin Holt <holt@sgi.com> wrote: > > > > > > > Trying to run an application which was trying to put data into half > > > > of memory using shmget(), we found that having a shmall value below > > > > 8EiB-8TiB would prevent us from using anything more than 8TiB. By setting > > > > kernel.shmall greater that 8EiB-8TiB would make the job work. > > > > > > > > In the newseg() function, ns->shm_tot which, at 8TiB is INT_MAX. > > > > > > You have way too much memory. > > > > > > > ipc/shm.c: > > > > 458 static int newseg(struct ipc_namespace *ns, struct ipc_params *params) > > > > 459 { > > > > ... > > > > 465 int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > > > > ... > > > > 474 if (ns->shm_tot + numpages > ns->shm_ctlall) > > > > 475 return -ENOSPC; > > > > > > > > ... > > > > > > > > --- a/include/linux/ipc_namespace.h > > > > +++ b/include/linux/ipc_namespace.h > > > > @@ -43,8 +43,8 @@ struct ipc_namespace { > > > > > > > > size_t shm_ctlmax; > > > > size_t shm_ctlall; > > > > + unsigned long shm_tot; > > > > int shm_ctlmni; > > > > - int shm_tot; > > > > /* > > > > * Defines whether IPC_RMID is forced for _all_ shm segments regardless > > > > * of shmctl() > > > > > > I reviewed everything for fallout from this and don't see any obvious > > > issues. > > > > > > I do wonder about the appropriateness of the unsigned long type. Most > > > (but by no means all) code in this area uses size_t, and the > > > above-quoted ns->shm_ctlall is size_t. > > > > The only reason I went with unsigned long instead of size_t was most > > places in the kernel track stuff I recalled that was tracking stuff > > in pages used unsigned longs. Also, I found shm_tot field in shm_info > > structure was an unsigned long so this felt like a natural fit. I would > > happily changed to size_t. Whatever you feel is right. > > I have no really strong feelings, but let's at least put some thought > into it. I do prefer ulong and find size_t to be a PITA. I guess it > doesn't matter much. > > > > --- a/ipc/shm.c~ipc-sysv-shared-memory-limited-to-8tib-fix > > > +++ a/ipc/shm.c > > > @@ -462,7 +462,7 @@ static int newseg(struct ipc_namespace * > > > size_t size = params->u.size; > > > int error; > > > struct shmid_kernel *shp; > > > - int numpages = (size + PAGE_SIZE -1) >> PAGE_SHIFT; > > > + size_t numpages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; > > > > I was holding off from that change only because I was asking for this > > to go to stable and this doubles the size of the patch. ;) > > It's a bug, isn't it? Is there anything else which prevents creation > of segments which are >=8TB? Definitely a bug. Have not tried to create a segment >= 8TiB. I can give that a try tomorrow morning when I have a machine again to test with. Thanks, Robin ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-04-11 21:11 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-04-10 2:39 [PATCH] Sys V shared memory limited to 8TiB Robin Holt 2013-04-10 23:15 ` Andrew Morton 2013-04-11 2:42 ` Robin Holt 2013-04-11 21:07 ` Andrew Morton 2013-04-11 21:10 ` Robin Holt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox