Merge branch 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull locking changes from Ingo Molnar: "Four miscellanous standalone fixes for futexes, rtmutexes and Kconfig.locks." * 'core-locking-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: futex: Use freezable blocking call futex: Take hugepages into account when generating futex_key rtmutex: Document rt_mutex_adjust_prio_chain() locking: Fix copy/paste errors of "ARCH_INLINE_*_UNLOCK_BH"
This commit is contained in:
commit
3e42dee676
5 changed files with 53 additions and 5 deletions
|
@ -358,6 +358,17 @@ static inline int hstate_index(struct hstate *h)
|
|||
return h - hstates;
|
||||
}
|
||||
|
||||
pgoff_t __basepage_index(struct page *page);
|
||||
|
||||
/* Return page->index in PAGE_SIZE units */
|
||||
static inline pgoff_t basepage_index(struct page *page)
|
||||
{
|
||||
if (!PageCompound(page))
|
||||
return page->index;
|
||||
|
||||
return __basepage_index(page);
|
||||
}
|
||||
|
||||
#else /* CONFIG_HUGETLB_PAGE */
|
||||
struct hstate {};
|
||||
#define alloc_huge_page_node(h, nid) NULL
|
||||
|
@ -378,6 +389,11 @@ static inline unsigned int pages_per_huge_page(struct hstate *h)
|
|||
}
|
||||
#define hstate_index_to_shift(index) 0
|
||||
#define hstate_index(h) 0
|
||||
|
||||
static inline pgoff_t basepage_index(struct page *page)
|
||||
{
|
||||
return page->index;
|
||||
}
|
||||
#endif /* CONFIG_HUGETLB_PAGE */
|
||||
|
||||
#endif /* _LINUX_HUGETLB_H */
|
||||
|
|
|
@ -138,7 +138,7 @@ config INLINE_SPIN_UNLOCK_BH
|
|||
|
||||
config INLINE_SPIN_UNLOCK_IRQ
|
||||
def_bool y
|
||||
depends on !PREEMPT || ARCH_INLINE_SPIN_UNLOCK_BH
|
||||
depends on !PREEMPT || ARCH_INLINE_SPIN_UNLOCK_IRQ
|
||||
|
||||
config INLINE_SPIN_UNLOCK_IRQRESTORE
|
||||
def_bool y
|
||||
|
@ -175,7 +175,7 @@ config INLINE_READ_UNLOCK_BH
|
|||
|
||||
config INLINE_READ_UNLOCK_IRQ
|
||||
def_bool y
|
||||
depends on !PREEMPT || ARCH_INLINE_READ_UNLOCK_BH
|
||||
depends on !PREEMPT || ARCH_INLINE_READ_UNLOCK_IRQ
|
||||
|
||||
config INLINE_READ_UNLOCK_IRQRESTORE
|
||||
def_bool y
|
||||
|
@ -212,7 +212,7 @@ config INLINE_WRITE_UNLOCK_BH
|
|||
|
||||
config INLINE_WRITE_UNLOCK_IRQ
|
||||
def_bool y
|
||||
depends on !PREEMPT || ARCH_INLINE_WRITE_UNLOCK_BH
|
||||
depends on !PREEMPT || ARCH_INLINE_WRITE_UNLOCK_IRQ
|
||||
|
||||
config INLINE_WRITE_UNLOCK_IRQRESTORE
|
||||
def_bool y
|
||||
|
|
|
@ -61,6 +61,8 @@
|
|||
#include <linux/nsproxy.h>
|
||||
#include <linux/ptrace.h>
|
||||
#include <linux/sched/rt.h>
|
||||
#include <linux/hugetlb.h>
|
||||
#include <linux/freezer.h>
|
||||
|
||||
#include <asm/futex.h>
|
||||
|
||||
|
@ -365,7 +367,7 @@ again:
|
|||
} else {
|
||||
key->both.offset |= FUT_OFF_INODE; /* inode-based key */
|
||||
key->shared.inode = page_head->mapping->host;
|
||||
key->shared.pgoff = page_head->index;
|
||||
key->shared.pgoff = basepage_index(page);
|
||||
}
|
||||
|
||||
get_futex_key_refs(key);
|
||||
|
@ -1807,7 +1809,7 @@ static void futex_wait_queue_me(struct futex_hash_bucket *hb, struct futex_q *q,
|
|||
* is no timeout, or if it has yet to expire.
|
||||
*/
|
||||
if (!timeout || timeout->task)
|
||||
schedule();
|
||||
freezable_schedule();
|
||||
}
|
||||
__set_current_state(TASK_RUNNING);
|
||||
}
|
||||
|
|
|
@ -145,6 +145,19 @@ int max_lock_depth = 1024;
|
|||
/*
|
||||
* Adjust the priority chain. Also used for deadlock detection.
|
||||
* Decreases task's usage by one - may thus free the task.
|
||||
*
|
||||
* @task: the task owning the mutex (owner) for which a chain walk is probably
|
||||
* needed
|
||||
* @deadlock_detect: do we have to carry out deadlock detection?
|
||||
* @orig_lock: the mutex (can be NULL if we are walking the chain to recheck
|
||||
* things for a task that has just got its priority adjusted, and
|
||||
* is waiting on a mutex)
|
||||
* @orig_waiter: rt_mutex_waiter struct for the task that has just donated
|
||||
* its priority to the mutex owner (can be NULL in the case
|
||||
* depicted above or if the top waiter is gone away and we are
|
||||
* actually deboosting the owner)
|
||||
* @top_task: the current top waiter
|
||||
*
|
||||
* Returns 0 or -EDEADLK.
|
||||
*/
|
||||
static int rt_mutex_adjust_prio_chain(struct task_struct *task,
|
||||
|
|
17
mm/hugetlb.c
17
mm/hugetlb.c
|
@ -690,6 +690,23 @@ int PageHuge(struct page *page)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(PageHuge);
|
||||
|
||||
pgoff_t __basepage_index(struct page *page)
|
||||
{
|
||||
struct page *page_head = compound_head(page);
|
||||
pgoff_t index = page_index(page_head);
|
||||
unsigned long compound_idx;
|
||||
|
||||
if (!PageHuge(page_head))
|
||||
return page_index(page);
|
||||
|
||||
if (compound_order(page_head) >= MAX_ORDER)
|
||||
compound_idx = page_to_pfn(page) - page_to_pfn(page_head);
|
||||
else
|
||||
compound_idx = page - page_head;
|
||||
|
||||
return (index << compound_order(page_head)) + compound_idx;
|
||||
}
|
||||
|
||||
static struct page *alloc_fresh_huge_page_node(struct hstate *h, int nid)
|
||||
{
|
||||
struct page *page;
|
||||
|
|
Loading…
Reference in a new issue