Chinese translated version of Documentation/driver-api/io_ordering.rst If you have any comment or update to the content, please contact the original document maintainer directly. However, if you have a problem communicating in English you can also ask the Chinese maintainer for help. Contact the Chinese maintainer if this translation is outdated or if there is a problem with the translation. Chinese maintainer: Lin Yongting <linyongting@gmail.com> --------------------------------------------------------------------- Documentation/driver-api/io_ordering.rst çš„ä¸æ–‡ç¿»è¯‘ 如果想评论或更新本文的内容,请直接è”ç³»åŽŸæ–‡æ¡£çš„ç»´æŠ¤è€…ã€‚å¦‚æžœä½ ä½¿ç”¨è‹±æ–‡ äº¤æµæœ‰å›°éš¾çš„è¯ï¼Œä¹Ÿå¯ä»¥å‘䏿–‡ç‰ˆç»´æŠ¤è€…求助。如果本翻译更新ä¸åŠæ—¶æˆ–者翻 译å˜åœ¨é—®é¢˜ï¼Œè¯·è”ç³»ä¸æ–‡ç‰ˆç»´æŠ¤è€…。 䏿–‡ç‰ˆç»´æŠ¤è€…: æž—æ°¸å¬ Lin Yongting <linyongting@gmail.com> 䏿–‡ç‰ˆç¿»è¯‘者: æž—æ°¸å¬ Lin Yongting <linyongting@gmail.com> 䏿–‡ç‰ˆæ ¡è¯‘者: æž—æ°¸å¬ Lin Yongting <linyongting@gmail.com> ä»¥ä¸‹ä¸ºæ£æ–‡ --------------------------------------------------------------------- 在æŸäº›å¹³å°ä¸Šï¼Œæ‰€è°“çš„å†…å˜æ˜ å°„I/O是弱顺åºã€‚在这些平å°ä¸Šï¼Œé©±åЍ开å‘者有责任 ä¿è¯I/Oå†…å˜æ˜ 射地å€çš„写æ“作按程åºå›¾æ„的顺åºè¾¾åˆ°è®¾å¤‡ã€‚通常读å–一个“安全†设备寄å˜å™¨æˆ–桥寄å˜å™¨ï¼Œè§¦å‘IO芯片清刷未处ç†çš„写æ“ä½œåˆ°è¾¾è®¾å¤‡åŽæ‰å¤„ç†è¯»æ“作, 而达到ä¿è¯ç›®çš„。驱动程åºé€šå¸¸åœ¨spinlockä¿æŠ¤çš„ä¸´ç•ŒåŒºé€€å‡ºä¹‹å‰ä½¿ç”¨è¿™ç§æŠ€æœ¯ã€‚ 这也å¯ä»¥ä¿è¯åŽé¢çš„写æ“作åªåœ¨å‰é¢çš„写æ“作之åŽåˆ°è¾¾è®¾å¤‡ï¼ˆè¿™éžå¸¸ç±»ä¼¼äºŽå†…å˜ å±éšœæ“ä½œï¼Œmb(),ä¸è¿‡ä»…适用于I/O)。 å‡è®¾ä¸€ä¸ªè®¾å¤‡é©±åŠ¨ç¨‹çš„å…·ä½“ä¾‹å: ... CPU A: spin_lock_irqsave(&dev_lock, flags) CPU A: val = readl(my_status); CPU A: ... CPU A: writel(newval, ring_ptr); CPU A: spin_unlock_irqrestore(&dev_lock, flags) ... CPU B: spin_lock_irqsave(&dev_lock, flags) CPU B: val = readl(my_status); CPU B: ... CPU B: writel(newval2, ring_ptr); CPU B: spin_unlock_irqrestore(&dev_lock, flags) ... 上述例åä¸ï¼Œè®¾å¤‡å¯èƒ½ä¼šå…ˆæŽ¥æ”¶åˆ°newval2çš„å€¼ï¼Œç„¶åŽæŽ¥æ”¶åˆ°newval的值,问题就 å‘生了。ä¸è¿‡å¾ˆå®¹æ˜“é€šè¿‡ä¸‹é¢æ–¹æ³•æ¥ä¿®å¤ï¼š ... CPU A: spin_lock_irqsave(&dev_lock, flags) CPU A: val = readl(my_status); CPU A: ... CPU A: writel(newval, ring_ptr); CPU A: (void)readl(safe_register); /* é…置寄å˜å™¨ï¼Ÿ*/ CPU A: spin_unlock_irqrestore(&dev_lock, flags) ... CPU B: spin_lock_irqsave(&dev_lock, flags) CPU B: val = readl(my_status); CPU B: ... CPU B: writel(newval2, ring_ptr); CPU B: (void)readl(safe_register); /* é…置寄å˜å™¨ï¼Ÿ*/ CPU B: spin_unlock_irqrestore(&dev_lock, flags) 在解决方案ä¸ï¼Œè¯»å–safe_register寄å˜å™¨ï¼Œè§¦å‘IO芯片清刷未处ç†çš„写æ“作, å†å¤„ç†åŽé¢çš„读æ“作,防æ¢å¼•呿•°æ®ä¸ä¸€è‡´é—®é¢˜ã€‚