[RTEMS Project] #4207: PZERO define in RTEMS is wrong (was: PZERO define in newlib is wrong)

RTEMS trac trac at rtems.org
Wed Dec 23 19:23:03 UTC 2020


#4207: PZERO define in RTEMS is wrong
----------------------------+---------------------
 Reporter:  Chris Johns     |       Owner:  (none)
     Type:  defect          |      Status:  new
 Priority:  normal          |   Milestone:  6.1
Component:  network/libbsd  |     Version:  6
 Severity:  normal          |  Resolution:
 Keywords:                  |  Blocked By:
 Blocking:                  |
----------------------------+---------------------
Description changed by Chris Johns:

Old description:

> Our newlib support defines `PZERO` to be zero. FreeBSD defines `PZERO` to
> be `(PRI_MIN_KERN + 20)` and `PRI_MIN_KERN` is `80`.
>
> The `__sleep()` call uses bits allocated above the bits used to hold the
> highest priority to signal things to do. The `PDROP` (`0x200`) bit causes
> a lock to be dropped before sleeping and not reclaimed after.
>
> Setting `PZERO` to `0` breaks FreeBSD code in libbsd because calls that
> end up in `__sleep()` can incorrectly have the `PDROP` bit set. A grep of
> FreeBSD shows how this happens:
>
> {{{
>    (void) nfsmsleep(&lp->nfslock_lock, mutex,
>       PZERO - 1, "nfsv4gr", NULL);
> }}}
> {{{
>    error = msleep(msqkptr, &msq_mtx, (PZERO - 4) | PCATCH,
>      msgsnd", hz);
>
> }}}
> This examples shows how either side is used...
> {{{
>    selwakeuppri(&tp->tun_rsel, PZERO + 1);
> }}}

New description:

 Our libbsd support in RTEMS defines `PZERO` to be zero. FreeBSD defines
 `PZERO` to be `(PRI_MIN_KERN + 20)` and `PRI_MIN_KERN` is `80`.

 The `__sleep()` call uses bits allocated above the bits used to hold the
 highest priority to signal things to do. The `PDROP` (`0x200`) bit causes
 a lock to be dropped before sleeping and not reclaimed after.

 Setting `PZERO` to `0` breaks FreeBSD code in libbsd because calls that
 end up in `__sleep()` can incorrectly have the `PDROP` bit set. A grep of
 FreeBSD shows how this happens:

 {{{
    (void) nfsmsleep(&lp->nfslock_lock, mutex,
       PZERO - 1, "nfsv4gr", NULL);
 }}}
 {{{
    error = msleep(msqkptr, &msq_mtx, (PZERO - 4) | PCATCH,
      msgsnd", hz);

 }}}
 This examples shows how either side is used...
 {{{
    selwakeuppri(&tp->tun_rsel, PZERO + 1);
 }}}

--

--
Ticket URL: <http://devel.rtems.org/ticket/4207#comment:1>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list