Освобождение страниц буферов блочных устройств
страницы буферов блочных устройств освобождаются, когда ядро пытается получить в свое распоряжение дополнительную свободную память. Очевидно, что страницу нельзя освободить, если она содержит грязные” или заблокированные буферы. Чтобы освободить страницы буферов, ядро вызывает функцию try_to_reiease_page, которая принимает адрес раде дескриптора страницы и выполняет следующие действия3:
1. Если флаг PG writeback установлен, функция возвращает 0 (освобождение невозможно, поскольку страница в этот момент записывается обратно на диск).
2. Вызывает метод reieasepage объекта address space данного блочного устройства, если этот метод определен. (Как правило, для блочных устройств он не определен.)
3. Вызывает функцию try to free buffers о и выдает код возврата, полученный от нее.
Что касается функции try to free buffers , она перебирает головы буферов, связанные со страницей, и выполняет следующие действия:
1. Проверяет флаги всех голов буферов, входящих в страницу. Если у какой- то головы буфера установлен флаг BH Dirty или BH Locked, функция завершает работу, возвращая 0 (неудача), поскольку освободить буферы невозможно.
2. Если голова буфера находится в списке косвенных буферов 3. Сбрасывает флаг PG private дескриптора страницы, записывает в поле private значение null и уменьшает счетчик обращений страницы.
4. Сбрасывает флаг страницы PG dirty.
5. Многократно вызывает функцию free buffer heado, чтобы освободить все головы буферов этой страницы.
6. Возвращает 1 (успех).
Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница