0

Может ли кто-нибудь помочь мне в понимании разницы между «DECLARE_COMPLETION_ONSTACK» и static (DECLARE_COMPLETION (comp)) или динамической инициализацией?Функция DECLARE_COMPLETION_ONSTACK в ядре linux

Я нашел некоторые ссылки, как показано ниже (http://lxr.free-electrons.com/source/drivers/spi/spidev.c#L110):

110 spidev_sync(struct spidev_data *spidev, struct spi_message *message) 
111 { 
112   DECLARE_COMPLETION_ONSTACK(done); 
113   int status; 
114 
115   message->complete = spidev_complete; 
116   message->context = &done; 
117 
118   spin_lock_irq(&spidev->spi_lock); 
119   if (spidev->spi == NULL) 
120     status = -ESHUTDOWN; 
121   else 
122     status = spi_async(spidev->spi, message); 
123   spin_unlock_irq(&spidev->spi_lock); 
124 
125   if (status == 0) { 
126     wait_for_completion(&done); 
127     status = message->status; 
128     if (status == 0) 
129       status = message->actual_length; 
130   } 
131   return status; 
132 } 

Выглядит как здесь его ожидания до spi_sync() функция будет завершена, у меня есть несколько запросов в понимании функции выше

2: это значит, эта функция не очень Параллельное? (так как эта переменная завершающие навязывает вид сериализации)

BR, & Шридхару

ответ

0

Не имеет значения, если LOCK_DEP не включен.

Он полезен только для функций отладки блокировки.

Смотрите ниже код ядра,

47/* 
48 * Lockdep needs to run a non-constant initializer for on-stack 
49 * completions - so we use the _ONSTACK() variant for those that 
50 * are on the kernel stack: 
51 */ 

59#ifdef CONFIG_LOCKDEP 
60# define DECLARE_COMPLETION_ONSTACK(work) \ 
61 struct completion work = COMPLETION_INITIALIZER_ONSTACK(work) 
62#else 
63# define DECLARE_COMPLETION_ONSTACK(work) DECLARE_COMPLETION(work) 
64#endif 
Смежные вопросы