Skip to contentSkip to conversation

shm_nattch in sys_shmat?

question Matthew Dobson 2 participants 3 messages Jan 31, 2003 – Feb 3, 2003 Memory management

lore
Share & tools
lore
#0 lore raw

Hello all!
In case it wasn't obvious from the subject, I've got a question about a
piece of code in ipc/shm.c:sys_shmat(), more specifically about the use of the shm_nattch counter. This is supposed to be used to count the number of times the shared memory segment has been attatched to a processes adress space. For example, shm_open & shm_mmap both increment shm_nattch, and shm_close decrements shm_nattch. I would be inclined to think that sys_shmat should increment this counter, to keep track of a new attatchment of the shared segment to a processes adress space. sys_shmat, does in fact increment shm_nattch, but only to decrement it again a few lines later, as seen in this code snippet. Can anyone please explain why this is?

Quoted 27 lines
	file = shp->shm_file;
	size = file->f_dentry->d_inode->i_size;
Quoted 1 line
Quoted 1 line
	shp->shm_nattch++;
	shm_unlock(shp);

	down_write(&current->mm->mmap_sem);
	if (addr && !(shmflg & SHM_REMAP)) {
		user_addr = ERR_PTR(-EINVAL);
		if (find_vma_intersection(current->mm, addr, addr + size))
			goto invalid;
		/*
		 * If shm segment goes below stack, make sure there is some
		 * space left for the stack to grow (at least 4 pages).
		 */
		if (addr < current->mm->start_stack &&
		    addr > current->mm->start_stack - size - PAGE_SIZE * 5)
			goto invalid;
	}

	user_addr = (void*) do_mmap (file, addr, size, prot, flags, 0);

invalid:

	up_write(&current->mm->mmap_sem);

	down (&shm_ids.sem);
	if(!(shp = shm_lock(shmid)))
		BUG();
Quoted 7 lines
Quoted 1 line
Quoted 1 line
	shp->shm_nattch--;
	if(shp->shm_nattch == 0 &&
	   shp->shm_flags & SHM_DEST)
		shm_destroy (shp);
	else
		shm_unlock(shp);
	up (&shm_ids.sem);

Thanks!

-Matt

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/

#1 lore raw

Hi Matthew,

Quoted 3 lines · Matthew Dobson

sys_shmat, does in fact increment shm_nattch, but only to decrement it again a few lines later, as seen in this code snippet. Can anyone please explain why this is?

sys_shmat temporarily increases shm_nattch to make sure it's never zero:

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
	shp->shm_nattch++;

Make sure shm_nattch is greater than zero.

Quoted 1 line
Quoted 1 line

user_addr = (void*) do_mmap (file, addr, size, prot,

map the segment which increments shm_nattch in shm_mmap accounting for the actual mapping

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
	shp->shm_nattch--;

Correct it again.

Greetings
Christoph

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/

#2 lore raw
Quoted 25 lines · Christoph Rohland

Hi Matthew,

Quoted 3 lines · Matthew Dobson

sys_shmat, does in fact increment shm_nattch, but only to decrement it again a few lines later, as seen in this code snippet. Can anyone please explain why this is?

sys_shmat temporarily increases shm_nattch to make sure it's never zero:

Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
	shp->shm_nattch++;

Make sure shm_nattch is greater than zero.

Quoted 1 line
Quoted 1 line

user_addr = (void*) do_mmap (file, addr, size, prot,

map the segment which increments shm_nattch in shm_mmap accounting for the actual mapping

Quoted 7 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
	shp->shm_nattch--;

Correct it again.

Greetings
Christoph

Ah ha... I hadn't followed the do_mmap call chain deep enough to notice that it would call the shm_mmap call through the f_op function pointer. Thanks for pointing that out. It makes much more sense now. A small comment in there would make it *much* more obvious what is going on.

Cheers!

-Matt

--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux-mm.org/