cvs commit: src/sys/compat/ndis subr_ntoskrnl.c src/sys/dev/if_ndis if_ndis.c

Bill Paul wpaul at FreeBSD.org
Fri Apr 30 13:51:56 PDT 2004


wpaul       2004/04/30 13:51:55 PDT

  FreeBSD src repository

  Modified files:
    sys/compat/ndis      subr_ntoskrnl.c 
    sys/dev/if_ndis      if_ndis.c 
  Log:
  Small timer cleanups:
  
  - Use the dh_inserted member of the dispatch header in the Windows
    timer structure to indicate that the timer has been "inserted into
    the timer queue" (i.e. armed via timeout()). Use this as the value
    to return to the caller in KeCancelTimer(). Previously, I was using
    callout_pending(), but you can't use that with timeout()/untimeout()
    without creating a potential race condition.
  
  - Make ntoskrnl_init_timer() just a wrapper around ntoskrnl_init_timer_ex()
    (reduces some code duplication).
  
  - Drop Giant when entering if_ndis.c:ndis_tick() and
    subr_ntorkrnl.c:ntoskrnl_timercall(). At the moment, I'm forced to
    use system callwheel via timeout()/untimeout() to handle timers rather
    than the callout API (struct callout is too big to fit inside the
    Windows struct KTIMER, so I'm kind of hosed). Unfortunately, all
    the callouts in the callwhere are not marked as MPSAFE, so when
    one of them fires, it implicitly acquires Giant before invoking the
    callback routine (and releases it when it returns). I don't need to
    hold Giant, but there's no way to stop the callout code from acquiring
    it as long as I'm using timeout()/untimeout(), so for now we cheat
    by just dropping Giant right away (and re-acquiring it right before
    the routine returns so keep the callout code happy). At some point,
    I will need to solve this better, but for now this should be a suitable
    workaround.
  
  Revision  Changes    Path
  1.37      +19 -24    src/sys/compat/ndis/subr_ntoskrnl.c
  1.59      +6 -0      src/sys/dev/if_ndis/if_ndis.c


More information about the cvs-src mailing list