From owner-p4-projects@FreeBSD.ORG Wed Jun 28 20:22:33 2006 Return-Path: X-Original-To: p4-projects@freebsd.org Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 0152E16A40F; Wed, 28 Jun 2006 20:22:33 +0000 (UTC) X-Original-To: perforce@freebsd.org Delivered-To: perforce@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id B9BB916A407 for ; Wed, 28 Jun 2006 20:22:32 +0000 (UTC) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [216.136.204.115]) by mx1.FreeBSD.org (Postfix) with ESMTP id 80DE744906 for ; Wed, 28 Jun 2006 20:22:32 +0000 (GMT) (envelope-from jhb@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.13.6/8.13.6) with ESMTP id k5SKMW77049317 for ; Wed, 28 Jun 2006 20:22:32 GMT (envelope-from jhb@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.13.6/8.13.4/Submit) id k5SKMWND049314 for perforce@freebsd.org; Wed, 28 Jun 2006 20:22:32 GMT (envelope-from jhb@freebsd.org) Date: Wed, 28 Jun 2006 20:22:32 GMT Message-Id: <200606282022.k5SKMWND049314@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to jhb@freebsd.org using -f From: John Baldwin To: Perforce Change Reviews Cc: Subject: PERFORCE change 100229 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Jun 2006 20:22:33 -0000 http://perforce.freebsd.org/chv.cgi?CH=100229 Change 100229 by jhb@jhb_mutex on 2006/06/28 20:22:10 Similar treatment to ibcs2_semsys() including using kern_semctl() to axe more stackgap usage. Affected files ... .. //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#10 edit Differences ... ==== //depot/projects/smpng/sys/i386/ibcs2/ibcs2_ipc.c#10 (text+ko) ==== @@ -301,77 +301,100 @@ return; } -int -ibcs2_semsys(td, uap) - struct thread *td; - struct ibcs2_semsys_args *uap; +struct ibcs2_semctl_args { + int what; + int semid; + int semnum; + int cmd; + union semun arg; +}; + +static int +ibcs2_semctl(struct thread *td, void *v) { + struct ibcs2_semctl_args *uap = v; + struct ibcs2_semid_ds is; + struct semid_ds bs; + union semun semun; int error; - switch (uap->which) { - case 0: /* semctl */ - switch(uap->a4) { - case IBCS2_IPC_STAT: - { - struct ibcs2_semid_ds *isp; - struct semid_ds *sp; - union semun *sup, ssu; - caddr_t sg = stackgap_init(); + switch(uap->cmd) { + case IBCS2_IPC_STAT: + semun.buf = &bs; + error = kern_semctl(td, uap->semid, uap->semnum, IPC_STAT, + &semun, UIO_SYSSPACE); + if (error) + return (error); + cvt_semid2isemid(&bs, &is); + return (copyout(&is, uap->arg.buf, sizeof(is))); + + case IBCS2_IPC_SET: + error = copyin(uap->arg.buf, &is, sizeof(is)); + if (error) + return (error); + cvt_isemid2semid(&is, &bs); + semun.buf = &bs; + return (kern_semctl(td, uap->semid, uap->semnum, IPC_SET, + &semun, UIO_SYSSPACE)); + } + + return (kern_semctl(td, uap->semid, uap->semnum, uap->cmd, &uap->arg, + UIO_USERSPACE)); +} + +struct ibcs2_semget_args { + int what; + int key; + int nsems; + int semflg; +}; +static int +ibcs2_semget(struct thread *td, void *v) +{ + struct ibcs2_semget_args *uap = v; + struct semget_args ap; - ssu = (union semun) uap->a5; - sp = stackgap_alloc(&sg, sizeof(struct semid_ds)); - sup = stackgap_alloc(&sg, sizeof(union semun)); - sup->buf = sp; - uap->a5 = (int)sup; - error = semsys(td, (struct semsys_args *)uap); - if (!error) { - uap->a5 = (int)ssu.buf; - isp = stackgap_alloc(&sg, sizeof(*isp)); - cvt_semid2isemid(sp, isp); - error = copyout((caddr_t)isp, - (caddr_t)ssu.buf, - sizeof(*isp)); - } - return error; - } - case IBCS2_IPC_SET: - { - struct ibcs2_semid_ds *isp; - struct semid_ds *sp; - caddr_t sg = stackgap_init(); + ap.key = uap->key; + ap.nsems = uap->nsems; + ap.semflg = uap->semflg; + return (semget(td, &ap)); +} - isp = stackgap_alloc(&sg, sizeof(*isp)); - sp = stackgap_alloc(&sg, sizeof(*sp)); - error = copyin((caddr_t)uap->a5, (caddr_t)isp, - sizeof(*isp)); - if (error) - return error; - cvt_isemid2semid(isp, sp); - uap->a5 = (int)sp; - return semsys(td, (struct semsys_args *)uap); - } - case IBCS2_SETVAL: - { - union semun *sp; - caddr_t sg = stackgap_init(); +struct ibcs2_semop_args { + int what; + int semid; + struct sembuf *sops; + size_t nsops; +}; - sp = stackgap_alloc(&sg, sizeof(*sp)); - sp->val = (int) uap->a5; - uap->a5 = (int)sp; - return semsys(td, (struct semsys_args *)uap); - } - } +static int +ibcs2_semop(struct thread *td, void *v) +{ + struct ibcs2_semop_args *uap = v; + struct semop_args ap; - return semsys(td, (struct semsys_args *)uap); + ap.semid = uap->semid; + ap.sops = uap->sops; + ap.nsops = uap->nsops; + return (semop(td, &ap)); +} - case 1: /* semget */ - return semsys(td, (struct semsys_args *)uap); +int +ibcs2_semsys(td, uap) + struct thread *td; + struct ibcs2_semsys_args *uap; +{ - case 2: /* semop */ - return semsys(td, (struct semsys_args *)uap); + switch (uap->which) { + case 0: + return (ibcs2_semctl(td, uap)); + case 1: + return (ibcs2_semget(td, uap)); + case 2: + return (ibcs2_semop(td, uap)); } - return EINVAL; + return (EINVAL); }