Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Right-click on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
You can subscribe to this list here.
2001 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
(1) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2002 |
Jan
|
Feb
(12) |
Mar
(43) |
Apr
(51) |
May
(9) |
Jun
(54) |
Jul
(89) |
Aug
(148) |
Sep
(84) |
Oct
(139) |
Nov
(88) |
Dec
(68) |
2003 |
Jan
(64) |
Feb
(55) |
Mar
(59) |
Apr
(66) |
May
(93) |
Jun
(103) |
Jul
(73) |
Aug
(174) |
Sep
(167) |
Oct
(96) |
Nov
(128) |
Dec
(61) |
2004 |
Jan
(162) |
Feb
(138) |
Mar
(112) |
Apr
(52) |
May
(83) |
Jun
(105) |
Jul
(112) |
Aug
(51) |
Sep
(75) |
Oct
(63) |
Nov
(31) |
Dec
(25) |
2005 |
Jan
(71) |
Feb
(42) |
Mar
(23) |
Apr
(32) |
May
(36) |
Jun
(22) |
Jul
(12) |
Aug
(14) |
Sep
(37) |
Oct
(8) |
Nov
(6) |
Dec
(7) |
2006 |
Jan
(22) |
Feb
(78) |
Mar
(17) |
Apr
(66) |
May
(56) |
Jun
(24) |
Jul
(18) |
Aug
(12) |
Sep
(118) |
Oct
(13) |
Nov
(21) |
Dec
(11) |
2007 |
Jan
(21) |
Feb
(30) |
Mar
(74) |
Apr
(38) |
May
(30) |
Jun
(11) |
Jul
(59) |
Aug
(26) |
Sep
(6) |
Oct
(18) |
Nov
(14) |
Dec
(19) |
2008 |
Jan
(17) |
Feb
|
Mar
(7) |
Apr
(8) |
May
(6) |
Jun
(7) |
Jul
(5) |
Aug
|
Sep
(1) |
Oct
(18) |
Nov
(13) |
Dec
(24) |
2009 |
Jan
(5) |
Feb
|
Mar
(21) |
Apr
(2) |
May
(2) |
Jun
(3) |
Jul
(2) |
Aug
(2) |
Sep
(16) |
Oct
(3) |
Nov
(1) |
Dec
(2) |
2010 |
Jan
(5) |
Feb
(1) |
Mar
(1) |
Apr
|
May
(1) |
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
(1) |
Dec
|
2011 |
Jan
|
Feb
(1) |
Mar
(2) |
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
2012 |
Jan
|
Feb
|
Mar
|
Apr
(3) |
May
(9) |
Jun
|
Jul
|
Aug
(6) |
Sep
|
Oct
(6) |
Nov
|
Dec
|
2013 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2014 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
(1) |
2015 |
Jan
|
Feb
|
Mar
(1) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2016 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
(8) |
Jun
|
Jul
(1) |
Aug
(2) |
Sep
|
Oct
|
Nov
|
Dec
|
S | M | T | W | T | F | S |
---|---|---|---|---|---|---|
1
|
2
|
3
|
4
(3) |
5
(3) |
6
(1) |
7
(1) |
8
|
9
|
10
(1) |
11
(1) |
12
|
13
|
14
|
15
|
16
|
17
|
18
(10) |
19
(1) |
20
|
21
(11) |
22
(3) |
23
|
24
|
25
|
26
(1) |
27
(1) |
28
|
29
|
30
(1) |
|
|
|
|
|
From: Guennadi Liakhovetski <gl@ds...> - 2007-04-27 07:44:02
|
On Fri, 27 Apr 2007, Samuel Ortiz wrote: > After looking a bit more carefully at it, I have a remark regarding this > patch: > > > > diff -p -u -r1.1.1.8.4.1 irlap_frame.c > > > --- a/net/irda/irlap_frame.c 2 Apr 2007 10:36:28 -0000 1.1.1.8.4.1 > > > +++ b/net/irda/irlap_frame.c 19 Apr 2007 13:20:36 -0000 > > > @@ -796,6 +796,7 @@ void irlap_send_data_primary_poll(struct > > > self->vs = (self->vs + 1) % 8; > > > self->ack_required = FALSE; > > > > > > + irlap_next_state(self, LAP_NRM_P); > > > irlap_send_i_frame(self, tx_skb, CMD_FRAME); > > > } else { > > > IRDA_DEBUG(4, "%s(), sending unreliable frame\n", __FUNCTION__); > > > @@ -808,6 +809,7 @@ void irlap_send_data_primary_poll(struct > > > skb->data[1] |= PF_BIT; > > > irlap_send_ui_frame(self, skb_get(skb), self->caddr, CMD_FRAME); > > > } > > > + irlap_next_state(self, LAP_NRM_P); > > > } > Here you're calling irlap_next_state() after the last frame has been sent. > If irlap_send_data_primary_poll() gets preempted, and we receive the peer's > answer before we call irlap_next_state(), then we may hit the same bug you are > trying to fix. Yes, I know. It was a deliberate decision. I couldn't reproduce a race in those branches, and, therefore couldn't test any fix. So, I preferred to go the "least impact" way. So, what is the logic we are trying to implement now? Set the LAP_NRM_P state just before sending the packet with the pf-bit? Or can we set it as long as we know that we're about to send such a packet? I.e., would it be safe maybe to just put the call to irlap_next_state(self, LAP_NRM_P); just after del_timer(&self->poll_timer); (btw, shouldn't it be del_timer_sync()? But it can also be called from a softirq, so, perhaps not) or maybe even just put it above the call to irlap_send_data_primary_poll(self, skb); in irlap_state_xmit_p()? In fact, as I now look at this patch again, I've already changed the behaviour in the error case with it: if tx_skb = skb_clone(skb, GFP_ATOMIC); fails. Before, it would fail cloning the skb, wouldn't send the frame, and still just set the state to LAP_NRM_P and just hang there indefinitely. Now it aborts and stays in the LAP_XMIT_P state, which is correct? > This is how I'd see it, let me know if you're ok with it: > > diff --git a/net/irda/irlap_frame.c b/net/irda/irlap_frame.c > index 3c5a68e..3013c49 100644 > --- a/net/irda/irlap_frame.c > +++ b/net/irda/irlap_frame.c > @@ -798,16 +798,19 @@ void irlap_send_data_primary_poll(struct irlap_cb *self, struct sk_buff *skb) > self->vs = (self->vs + 1) % 8; > self->ack_required = FALSE; > > + irlap_next_state(self, LAP_NRM_P); > irlap_send_i_frame(self, tx_skb, CMD_FRAME); > } else { > IRDA_DEBUG(4, "%s(), sending unreliable frame\n", __FUNCTION__); > > if (self->ack_required) { > irlap_send_ui_frame(self, skb_get(skb), self->caddr, CMD_FRAME); > + irlap_next_state(self, LAP_NRM_P); > irlap_send_rr_frame(self, CMD_FRAME); > self->ack_required = FALSE; > } else { > skb->data[1] |= PF_BIT; > + irlap_next_state(self, LAP_NRM_P); > irlap_send_ui_frame(self, skb_get(skb), self->caddr, CMD_FRAME); > } > } So, as I said, the whole IrDA stack is, well, non-trivial. After about 2 months of almost full-time debugging it I still don't understand many things like how are all those numerous asynchronous contexts (timers / softirqs, user, irq, work-queues...) are locking the common data, etc. Therefore, I would prefer to keep places that we cannot currently test as close to "unmodified" as possible. But if you are sure this change is correct, well, we can try it too. Thanks Guennadi --------------------------------- Guennadi Liakhovetski, Ph.D. DSA Daten- und Systemtechnik GmbH Pascalstr. 28 D-52076 Aachen Germany |