рдЦреБрд╢рдЦрдмрд░реА, рд╣рд░ рдХреЛрдИ!
рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ 5.0 рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╣рд╛рдВ рд╣реИ рдФрд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╡рд┐рддрд░рдг рдЬреИрд╕реЗ рдЖрд░реНрдХ, рдУрдкрдирд╕реИрдм рдЯрдореНрдмрд▓рд╡реАрдб, рдлреЗрдбреЛрд░рд╛ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИред

рдФрд░ рдЕрдЧрд░ рдЖрдк рдЙрдмрдВрдЯреВ рдбрд┐рд╕реНрдХреЛ рдбрд┐рдВрдЧреЛ рдФрд░ рд░реЗрдб рд╣реИрдЯ 8 рдХреЗ рдЖрд░рд╕реА рд╡рд┐рддрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ: рдЬрд▓реНрдж рд╣реА рдХрд░реНрдиреЗрд▓ 5.0 рднреА рдкреНрд░рд╢рдВрд╕рдХ рдбреЗрд╕реНрдХрдЯреЙрдк рд╕реЗ тАЛтАЛрдЧрдВрднреАрд░ рд╕рд░реНрд╡рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдХреЛрдИ рдХрд╣реЗрдЧрд╛ - рддреЛ рдХреНрдпрд╛ред рдЕрдЧрд▓реА рд░рд┐рд▓реАрдЬ, рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВред рд▓рд┐рдиреБрд╕ рдЯреЛрд░рд╡рд╛рд▓реНрдбреНрд╕ рдиреЗ рдЦреБрдж рдХрд╣рд╛:
рдореИрдВ рдЗрдВрдЧрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рдЕрднреА рддрдХ рдлрд┐рд░ рд╕реЗ) рдХрд┐ рд╣рдо рдлреАрдЪрд░-рдЖрдзрд╛рд░рд┐рдд рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ "5.0" рдХрд╛ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдХрд┐ 4.x рд╕рдВрдЦреНрдпрд╛рдПрдВ рдЗрддрдиреА рдмрдбрд╝реА рд╣реЛрдиреЗ рд▓рдЧреАрдВ рдХрд┐ рдореИрдВ рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рднрд╛рдЧ рдЧрдпрд╛ рдФрд░ рдкреИрд░ рдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВред
( рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рдореИрдВ рджреЛрд╣рд░рд╛рддрд╛ рд╣реВрдВ - рд╣рдорд╛рд░реА рд░рд┐рд▓реАрдЬрд╝ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рд╕реЗ рдЬреБрдбрд╝реА рдирд╣реАрдВ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдирдП рд╕рдВрд╕реНрдХрд░рдг 5.0 рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдорддрд▓рдм рдХреЗрд╡рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдирдВрдмрд░рд┐рдВрдЧ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП 4.x рдореЗрд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрд░реНрдпрд╛рдкреНрдд рдЙрдВрдЧрд▓рд┐рдпрд╛рдВ рдФрд░ рдкреИрд░ рдХреА рдЙрдВрдЧрд▓рд┐рдпрд╛рдВ рдирд╣реАрдВ рд╣реИрдВ )
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдлреНрд▓реЙрдкреА рдбрд┐рд╕реНрдХ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ (рдЬреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рд╣реИ - рдпреЗ 1.44 рдПрдордмреА рдХреА рдХреНрд╖рдорддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрддрди рдЬреЗрдм рд╢рд░реНрдЯ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдбрд┐рд╕реНрдХ рд╣реИрдВ) - рд╕рд╣реА ...
рдФрд░ рдпрд╣рд╛рдБ рдХреНрдпреЛрдВ рд╣реИ:
рдпрд╣ рдмрд╣реБ-рдХрддрд╛рд░ рдмреНрд▓реЙрдХ рд▓реЗрдпрд░ (blk-mq) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкрд░рд┐рдЪрдпрд╛рддреНрдордХ рд▓реЗрдЦ рд╣реИрдВ, рддреЛ рдЪрд▓реЛ рдмрд┐рдВрджреБ рдкрд░ рд╕рд╣реА рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред Blk-mq рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдзреАрд░реЗ-рдзреАрд░реЗ рдЖрдЧреЗ рдмрдврд╝ рд░рд╣рд╛ рдерд╛ред рдорд▓реНрдЯреА-рдХрддрд╛рд░ scsi (рдХрд░реНрдиреЗрд▓ рдкреИрд░рд╛рдореАрдЯрд░ scsi_mod.use_blk_mq) рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛, рдирдП рд╢реЗрдбреНрдпреВрд▓рд░ mq-deadline, bfq рдФрд░ рдЗрддрдиреЗ рдкрд░ ...
[root@fedora-29 sblkdev]# cat /sys/block/sda/queue/scheduler [mq-deadline] none
рд╡реИрд╕реЗ, рддреБрдореНрд╣рд╛рд░рд╛ рдХреНрдпрд╛ рд╣реИ?
рдкреБрд░рд╛рдиреЗ рдлреИрд╢рди рдХрд╛ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рд╣реЛ рдЧрдИ рдереАред рдФрд░ 5.0 рдореЗрдВ, blk_init_queue () рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЕрдм 2003 рдХреЗ рдкреБрд░рд╛рдиреЗ рд╢рд╛рдирджрд╛рд░ рдХреЛрдб
lwn.net/Articles/58720 рд╕реЗ рди рдХреЗрд╡рд▓ рдЬрд╛рдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЦреЛрдпрд╛ рд╣реБрдЖ рдорд╣рддреНрд╡ рднреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдирдП рд╡рд┐рддрд░рдг, рдЬреЛ рдЗрд╕ рд╡рд░реНрд╖ рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдПрдХ рдмрд╣реБ-рдХрддрд╛рд░ рдмреНрд▓реЙрдХ рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 18 рд╡реЗрдВ рдордВрдЬрд╝рд░реЛ рдкрд░, рдХрд░реНрдиреЗрд▓, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 4.19, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдмреНрд▓реЗрдХ-рдПрдордХреЗ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдорд╛рди рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХрд░реНрдиреЗрд▓ 5.0 рдореЗрдВ blk-mq рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдкреВрд░рд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред рдФрд░ рдореЗрд░реЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдирд╛ рд╣реИ рдЬрд┐рд╕реЗ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░реАрдХреНрд╖рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЬреЛ рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ рдмрдбрд╝реЗ рдФрд░ рдЫреЛрдЯреЗ, рд╕рд╛рде рд╣реА рдХрдИ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рд╕рд░реНрд╡рд░реЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдлреЗрдбрд┐рдпрд╛, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ! (рд╕реА))ред
рд╡реИрд╕реЗ, рдЕрдЧрд░ рдХрд┐рд╕реА рдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ rhel8 рдХреЗ рд▓рд┐рдП рдпрд╣ рдореЛрдбрд╝ рдирд╣реАрдВ рдЖрдпрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдХрд░реНрдиреЗрд▓ рдХреЛ "рдлрд╝реНрд▓реИрд╢" рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рдХрд┐ 4.18 рд╕рдВрд╕реНрдХрд░рдг рдерд╛, рддреЛ рдЖрдк рдЧрд▓рдд рд╣реИрдВред Rhel8 рдкрд░ рдирдП рдЖрд░рд╕реА рдореЗрдВ, 5.0 рд╕реЗ рдирдП рдЙрддреНрдкрд╛рдж рдкрд╣рд▓реЗ рд╣реА рдорд╛рдЗрдЧреНрд░реЗрдЯ рд╣реЛ рдЧрдП рдереЗ, рдФрд░ blk_init_queue () рдлрд╝рдВрдХреНрд╢рди рднреА рдХрдЯ рдЧрдпрд╛ рдерд╛ (рд╢рд╛рдпрдж рдЬрдм рдПрдХ рдФрд░ рдЪреЗрдХ-рдЗрди github.com/torvalds/linux рдХреЛ рдЕрдкрдиреЗ рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдЦреАрдВрдЪ рд░рд╣рд╛ рд╣реЛ)ред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, SUSE рдФрд░ Red Hat рдЬреИрд╕реЗ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдХреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд░реНрдиреЗрд▓ рдХрд╛ "рдлреНрд░реАрдЬ" рд╕рдВрд╕реНрдХрд░рдг рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдПрдХ рд╡рд┐рдкрдгрди рдЕрд╡рдзрд╛рд░рдгрд╛ рд╣реИред рдкреНрд░рдгрд╛рд▓реА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рд╕рдВрд╕реНрдХрд░рдг, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, 4.4 рд╣реИ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддрд╛рдЬреЗ 4.8 рд╡реЗрдирд┐рд▓рд╛ рд╕реЗ рд╣реИред рдЗрд╕реА рд╕рдордп, рдПрдХ рд╢рд┐рд▓рд╛рд▓реЗрдЦ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рджрд┐рдЦрд╛рддреА рд╣реИ рдЬреИрд╕реЗ: "рдирдП рд╡рд┐рддрд░рдг рдореЗрдВ, рд╣рдордиреЗ рдЖрдкрдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдерд┐рд░ 4.4 рдХрд░реНрдиреЗрд▓ рд░рдЦрд╛ рд╣реИред"
рд▓реЗрдХрд┐рди рд╣рдо рд╡рд┐рдЪрд▓рд┐рдд рдереЗ ...
рддреЛ рдпрд╣рд╛рдБ рд╣реИред рд╣рдореЗрдВ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП рд╕рд░рд▓ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рддреЛ, рд╕реНрд░реЛрдд
github.com/CodeImp/sblkdev рдкрд░ред рдореИрдВ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВ, рдореБрджреНрджрд╛ рд╢реБрд░реВ рдХрд░реЗрдВ - рдореИрдВ рдЗрд╕реЗ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред рдХреНрдпреВрдП рдиреЗ рдЕрднреА рддрдХ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред
рдмрд╛рдж рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реИ рдЗрд╕рд▓рд┐рдП, рдмрд╣реБрдд рдХреЛрдб рд╣реИред
рдореИрдВ рддреБрд░рдВрдд рдорд╛рдлреА рдорд╛рдБрдЧрддрд╛ рд╣реВрдБ рдХрд┐ рд▓рд┐рдирдХреНрд╕ рдХрд░реНрдиреЗрд▓ рдХреЛрдбрд┐рдВрдЧ рд╢реИрд▓реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдореНрдорд╛рдирд┐рдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рд╣рд╛рдБ - рдореБрдЭреЗ рдЧреЛрдЯреЛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред
рддреЛ, рдЪрд▓реЛ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБрдУрдВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
static int __init sblkdev_init(void) { int ret = SUCCESS; _sblkdev_major = register_blkdev(_sblkdev_major, _sblkdev_name); if (_sblkdev_major <= 0){ printk(KERN_WARNING "sblkdev: unable to get major number\n"); return -EBUSY; } ret = sblkdev_add_device(); if (ret) unregister_blkdev(_sblkdev_major, _sblkdev_name); return ret; } static void __exit sblkdev_exit(void) { sblkdev_remove_device(); if (_sblkdev_major > 0) unregister_blkdev(_sblkdev_major, _sblkdev_name); } module_init(sblkdev_init); module_exit(sblkdev_exit);
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЬрдм рдореЙрдбреНрдпреВрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ sblkdev_init () рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм sblkdev_exit () рдЕрдирд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред
Register_blkdev () рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдЙрдиреНрд╣реЗрдВ рдПрдХ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред unregister_blkdev () - рдЗрд╕ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рдореЙрдбреНрдпреВрд▓ рдХреА рдореБрдЦреНрдп рд╕рдВрд░рдЪрдирд╛ sblkdev_device_t рд╣реИред
рдЗрд╕рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реА рд╣реЛрддреА рд╣реИ: рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдХреНрд╖рдорддрд╛, рд╕реНрд╡рдпрдВ рдбреЗрдЯрд╛ (рдпрд╣ рд╕рд░рд▓ рд╣реИ), рдбрд┐рд╕реНрдХ рдФрд░ рдХрддрд╛рд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред
рд╕рднреА рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди sblkdev_add_device () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
static int sblkdev_add_device(void) { int ret = SUCCESS; sblkdev_device_t* dev = kzalloc(sizeof(sblkdev_device_t), GFP_KERNEL); if (dev == NULL) { printk(KERN_WARNING "sblkdev: unable to allocate %ld bytes\n", sizeof(sblkdev_device_t)); return -ENOMEM; } _sblkdev_device = dev; do{ ret = sblkdev_allocate_buffer(dev); if(ret) break; #if 0
рд╣рдо рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдлрд░ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдХреБрдЫ рдЦрд╛рд╕ рдирд╣реАрдВред
рдЗрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдпрд╛ рддреЛ рдПрдХ blk_mq_init_sq_queue () рдлрд╝рдВрдХреНрд╢рди, рдпрд╛ рджреЛ рдХреЛ рдПрдХ рд╕рд╛рде: blk_mq_alloc_tag_set () + blk_mq_init_queue () рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред
рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрдк blk_mq_init_sq_queue () рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕реНрд░реЛрддреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ blk_mq_alloc_tag_set () рдФрд░ blk_mq_init_queue () рдлрд╝рдВрдХреНрд╢рдВрд╕ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИ, рдЬреЛ 4.20 рдХрд░реНрдиреЗрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рд╣рдореЗрдВ рдХрддрд╛рд░ рдХреЗ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдмрд╣реБрдд рд╕рд░рд▓ рджрд┐рдЦрддрд╛ рд╣реИред рдЖрдкрдХреЛ рдЪреБрдирдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВред
рдЗрд╕ рдХреЛрдб рдХреА рдХреБрдВрдЬреА рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ _mq_ops рд╣реИред
static struct blk_mq_ops _mq_ops = { .queue_rq = queue_rq, };
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдерд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рджред рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╣рдордиреЗ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ рдХреЛ рдЕрдиреБрд░реЛрдз рдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИред
рдЕрдм рдЬрдм рд╣рдордиреЗ рдХрддрд╛рд░ рдмрдирд╛ рд▓реА рд╣реИ, рддреЛ рд╣рдо рдбрд┐рд╕реНрдХ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреЛрдИ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖ рд╣реИред рдбрд┐рд╕реНрдХ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдФрд░ рдбрд┐рд╕реНрдХ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдкреИрд░рд╛рдореАрдЯрд░ рдбрд┐рд╕реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ-> рдЭрдВрдбреЗред рдпрд╣ рдЖрдкрдХреЛ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдбрд┐рд╕реНрдХ рд╣рдЯрд╛рдиреЗ рдпреЛрдЧреНрдп рд╣реИ, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрд┐ рдЗрд╕рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рдирд╣реАрдВ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдЙрдирдХреА рддрд▓рд╛рд╢ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
рдбрд┐рд╕реНрдХ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ _fops рд╕рдВрд░рдЪрдирд╛ рд╣реИред
static const struct block_device_operations _fops = { .owner = THIS_MODULE, .open = _open, .release = _release, .ioctl = _ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = _compat_ioctl, #endif };
рдПрдХ рд╕рд░рд▓ рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ _open рдФрд░ _release рдЕрднреА рддрдХ рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВред рдкрд░рдорд╛рдгреБ рд╡реГрджреНрдзрд┐ рдФрд░ рдЧрд┐рд░рд╛рд╡рдЯ рдХрд╛рдЙрдВрдЯрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣рд╛рдБ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмрд┐рдирд╛ рднреА рд╣рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдЫреЛрдбрд╝рд╛, рдХреНрдпреЛрдВрдХрд┐ 64-рдмрд┐рдЯ рдХрд░реНрдиреЗрд▓ рдФрд░ 32-рдмрд┐рдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛-рд╕реНрдерд╛рди рд╡рд╛рддрд╛рд╡рд░рдг рд╡рд╛рд▓рд╛ рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдореБрдЭреЗ рдЖрд╢рд╛рдЬрдирдХ рдирд╣реАрдВ рд▓рдЧрддрд╛ред
рд▓реЗрдХрд┐рди _ioctl рдЖрдкрдХреЛ рдЗрд╕ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЬрдм рдПрдХ рдбрд┐рд╕реНрдХ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдХреБрдЫ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдлрд┐рдЯ рджреЗрдЦрддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдИ рд╕реАрдбреА рд╣реЛрдиреЗ рдХрд╛ рдвреЛрдВрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпрдо рдпрд╣ рд╣реИ: рдпрджрд┐ рдЖрдк рдРрд╕реЗ рдкреНрд░рд╢реНрдиреЛрдВ рдХрд╛ рдЙрддреНрддрд░ рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд╣рд┐рдд рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдмрд╕ рддреНрд░реБрдЯрд┐ рдХреЛрдб -ENOTTY рд▓реМрдЯрд╛рдПрдВред рд╡реИрд╕реЗ, рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдпрд╣рд╛рдВ рдЖрдк рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдбреНрд░рд╛рдЗрд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЬреЛрдбрд╝рд╛ - рд╣рдореЗрдВ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ рдХрд╛ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдВрдЧ
рдпрд╣рд╛рдБ рддреБрдореНрд╣рд╛рд░реЗ
рд▓рд┐рдП рдирд╣реАрдВ
рд╣реИ ред
static void sblkdev_remove_device(void) { sblkdev_device_t* dev = _sblkdev_device; if (dev){ if (dev->disk) del_gendisk(dev->disk); if (dev->queue) { blk_cleanup_queue(dev->queue); dev->queue = NULL; } if (dev->tag_set.tags) blk_mq_free_tag_set(&dev->tag_set); if (dev->disk) { put_disk(dev->disk); dev->disk = NULL; } sblkdev_free_buffer(dev); kfree(dev); _sblkdev_device = NULL; printk(KERN_WARNING "sblkdev: simple block device was removed\n"); } }
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ: рд╣рдо рдбрд┐рд╕реНрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рд╣рдЯрд╛рддреЗ рд╣реИрдВ рдФрд░ рдХрддрд╛рд░ рдХреЛ рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдкрдиреЗ рдмрдлрд╝рд░реНрд╕ (рдбреЗрдЯрд╛ рдХреНрд╖реЗрддреНрд░) рдХреЛ рднреА рдореБрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред
рдФрд░ рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ queue_rq () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдХреНрд╡реЗрд░реА рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧред
static blk_status_t queue_rq(struct blk_mq_hw_ctx *hctx, const struct blk_mq_queue_data* bd) { blk_status_t status = BLK_STS_OK; struct request *rq = bd->rq; blk_mq_start_request(rq);
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдорд╛рдкрджрдВрдбреЛрдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдкрд╣рд▓реА рд╕рдВрд░рдЪрдирд╛ blk_mq_hw_ctx * hctx - рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрддрд╛рд░ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХрддрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЕрдкреНрд░рдпреБрдХреНрддред
рджреВрд╕рд░рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реИ const рд╕рдВрд░рдЪрдирд╛ blk_mq_queue_data * bd - рдмрд╣реБрдд рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╕рдВрд░рдЪрдирд╛ рд╡рд╛рд▓рд╛ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░, рдЬрд┐рд╕реЗ рдореИрдВ рд╕рдВрдкреВрд░реНрдгрддрд╛ рдореЗрдВ рдЖрдкрдХреЗ рдзреНрдпрд╛рди рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╕реЗ рдирд╣реАрдВ рдбрд░рддрд╛:
struct blk_mq_queue_data { struct request *rq; bool last; };
рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ рдХрд┐ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рд╡рд╣реА рдЕрдиреБрд░реЛрдз рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдИ рдмрд╛рд░ рдЖрдпрд╛ рдерд╛ рдХрд┐
рдХреНрд░реЙрд╕рд▓рд░ elixir.bootlin.com рдЕрдм рдпрд╛рдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдо рдЕрдиреБрд░реЛрдз рд▓реЗрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо blk_mq_start_request () рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдиреБрд░реЛрдз рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдкрд░, рд╣рдо рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрд░реНрдиреЗрд▓ рдХреЛ blk_mq_end_request () рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВрдЧреЗред
рдпрд╣рд╛рдБ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдиреЛрдЯ рд╣реИ: blk_mq_end_request () рдлрд╝рдВрдХреНрд╢рди рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ blk_update_request () + __blk_mq_end_request () рдкрд░ рдХреЙрд▓ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд╣реИред Blk_mq_end_request () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдк рдпрд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рдереЗред рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕рдВрд╕рд╛рдзрд┐рдд рд╣реИред
рд╡реИрдХрд▓реНрдкрд┐рдХ рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдПрдХ рдФрд░ рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ: blk_update_request рдлрд╝рдВрдХреНрд╢рди рдХреЗрд╡рд▓ GPL- рдХреЗрд╡рд▓ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдпрджрд┐ рдЖрдк рдПрдХ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рдХрд░реНрдиреЗрд▓ рдореЙрдбреНрдпреВрд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ (рдкреАрдПрдо рдЖрдкрдХреЛ рдЗрд╕ рдХрдВрдЯреАрд▓реЗ рд░рд╛рд╕реНрддреЗ рд╕реЗ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ рдЖрдк blk_update_request () рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рддреЛ рдЪреБрдирд╛рд╡ рдЖрдкрдХрд╛ рд╣реИред
рд╕реАрдзреЗ рдмрд╛рдЗрдЯ рдХреЛ рдмрдлрд╝рд░ рдХреЗ рдЕрдиреБрд░реЛрдз рд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдореИрдВ do_simple_request () рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдбрд╛рд▓ рджреЗрддрд╛ рд╣реВрдВред
static int do_simple_request(struct request *rq, unsigned int *nr_bytes) { int ret = SUCCESS; struct bio_vec bvec; struct req_iterator iter; sblkdev_device_t *dev = rq->q->queuedata; loff_t pos = blk_rq_pos(rq) << SECTOR_SHIFT; loff_t dev_size = (loff_t)(dev->capacity << SECTOR_SHIFT); printk(KERN_WARNING "sblkdev: request start from sector %ld \n", blk_rq_pos(rq)); rq_for_each_segment(bvec, rq, iter) { unsigned long b_len = bvec.bv_len; void* b_buf = page_address(bvec.bv_page) + bvec.bv_offset; if ((pos + b_len) > dev_size) b_len = (unsigned long)(dev_size - pos); if (rq_data_dir(rq))
рдирдпрд╛ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ: rq_for_each_segment рд╕рдм рдХреБрдЫ рдмрд╛рдпреЛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрди рд╕рднреА рдореЗрдВ рдмрд╛рдпреЛрд╡реЗрдХ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ, рдЬреЛ рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреГрд╖реНрдареЛрдВ рдкрд░ рдкрд╣реБрдВрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВред
рдЖрдкрдХреЗ рдЗрдВрдкреНрд░реЗрд╢рди рдХреНрдпрд╛ рд╣реИрдВ? рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ? рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗрд╡рд▓ рдЕрдиреБрд░реЛрдз рдХреЗ рдкреГрд╖реНрдареЛрдВ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдмрдлрд░ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдпреЛрдЧреНрдп рд╣реИ, рд╣реИ рдирд╛?
рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИ:
рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ!рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рд░ рдпрд╣ рд╣реИ рдХрд┐ queue_rq () рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓реВрдк рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рд╕реВрдЪреА рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП рдХреМрди рд╕рд╛ рд▓реЙрдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрдкрд┐рди рдпрд╛ RCU (рдореИрдВ рдЭреВрда рдирд╣реАрдВ рдмреЛрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЬреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рдореБрдЭреЗ рд╕рд╣реА рдХрд░реЗрдВ), рд▓реЗрдХрд┐рди рдЬрдм рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд░реЛрдз рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛рд░реНрдп рдореЗрдВ рдореНрдпреВрдЯреЗрдХреНрд╕, рдбрд┐рдмрдЧрд┐рдВрдЧ рдХрд░реНрдиреЗрд▓ рд╢рдкрде рдФрд░ рдЪреЗрддрд╛рд╡рдиреА: рдбреЛрдЬрд╝ рдпрд╣рд╛рдБ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИред рдпрд╣реА рд╣реИ, рдкрд╛рд░рдВрдкрд░рд┐рдХ рддреБрд▓реНрдпрдХрд╛рд▓рди рдЙрдкрдХрд░рдг рдпрд╛ рдЖрднрд╛рд╕реА рд╕рдиреНрдирд┐рд╣рд┐рдд рд╕реНрдореГрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ - рдЬреЛ рдХрд┐ vmalloc рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╕рднреА рдХреЗ рд╕рд╛рде рд╕реНрд╡реИрдк рдореЗрдВ рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдпрд╣ рдЕрд╕рдВрднрд╡ рд╣реИ - рдЪреВрдВрдХрд┐ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реНрдЯреИрдВрдбрдмрд╛рдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддреА рд╣реИред
рдЗрд╕рд▓рд┐рдП, рдпрд╛ рддреЛ рдХреЗрд╡рд▓ рд╕реНрдкрд┐рди рдпрд╛ RCU рд▓реЙрдХ рдФрд░ рдкреГрд╖реНрдареЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдмрдлрд░, рдпрд╛ рдПрдХ рд╕реВрдЪреА, рдпрд╛ рдПрдХ рдкреЗрдбрд╝, рдХреЗ рд░реВрдк рдореЗрдВ .. \ linux \ driver \ block \ brd.c рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛, рдпрд╛ рдПрдХ рдФрд░ рдзрд╛рдЧреЗ рдореЗрдВ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рджреЗрд░реА, рдЬреИрд╕рд╛ рдХрд┐ .. рдореЗрдВ рд▓рд╛рдЧреВ \ linux \ рдбреНрд░рд╛рдЗрд╡рд░ \ block \ loop.c.
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЙрдбреНрдпреВрд▓ рдХреЛ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИ, рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХреИрд╕реЗ рд▓реЛрдб рдХрд░рдирд╛ рд╣реИ рдФрд░ рдХреИрд╕реЗ рдЕрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реИ, рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдореЛрд░реНрдЪреЗ рдкрд░ рдХреЛрдИ рдирдП рдЙрддреНрдкрд╛рдж рдирд╣реАрдВ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж :) рддреЛ рдЕрдЧрд░ рдХреЛрдИ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рддреЛ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рдЬрд╝рд░реВрд░реА рд╣реИред
рдмрд╕ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд▓реИрдкрдЯреЙрдк рдкрд░ рдЗрд╕реЗ рдЕрднреА рдордд рдХрд░реЛ! рдПрдХ рд╡рд░реНрдЪреБрдЕрд▓реЛрдХрд╛ рдЙрдард╛рдПрдВ рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдЧреЗрдВрдж рдкрд░ рдмреИрдХрдЕрдк рдмрдирд╛рдПрдВред
рд╡реИрд╕реЗ, рд▓рд┐рдирдХреНрд╕ 3.0.1.1046 рдХреЗ рд▓рд┐рдП рд╡реАрдо рдмреИрдХрдЕрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдкрд▓рдмреНрдз рд╣реИред рдмрд╕ рдПрдХ рдХрд░реНрдиреЗрд▓ 5.0 рдпрд╛ рдмрд╛рдж рдореЗрдВ рд╡реИрд▓ 3.0.1.1046 рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рди рдХрд░реЗрдВред veeamsnap рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдФрд░ рдХреБрдЫ рдмрд╣реБ-рдХрддрд╛рд░ рдирд╡рд╛рдЪрд╛рд░ рдЕрднреА рднреА рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕реНрддрд░ рдкрд░ рд╣реИрдВред