View | Details | Raw Unified | Return to bug 29698
Collapse All | Expand All

(-)./i386/linux/linux.h (+2 lines)
Lines 457-460 Link Here
457
#define	LINUX_SETVAL		16
457
#define	LINUX_SETVAL		16
458
#define	LINUX_SETALL		17
458
#define	LINUX_SETALL		17
459
#define	LINUX_SEM_STAT		18
460
#define	LINUX_SEM_INFO		19
459
461
460
/*
462
/*
(-)./kern/sysv_sem.c (+29 lines)
Lines 171-174 Link Here
171
	register int i;
171
	register int i;
172
172
173
	TUNABLE_INT_FETCH("kern.ipc.semmap", &seminfo.semmap);
174
	TUNABLE_INT_FETCH("kern.ipc.semmni", &seminfo.semmni);
175
	TUNABLE_INT_FETCH("kern.ipc.semmns", &seminfo.semmns);
176
	TUNABLE_INT_FETCH("kern.ipc.semmnu", &seminfo.semmnu);
177
	TUNABLE_INT_FETCH("kern.ipc.semmsl", &seminfo.semmsl);
178
	TUNABLE_INT_FETCH("kern.ipc.semopm", &seminfo.semopm);
179
	TUNABLE_INT_FETCH("kern.ipc.semume", &seminfo.semume);
180
	TUNABLE_INT_FETCH("kern.ipc.semusz", &seminfo.semusz);
181
	TUNABLE_INT_FETCH("kern.ipc.semvmx", &seminfo.semvmx);
182
	TUNABLE_INT_FETCH("kern.ipc.semaem", &seminfo.semaem);
173
	sem = malloc(sizeof(struct sem) * seminfo.semmns, M_SEM, M_WAITOK);
183
	sem = malloc(sizeof(struct sem) * seminfo.semmns, M_SEM, M_WAITOK);
174
	if (sem == NULL)
184
	if (sem == NULL)
Lines 471-474 Link Here
471
		return (ENOSYS);
481
		return (ENOSYS);
472
482
483
	switch(cmd) {
484
	case SEM_STAT:
485
		if (semid < 0 || semid >= seminfo.semmsl)
486
	 		return(EINVAL);
487
		semaptr = &sema[semid];
488
		if ((semaptr->sem_perm.mode & SEM_ALLOC) == 0 )
489
			return(EINVAL);
490
		if ((eval = ipcperm(p, &semaptr->sem_perm, IPC_R)))
491
			return(eval);
492
		if ((eval = copyin(arg, &real_arg, sizeof(real_arg))) != 0)
493
			return(eval);
494
		eval = copyout((caddr_t)semaptr, real_arg.buf,
495
		    sizeof(struct semid_ds));
496
		rval = IXSEQ_TO_IPCID(semid,semaptr->sem_perm);
497
		goto out;
498
	}
499
473
	semid = IPCID_TO_IX(semid);
500
	semid = IPCID_TO_IX(semid);
474
	if (semid < 0 || semid >= seminfo.semmsl)
501
	if (semid < 0 || semid >= seminfo.semmsl)
Lines 602-605 Link Here
602
		return(EINVAL);
629
		return(EINVAL);
603
	}
630
	}
631
	
632
out:
604
633
605
	if (eval == 0)
634
	if (eval == 0)
(-)./kern/sysv_shm.c (+6 lines)
Lines 716-719 Link Here
716
	int i;
716
	int i;
717
717
718
TUNABLE_INT_FETCH("kern.ipc.shmmaxpgs", &shminfo.shmall);
719
shminfo.shmmax = shminfo.shmall * PAGE_SIZE;
720
TUNABLE_INT_FETCH("kern.ipc.shmmin", &shminfo.shmmin);
721
TUNABLE_INT_FETCH("kern.ipc.shmmni", &shminfo.shmmni);
722
TUNABLE_INT_FETCH("kern.ipc.shmseg", &shminfo.shmseg);
723
TUNABLE_INT_FETCH("kern.ipc.shm_use_phys", &shm_use_phys);
718
	shmalloced = shminfo.shmmni;
724
	shmalloced = shminfo.shmmni;
719
	shmsegs = malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, M_WAITOK);
725
	shmsegs = malloc(shmalloced * sizeof(shmsegs[0]), M_SHM, M_WAITOK);
(-)./sys/sem.h (+2 lines)
Lines 59-62 Link Here
59
#define SETVAL	8	/* Set the value of semval to arg.val {ALTER} */
59
#define SETVAL	8	/* Set the value of semval to arg.val {ALTER} */
60
#define SETALL	9	/* Set semvals from arg.array {ALTER} */
60
#define SETALL	9	/* Set semvals from arg.array {ALTER} */
61
#define SEM_STAT 10 /* Like IPC_STAT but treats semid as sema-index*/
62
#define SEM_INFO 11 /* for future use */
61
63
62
/*
64
/*
(-)./compat/linux/linux_ipc.c (-1 / +55 lines)
Lines 41-44 Link Here
41
#include <compat/linux/linux_util.h>
41
#include <compat/linux/linux_util.h>
42
42
43
struct linux_seminfo {
44
        int semmap;
45
        int semmni;
46
        int semmns;
47
        int semmnu;
48
        int semmsl;
49
        int semopm;
50
        int semume;
51
        int semusz;
52
        int semvmx;
53
        int semaem;
54
};
55
56
struct linux_shminfo {
57
        int shmmax;
58
        int shmmin;
59
        int shmmni;
60
        int shmseg;
61
        int shmall;
62
};
63
64
struct linux_shm_info {
65
        int used_ids;
66
        unsigned long shm_tot;  /* total allocated shm */
67
        unsigned long shm_rss;  /* total resident shm */
68
        unsigned long shm_swp;  /* total swapped shm */
69
        unsigned long swap_attempts;
70
        unsigned long swap_successes;
71
};
72
43
struct linux_ipc_perm {
73
struct linux_ipc_perm {
44
    linux_key_t key;
74
    linux_key_t key;
Lines 183-186 Link Here
183
{
213
{
184
	struct linux_semid_ds	linux_semid;
214
	struct linux_semid_ds	linux_semid;
215
	struct linux_seminfo linux_seminfo;
185
	struct semid_ds	bsd_semid;
216
	struct semid_ds	bsd_semid;
186
	struct __semctl_args /* {
217
	struct __semctl_args /* {
Lines 238-242 Link Here
238
		return __semctl(p, &bsd_args);
269
		return __semctl(p, &bsd_args);
239
	case LINUX_IPC_STAT:
270
	case LINUX_IPC_STAT:
240
		bsd_args.cmd = IPC_STAT;
271
	case LINUX_SEM_STAT:
272
		if( args->arg3 == IPC_STAT )
273
			bsd_args.cmd = IPC_STAT;
274
		else
275
			bsd_args.cmd = SEM_STAT;
241
		unptr = stackgap_alloc(&sg, sizeof(union semun *));
276
		unptr = stackgap_alloc(&sg, sizeof(union semun *));
242
		dsp = stackgap_alloc(&sg, sizeof(struct semid_ds));
277
		dsp = stackgap_alloc(&sg, sizeof(struct semid_ds));
Lines 255-259 Link Here
255
		if (error)
290
		if (error)
256
			return error;
291
			return error;
292
		p->p_retval[0] = IXSEQ_TO_IPCID(bsd_args.semid, bsd_semid.sem_perm);
257
		return copyout((caddr_t)&linux_semid, ldsp, sizeof(linux_semid));
293
		return copyout((caddr_t)&linux_semid, ldsp, sizeof(linux_semid));
294
	case LINUX_IPC_INFO:
295
	case LINUX_SEM_INFO:
296
		error = copyin(args->ptr, &ldsp, sizeof(ldsp));
297
		if (error)
298
			return error;
299
		bcopy(&seminfo, &linux_seminfo, sizeof(linux_seminfo) );
300
/* XXX 
301
#define used_semids 10
302
#define used_sems 10
303
	        linux_seminfo.semusz = used_semids;
304
   		    linux_seminfo.semaem = used_sems;
305
		} */
306
		error = copyout((caddr_t)&linux_seminfo, ldsp, 
307
				sizeof(linux_seminfo) );
308
		if (error)
309
			return error;
310
		p->p_retval[0] = seminfo.semmni;
311
		return(0);
258
	case LINUX_GETALL:
312
	case LINUX_GETALL:
259
		/* FALLTHROUGH */
313
		/* FALLTHROUGH */

Return to bug 29698