ARM: dts: imx53-qsb: disable 1.2GHz OPP
Sasha Levin
maintainerPATCH 1/9 ARM: dts: imx53-qsb: disable 1.2GHz OPP
From: Sascha Hauer <[email protected]>
[ Upstream commit eea96566c189c77e5272585984eb2729881a2f1d ]
The maximum CPU frequency for the i.MX53 QSB is 1GHz, so disable the 1.2GHz OPP. This makes the board work again with configs that have cpufreq enabled like imx_v6_v7_defconfig on which the board stopped working with the addition of cpufreq-dt support.
--- arch/arm/boot/dts/imx53-qsb-common.dtsi | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/arm/boot/dts/imx53-qsb-common.dtsi +11 -0
@@ -130,6 +130,17 @@ }; }; +&cpu0 { + /* CPU rated to 1GHz, not 1.2GHz as per the default settings */ + operating-points = < + /* kHz uV */ + 166666 850000 + 400000 900000 + 800000 1050000 + 1000000 1200000 + >; +}; + &esdhc1 { pinctrl-names = "default"; pinctrl-0 = <&pinctrl_esdhc1>;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 2/9 Input: mousedev - add a schedule point in mousedev_write()
From: Eric Dumazet <[email protected]>
[ Upstream commit f74c371fe72a4f820d287db8067683fb533e4ede ]
syzbot was able to trigger rcu stalls by calling write() with large number of bytes.
Add a cond_resched() in the loop to avoid this.
--- drivers/input/mousedev.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/mousedev.c +1 -0
@@ -707,6 +707,7 @@ static ssize_t mousedev_write(struct file *file, const char __user *buffer,mousedev_generate_response (client, c);spin_unlock_irq (&client->packet_lock); +cond_resched (); }kill_fasync (&client->fasync,SIGIO ,POLL_IN );
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 3/9 Input: evdev - add a schedule point in evdev_write()
In reply to Sasha LevinFrom: Dmitry Torokhov <[email protected]>
[ Upstream commit 36d2582ff235b4e01ad64a734c877a52dc762d9c ]
Large writes to evdev interface may cause rcu stalls. Let's add cond_resched() to the loop to avoid this.
--- drivers/input/evdev.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/evdev.c +1 -0
@@ -558,6 +558,7 @@ static ssize_t evdev_write(struct file *file, const char __user *buffer,input_inject_event (&evdev->handle, event.type, event.code, event.value); +cond_resched (); } out:
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 4/9 Input: uinput - add a schedule point in uinput_inject_events()
In reply to Sasha LevinFrom: Dmitry Torokhov <[email protected]>
[ Upstream commit cecf10704899467a787975e3d94a1f0129b9688e ]
Large writes to uinput interface may cause rcu stalls. Let's add cond_resched() to the loop to avoid this.
--- drivers/input/misc/uinput.c | 1 + 1 file changed, 1 insertion(+)
drivers/input/misc/uinput.c +1 -0
@@ -540,6 +540,7 @@ static ssize_t uinput_inject_events(struct uinput_device *udev,input_event (udev->dev, ev.type, ev.code, ev.value); bytes +=input_event_size (); +cond_resched (); }return bytes;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 5/9 rxrpc: Don't check RXRPC_CALL_TX_LAST after calling rxrpc_rotate_tx_window()
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit c479d5f2c2e1ce609da08c075054440d97ddff52 ]
We should only call the function to end a call's Tx phase if we rotated the marked-last packet out of the transmission buffer.
Make rxrpc_rotate_tx_window() return an indication of whether it just rotated the packet marked as the last out of the transmit buffer, carrying the information out of the locked section in that function.
We can then check the return value instead of examining RXRPC_CALL_TX_LAST.
--- net/rxrpc/input.c | 35 +++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
net/rxrpc/input.c +19 -16
@@ -216,10 +216,11 @@ static void rxrpc_send_ping(struct rxrpc_call *call, struct sk_buff *skb,/* * Apply a hard ACK by advancing the Tx window. */ -static void rxrpc_rotate_tx_window (struct rxrpc_call *call,rxrpc_seq_t to, +static bool rxrpc_rotate_tx_window (struct rxrpc_call *call,rxrpc_seq_t to,struct rxrpc_ack_summary *summary) {struct sk_buff *skb, *list =NULL ; +bool rot_last = false;int ix;u8 annotation;
@@ -243,15 +244,17 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, skb->next = list; list = skb; -if (annotation &RXRPC_TX_ANNO_LAST ) +if (annotation &RXRPC_TX_ANNO_LAST ) {set_bit (RXRPC_CALL_TX_LAST , &call->flags); + rot_last = true; + }if ((annotation &RXRPC_TX_ANNO_MASK ) !=RXRPC_TX_ANNO_ACK ) summary->nr_rot_new_acks++; }spin_unlock (&call->lock); -trace_rxrpc_transmit (call, (test_bit (RXRPC_CALL_TX_LAST , &call->flags) ? +trace_rxrpc_transmit (call, (rot_last ? rxrpc_transmit_rotate_last : rxrpc_transmit_rotate));wake_up (&call->waitq);
@@ -262,6 +265,8 @@ static void rxrpc_rotate_tx_window(struct rxrpc_call *call, rxrpc_seq_t to, skb->next =NULL ;rxrpc_free_skb (skb, rxrpc_skb_tx_freed); } + +return rot_last; }/*
@@ -332,11 +337,11 @@ static bool rxrpc_receiving_reply(struct rxrpc_call *call) ktime_get_real()); } -if (!test_bit (RXRPC_CALL_TX_LAST , &call->flags)) -rxrpc_rotate_tx_window (call, top, &summary);if (!test_bit (RXRPC_CALL_TX_LAST , &call->flags)) { -rxrpc_proto_abort ("TXL" , call, top); -return false; +if (!rxrpc_rotate_tx_window (call, top, &summary)) { +rxrpc_proto_abort ("TXL" , call, top); +return false; + } }if (!rxrpc_end_tx_phase (call, true,"ETD" ))return false;
@@ -839,8 +844,12 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,if (nr_acks > call->tx_top - hard_ack)return rxrpc_proto_abort ("AKN" , call,0 ); -if (after (hard_ack, call->tx_hard_ack)) -rxrpc_rotate_tx_window (call, hard_ack, &summary); +if (after (hard_ack, call->tx_hard_ack)) { +if (rxrpc_rotate_tx_window (call, hard_ack, &summary)) { +rxrpc_end_tx_phase (call, false,"ETA" ); +return ; + } + }if (nr_acks >0 ) {if (skb_copy_bits (skb, offset, buf.acks, nr_acks) <0 )
@@ -849,11 +858,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, &summary); } -if (test_bit (RXRPC_CALL_TX_LAST , &call->flags)) { -rxrpc_end_tx_phase (call, false,"ETA" ); -return ; - } - if (call->rxtx_annotations[call->tx_top & RXRPC_RXTX_BUFF_MASK] & RXRPC_TX_ANNO_LAST && summary.nr_acks == call->tx_top - hard_ack &&
@@ -875,8 +879,7 @@ static void rxrpc_input_ackall(struct rxrpc_call *call, struct sk_buff *skb)_proto ("Rx ACKALL %%%u" , sp->hdr.serial); -rxrpc_rotate_tx_window (call, call->tx_top, &summary); -if (test_bit (RXRPC_CALL_TX_LAST , &call->flags)) +if (rxrpc_rotate_tx_window (call, call->tx_top, &summary))rxrpc_end_tx_phase (call, false,"ETL" ); }
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 6/9 rxrpc: Only take the rwind and mtu values from latest ACK
In reply to Sasha LevinFrom: David Howells <[email protected]>
[ Upstream commit 298bc15b2079c324e82d0a6fda39c3d762af7282 ]
Move the out-of-order and duplicate ACK packet check to before the call to rxrpc_input_ackinfo() so that the receive window size and MTU size are only checked in the latest ACK packet and don't regress.
--- net/rxrpc/input.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
net/rxrpc/input.c +10 -9
@@ -808,6 +808,16 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb, rxrpc_propose_ack_respond_to_ack); } +/* Discard any out-of-order or duplicate ACKs. */ +if (before_eq (sp->hdr.serial, call->acks_latest)) { +_debug ("discard ACK %d <= %d" , + sp->hdr.serial, call->acks_latest); +return ; + } + call->acks_latest_ts = skb->tstamp; + call->acks_latest = sp->hdr.serial; + +/* Parse rwind and mtu sizes if provided. */ ioffset = offset + nr_acks +3 ;if (skb->len >= ioffset +sizeof (buf.info)) {if (skb_copy_bits (skb, ioffset, &buf.info,sizeof (buf.info)) <0 )
@@ -829,15 +839,6 @@ static void rxrpc_input_ack(struct rxrpc_call *call, struct sk_buff *skb,return ; } -/* Discard any out-of-order or duplicate ACKs. */ -if (before_eq (sp->hdr.serial, call->acks_latest)) { -_debug ("discard ACK %d <= %d" , - sp->hdr.serial, call->acks_latest); -return ; - } - call->acks_latest_ts = skb->tstamp; - call->acks_latest = sp->hdr.serial; -if (before (hard_ack, call->tx_hard_ack) ||after (hard_ack, call->tx_top))return rxrpc_proto_abort ("AKW" , call,0 );
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 7/9 net: ena: fix NULL dereference due to untimely napi initialization
In reply to Sasha LevinFrom: Arthur Kiyanovski <[email protected]>
[ Upstream commit 78a55d05def95144ca5fa9a64c49b2a0636a9866 ]
napi poll functions should be initialized before running request_irq(), to handle a rare condition where there is a pending interrupt, causing the ISR to fire immediately while the poll function wasn't set yet, causing a NULL dereference.
--- drivers/net/ethernet/amazon/ena/ena_netdev.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/amazon/ena/ena_netdev.c +7 -2
@@ -1482,8 +1482,6 @@ static int ena_up_complete(struct ena_adapter *adapter)if (rc)return rc; -ena_init_napi (adapter); -ena_change_mtu (adapter->netdev, adapter->netdev->mtu);ena_refill_all_rx_bufs (adapter);
@@ -1643,6 +1641,13 @@ static int ena_up(struct ena_adapter *adapter)ena_setup_io_intr (adapter); +/* napi poll functions should be initialized before running +* request_irq(), to handle a rare condition where there is a pending +* interrupt, causing the ISR to fire immediately while the poll +* function wasn't set yet, causing a null dereference +*/ +ena_init_napi (adapter); + rc =ena_request_io_irq (adapter);if (rc) goto err_req_irq;
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 8/9 libertas: call into generic suspend code before turning off power
In reply to Sasha LevinFrom: Daniel Mack <[email protected]>
[ Upstream commit 4f666675cdff0b986195413215eb062b7da6586f ]
When powering down a SDIO connected card during suspend, make sure to call into the generic lbs_suspend() function before pulling the plug. This will make sure the card is successfully deregistered from the system to avoid communication to the card starving out.
--- drivers/net/wireless/marvell/libertas/if_sdio.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/wireless/marvell/libertas/if_sdio.c +4 -0
@@ -1368,6 +1368,10 @@ static int if_sdio_suspend(struct device *dev)if (priv->wol_criteria ==EHS_REMOVE_WAKEUP ) {dev_info (dev,"Suspend without wake params -- powering down card\n" );if (priv->fw_ready) { + ret =lbs_suspend (priv); +if (ret) +return ret; + priv->power_up_on_resume = true;if_sdio_power_off (card); }
Signature · 1 line
2.17.1
Sasha Levin
maintainerPATCH 9/9 fs/fat/fatent.c: add cond_resched() to fat_count_free_clusters()
In reply to Sasha LevinFrom: Khazhismel Kumykov <[email protected]>
[ Upstream commit ac081c3be3fae6d0cc3e1862507fca3862d30b67 ]
On non-preempt kernels this loop can take a long time (more than 50 ticks) processing through entries.
--- fs/fat/fatent.c | 1 + 1 file changed, 1 insertion(+)
fs/fat/fatent.c +1 -0
@@ -681,6 +681,7 @@ int fat_count_free_clusters(struct super_block *sb)if (ops->ent_get (&fatent) ==FAT_ENT_FREE ) free++; }while (fat_ent_next (sbi, &fatent)); +cond_resched (); } sbi->free_clusters = free; sbi->free_clus_valid =1 ;
Signature · 1 line
2.17.1