I freeze the q before strqset (for of chainging water marks and packet size
boundaries).
So, I think the
         LIS_QISRLOCK(q, &flags);
         strqset(...)
         LIS_QISRUNLOCK(q, &flags);
Is acceptable solution.

> -----Original Message-----
> From: David Grothe [mailto:[EMAIL PROTECTED] 
> Sent: Tuesday, September 30, 2003 10:10 PM
> To: [EMAIL PROTECTED]
> Cc: Oleg Kodel; '[EMAIL PROTECTED]'
> Subject: Re: [Linux-streams] Freezestr() analoug in the LIS
> 
> 
> In LiS, upon entry to a put or service procedure the running 
> thread holds a 
> lock on the queue that is passed in as a parameter (not the queue 
> pair).  While this STREAMS routine is running, other threads 
> may use putq 
> or getq on the queue with no blocking.  But another thread 
> cannot do a 
> putnext() into the queue or cause the queue's service 
> procedure to be invoked.
> 
> So the stream is about "half frozen" implicitly.  Depending 
> upon what Oleg 
> wants to do, that may be good enough.  If he is reaching into 
> the queue and 
> manipulating structure elements that the STREAMS executive 
> also manipulates 
> then he is playing with fire, freezestr() or no freezestr().  
> If he is 
> simply trying to accomplish exclusivity of access to the 
> queue between 
> members of his own family of drivers then a private lock 
> would be more 
> appropriate.
> 
> The Solaris documentation on freezestr() says, in part:
> 
> >There are usually better ways to accomplish things than by 
> freezing the
> >stream.
> 
> So I am regarding this as a low priority change.
> 
> -- Dave
> 
> 
> At 02:24 PM 9/30/2003 Tuesday, Brian F. G. Bidulock wrote:
> >Dave,
> >
> >Just dummying out would be dangerous on MP.  For LfS I take 
> a read lock 
> >on the stream head and take a write lock on queue saving local irq 
> >flags in the queue_t structure.  For unfreezestr I undo the 
> two locks 
> >and restore irq flags from the queue_t structure.  I save 
> the isr flags 
> >in the queue structure to preserve the prototype for 
> freezestr(queue_t 
> >*q) and unfreezestr(queue_t *q).
> >
> >freezestr must lock out at least putq, putbq for the queue until the 
> >stream is thawed.
> >
> >Even though LiS appears to single thread put and srv and locks out 
> >local interrupts while either of these are running, 
> interrupt service 
> >routines on another processor performing putq to the 
> supposedly frozen 
> >queue could cause serious problems.
> >
> >In LiS it would be closer to take the LIS_QISRLOCK on the queue for 
> >freezestr and release it with LIS_QISRUNLOCK on unfreezestr. 
> >Unfortunately these functions need a pointer to an int as an 
> argument 
> >as well.  So,
> >
> >{
> >         int flags;
> >         LIS_QISRLOCK(q, &flags);
> >
> >         ...
> >
> >         LIS_QISRUNLOCK(q, &flags);
> >}
> >
> >is roughly equivalent to:
> >
> >{
> >         freezestr(q);
> >
> >         ...
> >
> >         unfreezestr(q);
> >}
> >
> >in that it at least locks the queue.  freezing a stream is really 
> >supposed to lock all the queues in the stream, but at least this 
> >protects the queue whose internals are being manipulated.
> >
> >In Linux Fast-STREAMS I have:
> >
> >void freezestr(queue_t *q)
> >{
> >         unsigned long flags;
> >         hrlock(q);
> >         local_irq_save(flags);
> >         write_lock(&q->q_rwlock);
> >         q->q_iflags = flags;
> >}
> >
> >void unfreezestr(queue_t *q)
> >{
> >         unsigned long flags = q->q_iflags;
> >         write_unlock(&q->q_rwlock);
> >         local_irq_restore(flags);
> >         hrunlock(q);
> >}
> >
> >to preserve the prototype.  It also read locks the stream 
> head to keep 
> >I_PUSH, I_POP, qopen and qclose from altering the stream 
> configuration 
> >and protects reading the q->q_next pointer as well.
> >
> >--brian
> >
> >
> >On Tue, 30 Sep 2003, Dave Grothe wrote:
> >
> > > These are not implemented in LiS.  Just provide dummy 
> routines when 
> > > compiling for LiS.
> > > -- Dave
> > >
> > > At 06:49 AM 9/30/2003 Tuesday, Oleg Kodel wrote:
> > > >Is it some freezestr()/unfreezestr() (SVR4) analogous in the LIS?
> > > >
> > > >This e-mail message has been sent by Elbit Systems Ltd. 
> and is for 
> > > >the use of the intended recipients only. The message may contain 
> > > >privileged or confidential information . If you are not the 
> > > >intended recipient you are hereby notified that any
> > use,
> > > >distribution or copying of this communication is strictly 
> > > >prohibited, and you are requested to delete the e-mail and any 
> > > >attachments and notify the sender immediately.
> > > >
> > > >_______________________________________________
> > > >Linux-streams mailing list [EMAIL PROTECTED]
> > > >http://gsyc.escet.urjc.es/mailman/listinfo/linux-streams
> > >
> > >
> > > _______________________________________________
> > > Linux-streams mailing list
> > > [EMAIL PROTECTED] 
> > > http://gsyc.escet.urjc.es/mailman/listinfo/linux-streams
> >
> >--
> >Brian F. G. Bidulock    | The reasonable man adapts himself to the |
> >[EMAIL PROTECTED]    | world; the unreasonable one persists in  |
> >http://www.openss7.org/ | trying  to adapt the  world  to himself. |
> >                         | Therefore  all  progress  depends on the |
> >                         | unreasonable man. -- George Bernard Shaw |
> >
> >_______________________________________________
> >Linux-streams mailing list
> >[EMAIL PROTECTED] 
> >http://gsyc.escet.urjc.es/mailman/listinfo/linux-streams
> 

This e-mail message has been sent by Elbit Systems Ltd.
and is for the use of the intended recipients only.
The message may contain privileged or confidential information .
If you are not the intended recipient you are hereby notified that any use,
distribution or copying of this communication is strictly prohibited,
and you are requested to delete the e-mail and any attachments
and notify the sender immediately.

_______________________________________________
Linux-streams mailing list
[EMAIL PROTECTED]
http://gsyc.escet.urjc.es/mailman/listinfo/linux-streams

Reply via email to