实时Linux还有一个已知的问题

2022-02-21 10:04:56

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]亲爱的RT朋友们!我';我很高兴宣布v5。17-rc3-rt6配线架。自v5以来的变化。17-rc3-rt5:-更新John';s printk系列。它现在支持从irqwork直接打印。-正确访问printk中的变量。约翰·奥格尼斯的补丁。-如果ksoftirqd从空闲状态唤醒,请添加警告。-针对随机子系统的Jason A.Donenfeld补丁更新为v4。顶部还有一个与RT相关的额外变化。-已知问题netconsole会触发警告。已从列表中删除,因为它还使用CONFIG_PREEMPT和v5触发。17-rc3(无抢占补丁)。已知问题-Valentin Schneider报告ARM64上出现了一些飞溅,请参阅https://lkml.kernel.org/r/20210810134127.1394269-1-valentin.schneider@xxxxxxx针对v5的增量补丁。可以在下面找到RC17-5:https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.17/incr/patch-5.17-rc3-rt5-rt6.patch.xzYou可以通过git树获取此版本,网址为:git://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.gitv5。17-rc3-RT6针对v5的RT补丁。17-rc3可在此处找到:https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.17/older/patch-5.17-rc3-rt6.patch.xzThe拆分被子队列可在以下位置使用:https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.17/older/patches-5.17-rc3-rt6.tar.xzSebastiandiff--git a/drivers/char/random。c b/驱动程序/字符/随机。cindex afcedefb0c1c8。。E4BD9C917654 100644---a/drivers/char/random。c++b/驱动程序/字符/随机。c@@@404,7+404,7@@@struct fast_pool{struct work_struct mix;unsigned long last;u32 pool[4];-atomic_t count;+unsigned int count;u16 reg_idx;}#定义FAST_POOL_MIX_INFLIGHT(1U<;<;31)@-1045,25+1045,33@@static u32 get_reg(struct FAST_POOL*f,struct pt_regs*regs)static void MIX_interrupt_random(struct work_struct*work){struct FAST_POOL=container_of(work,struct FAST_POOL,MIX);+u8 POOL[sizeof(FAST_POOL->;POOL->;last=jiffies;](不太可能(crng_init==0)){+size_t ret;-/*因为这是通过调度程序执行一次trip的结果,xor in+ret=crng_fast_load((u8*)fast_pool->;pool,sizeof(fast_pool->;pool));+if(ret){+WRITE_ONCE(fast_pool->;count,0);+fast_pool->;last=jiffies;+return;++/*,因为这是通过调度程序执行一次trip的结果调度程序,循环计数器中的xor。它可以';我不疼,也许会有帮助。*/fast_pool->;pool[3]^=random_get_entropy()+/*将池复制到堆栈中,以便混合器始终具有一致的视图*/+memcpy(池、快速池->;池、大小池)+/*只有在我们';我们看完泳池了*/+写入一次(快速池->;计数,0)+快速游泳池->;last=jiffies-if(不太可能(crng_init==0){if(crng_fast_load((u8*))和fast_pool->;pool,sizeof(fast_pool->;pool))>;0-原子集(&;fast_pool->;count,0);-else-原子集和(~fast_pool_MIX飞行中,&;fast_pool->;count);-return;---MIX_pool_字节(&;fast_pool->;pool,sizeof->;pool->;>;>;>;>;池-原子集(&;fast_pool->;count,0)+mix_pool_字节(pool,sizeof(pool));信用熵位(1)+memzero_explicit(pool,sizeof(pool));}void add_interrupt_randomanness(intirq)@-1089,15+1097,33@@@void add_interrupt_randomanness(intirq)fast_mix(fast_pool);添加中断工作台(周期)+新计数=+快速池->;计数-new_count=(unsigned int)原子_inc_return(&;fast_pool->;count)-if(new_count>;=64&;&;new_count<;FAST_POOL>;last+HZ)|124;不太可能(crng_init==0)){+if(不太可能(crng_init==0)){+if(new_count&;FAST_POOL<;MIX_INFLIGHT)+返回;+if(new_count gt;64)+返回;+FAST_-POOL->;count(不太可能(!fast_pool->;mix.func))初始工作(&;fast_pool->;混合、混合、中断\u随机性)-原子或(快速池混合机上和快速池计数)-安排工作(快速组合)+队列工作(原始smp处理器id()、系统高优先级wq、+&;快速游泳池->;混合)+回来}++if(新计数和快速池混合机)+return++如果(新计数<;64&;!时间&u之后(现在,快速池->;最后+HZ))+返回++如果(不太可能(!fast_pool->;mix.func))+INIT_WORK(&;fast_pool->;mix,mix_interrupt_random)+快速游泳池->;计数|=快速_池_混合_机上+队列工作(原始smp处理器id()、系统高优先级wq等);快速游泳池->;混合);}导出符号GPL(添加中断随机性);@-1881,13+1907,16@@static int__initrandom_sysctls_init(void)device_initcall(random_sysctls_init)#endif/*CONFIG_SYSCTL*/+static atomic_t batch_generation=atomic_INIT(0);+结构批处理的_熵{union{u64熵64[CHACHA_BLOCK_SIZE/sizeof(u64)];u32熵_u32[CHACHA_BLOCK_SIZE/sizeof(u32)];}+本地锁;无符号整数位置-spinlock_u t batch_lock+int generation;};/*@-1899,7+1928,7@@struct batched_entropy{*point prior.*/static DEFINE_PER_CPU(struct batched_entropy,batched_entropy_u64)={-.batch_lock=u SPIN_lock_unlock(batched_entropy_u64.lock),+.lock=INIT_LOCAL_lock(batched_entropy__64.lock)};u64 get_random_u64(void)@-1908,67+1937,65@@u64 get_random_u64(void)无符号长标志;结构批处理_熵*批处理;静态无效*先前+int next_gen;警告未种子随机性(&;先前)+local_lock_irqsave(&;batched_entropy_u64.lock,flags);批处理=原始cpu ptr(&;批处理熵)\u64)-旋转锁定irqsave(批处理->;批处理锁定,标志)-if(批处理->;位置%ARRAY_SIZE(批处理->;熵_u64)==0{++next_gen=原子读取(>;批处理生成);+if(批处理->;位置%ARRAY_SIZE(批处理->;熵_u64)==0 |+next_gen batch->;熵_u64);批处理->;位置=0;>;生成=next_gen ret批次->;熵_u64[批次->;位置++]-旋转解锁irqrestore(&;批次->;批次锁定,标志)+本地\u解锁\u irqrestore(&;批处理\u熵\u u64.lock,标志);return ret;}导出_符号(获取_随机_64);静态定义每个CPU(结构批处理熵,批处理熵uu32)={-.batch_ulock=uu自旋锁u unlock(批处理熵32.lock),+.lock=INIT_局部锁(批处理熵32.lock)};+u32 get_random_u32(void){u32 ret;无符号长标志;结构批处理_熵*批处理;静态void*上一个;+int next_gen;warn_Unseedd _randomness(&;previous);+局部_lock _irqsave(&;批处理_熵_锁定,标志);批处理=原始_cpu _ptr(&;批处理_熵_u32);-旋转_锁定_irqsave(&;批处理_锁定,标志);-if(批->;位置%ARRAY_SIZE(批->;熵_u32)==0){++next_gen=原子读取(&;批生成);+if(批->;位置%ARRAY_SIZE(批->;熵_u32)==0 |+next_gen!=批生成){extract_crng((u8*)batch->;熵_u32);批->;位置=0;>;批生成=next_gen ret;熵_u32[批次->;位置++]-旋转解锁irqrestore(&;批次->;批次锁定,标志)+本地\u解锁\u irqrestore(&;批处理\u熵\u u32.lock,标志);返回ret;}导出符号(获取随机符号);/*它';重要的是,要使crng初始化之前可能*存储的所有潜在批处理熵无效,我们可以通过-*简单地将计数器重置为零,使其';在-*下一次使用时重新提取。*/+*碰撞生成计数器。+*/静态void invalidate_batched_entropy(void){-int-cpu;-无符号长标志;--对于每个可能的_cpu(cpu){-struct batched_entropy*batched_entropy;--batched_entropy=per_cpu_ptr(&;batched_entropy_u32,cpu);-自旋锁_irqsave(&;batched_entropy->;batched_lock,flags);-批量锁,标志);-自旋锁(&;批量_熵->;批量_锁)--批处理熵=每cpu(和批处理熵64,cpu)-自旋锁(批处理熵->;批处理锁)-批量_熵->;位置=0-spin_unlock_irqrestore(批处理熵->;批处理锁,标志)-}+atomic_inc(&;batch_generation);}/**diff——git a/kernel/printk/printk。cb/kernel/printk/printk。cindex 3bef5100312ea。。ea55bda735dce 100644---a/kernel/printk/printk。c++b/kernel/printk/printk。c@@@404,7+404,7@@@static atomic_t printk_direct=atomic_INIT(0);/**printk_direct_enter-导致控制台打印在-*printk()调用者+*printk()调用者的上下文中发生**这会全局影响所有printk()调用者。*@-2451,7+2451,9@@static ssize_t msg_print_ext_body(char*buf,size_t size,static void console_lock_spinning_enable(void){}static int console_lock_spinning_disable_and_check(void){返回0;}静态无效调用_控制台_驱动程序(结构控制台*con,const char*text,大小_tlen,-char*删除的_文本,bool原子_打印){}+char*删除的_文本,bool原子_打印)+{++}静态bool抑制_消息_打印(int级别){return false}静态void printk_delay(int level){}静态void start_printk_kthread(struct console*con){}@@@2878,7+2880,7@@static void write_console_seq(struct console*con,u64 val,bool atomic_printing*console_EXT_LOG_MAX.否则@EXT_text必须为空。**如果应该打印丢弃的消息,@drop_text是一个大小为的缓冲区-*drop_text_MAX.其他@drop_text_MAX.否则@drop_text必须为空。**@atomic_printing指定是否使用原子打印。)应使用ing。*@@-3873,6+3875,7@@static void start_printk_kthread(结构控制台*con)*/#define printk_PENDING_WAKEUP 0x01#define printk_PENDING_OUTPUT 0x02+#define printk_DIRECT_OUTPUT 0x04 static define_PER_CPU(int,printk_PENDING);@-3881,9+3884,15@@static void wake_up_klogd_work_func(struct irq_work*irq_work)int pending=u this_cpu_xchg(printk_pending,0);if(pending&;PRINTK_pending_OUTPUT){+if(pending&;PRINTK_DIRECT_OUTPUT)+PRINTK_DIRECT_enter();+/*如果trylock失败,其他人正在打印*/if(console_trylock())console_unlock();+if(pending&PRINTK_DIRECT_OUTPUT)+PRINTK_DIRECT_exit()}if(pending&PRINTK_PENDIN

[档案索引][RT Stable][Kernel Newbies][IDE][Security][Git][Netfilter][Bugtraq][Yosemite][Yosemite News][MIPS Linux][ARM Linux][Linux Security][Linux RAID][Linux ATA RAID][Samba][Video 4 Linux][Device Mapper]