> From: Matt Evans <matt(a)ozlabs.org>
> Sent: Wednesday, June 10, 2026 11:43 PM
>
> The P2PDMA code currently provides two features under the same
> CONFIG_PCI_P2PDMA option:
>
> 1. Locate providers via pcim_p2pdma_provider()
> 2. Manage actual P2P DMA
>
> Some drivers (such as vfio-pci) depend on 1, without having a hard
> dependency on 2.
>
> A future commit expands the use of DMABUF in vfio-pci for non-P2P
> scenarios, relying on pcim_p2pdma_provider() always being present. If
> that depended on CONFIG_PCI_P2PDMA, it would make vfio-pci only
> available if CONFIG_ZONE_DEVICE is present (e.g. 64-bit systems), even
> when P2P is not needed.
>
> To resolve this, introduce CONFIG_PCI_P2PDMA_CORE and refactor the
> basic provider functionality into a new p2pdma_core.c file. This is
> available even if the CONFIG_PCI_P2PDMA feature is disabled (or
> unavailable due to !CONFIG_ZONE_DEVICE). Then, drivers can enable any
> additional P2P features with the original CONFIG_PCI_P2PDMA (available
> when CONFIG_ZONE_DEVICE is set).
>
> Signed-off-by: Matt Evans <matt(a)ozlabs.org>
Reviewed-by: Kevin Tian <kevin.tian(a)intel.com>
One of monkey mart ( https://martgames.io/ )'s most compelling aspects is how the player's role evolves over time. Initially, almost every task must be performed manually; players constantly move between areas to harvest crops, restock shelves, and serve customers. However, as the store grows, they gain the opportunity to hire staff and build a more efficient operational system. At this point, the player's role shifts from hands-on worker to supervisor of the entire operation. This transition provides a tangible sense of progress. Watching employees automatically handle tasks while the store runs smoothly offers a unique sense of satisfaction, allowing players to focus more on strategic decisions rather than just day-to-day chores. This keeps the experience dynamic and prevents it from feeling repetitive. Building a self-sustaining system is one of the game's greatest achievements; it is precisely this element that gives monkey mart a depth that goes beyond its cute exterior.
Once a certain amount of revenue has been accumulated, players face a variety of upgrade options. This is the stage where monkey mart truly showcases the depth of its design. Rather than simply boosting stats or unlocking new content, each upgrade alters the way the store functions. Players can invest in production speed, transport capacity, staff efficiency, or business expansion. Each path offers distinct benefits and suits different management styles, making every player's journey unique. Players must carefully weigh their options to make decisions that align with the store's current situation. Sound choices can accelerate business growth, whereas ill-considered decisions may hinder operational efficiency. It is this element that creates the authentic feeling of running a real business. Monkey mart does not force players down a fixed path but instead allows them to devise their own strategies—a key factor in the game's enduring appeal.
A key strength of speedstars ( https://speed-starsgame.com ) is its ability to strip away unnecessary elements and focus entirely on the core experience. The interface is clean and intuitive, presenting vital information clearly without visual clutter. Players can quickly track their performance, timing, and results after every race. The racing environment is minimalist yet effectively captures the atmosphere of a professional track meet. This simplicity allows players to focus on their skills rather than being distracted by extraneous elements. By keeping the race and the athletic experience at the forefront, the game fosters a sense of authenticity and serious competition. Players aren't bogged down by complex secondary systems, allowing them to concentrate fully on improving their performance—a smart design choice that contributes significantly to the success of speedstars. Sometimes, simplicity is the very factor that gives a game lasting appeal.
Unlike games where players grow stronger by unlocking gear or upgrading characters, speedstars focuses entirely on the development of personal skill. Better results stem not from boosted stats, but from hours of practice and accumulated experience. With every race, players learn to optimize their movements, maintain consistency, and handle pressure more effectively. This is a tangible and clearly visible process of growth; looking back at past records, players can plainly see how much they have improved over time. This fosters a unique sense of pride, as every achievement is the fruit of personal effort. The game encourages players to set new goals and relentlessly pursue them, giving meaning to even the smallest steps forward. It is this dynamic that sustains player engagement over the long term—a key factor in the game's enduring value.
Space Waves ( https://spacewavesgame.io )' straightforward visual design, which is characterized by simple forms and lines, first strikes the eye. On closer inspection, however, it becomes clear that this austerity is quite deliberate. The game emphasizes color, lighting, and movement to create a contemporary atmosphere rather than depending on intricate models or excessively detailed landscapes. A mysterious and alluring ambiance is created by light beams emanating from space objects. Players can simply explore the world while keeping a high level of visual appeal thanks to neon colors that stand out against dark backdrops. Despite the simple visual structure, the experience is dynamic since each level resembles a work of digital art that is always moving in front of the player's eyes. In addition to being aesthetically pleasing, the visual design helps players concentrate on the most important aspects of the game. It is a perfect illustration of how simple design can yet have a strong appeal; in fact, the game's distinctive visual identity helps it stand out in a crowded field of similar games.
The capacity of space waves to force players to try again right away after a failure is one of its most notable characteristics. Repetitive failure in many other games may cause irritation or demotivation. On the other hand, space waves are made such that each error teaches a particular lesson. Players are able to pinpoint the reason for their failure and understand that they can do better the following time. Because there is little time between retries, the gaming pace is maintained, which keeps players engaged and motivates them to keep improving. There's a noticeable feeling of accomplishment when you go even a little bit further than before, and parts that were difficult at first became easier to go through. This method of skill development is both organic and very successful. Space Waves effectively cultivates the idea that any obstacle can be overcome with enough perseverance—a feature that contributes to the game's lasting appeal.
On Wed, Jun 10, 2026 at 04:43:20PM +0100, Matt Evans wrote:
> Previously, vfio_pci_zap_bars() (and the wrapper
> vfio_pci_zap_and_down_write_memory_lock()) calls were paired with
> calls to vfio_pci_dma_buf_move().
>
> This commit replaces them with a unified new function,
> vfio_pci_zap_revoke_bars() containing both the vfio_pci_dma_buf_move()
> and the unmap_mapping_range(), making it harder for callers to omit
> one. It adds a wrapper, vfio_pci_lock_zap_revoke_bars(), which takes
> the write memory_lock before zapping, and adds a new
> vfio_pci_unrevoke_bars() for the re-enable path.
>
> As of "vfio/pci: Convert BAR mmap() to use a DMABUF", the
> unmap_mapping_range() to zap is no longer performed for vfio-pci since
> the DMABUFs used for BAR mappings already zap PTEs when the
> vfio_pci_dma_buf_move() occurs.
>
> However, it must be assumed that VFIO drivers which override the .mmap
> op could create mappings _not_ backed by DMABUFs. So, the zap is
> still performed on revoke if .mmap is overridden, using a new
> zap_bars_on_revoke flag. A driver can explicitly opt out; the flag is
> cleared by the hisi_acc_vfio_pci driver, since its .mmap just wraps
> vfio_pci_core_mmap() and so still uses DMABUFs.
>
> Signed-off-by: Matt Evans <matt(a)ozlabs.org>
> ---
> .../vfio/pci/hisilicon/hisi_acc_vfio_pci.c | 8 +++
> drivers/vfio/pci/vfio_pci_config.c | 30 ++++----
> drivers/vfio/pci/vfio_pci_core.c | 70 +++++++++++++------
> drivers/vfio/pci/vfio_pci_priv.h | 3 +-
> include/linux/vfio_pci_core.h | 1 +
> 5 files changed, 73 insertions(+), 39 deletions(-)
>
> diff --git a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> index 86362ec424a5..51990f6d66d5 100644
> --- a/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> +++ b/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c
> @@ -1692,6 +1692,14 @@ static int hisi_acc_vfio_pci_probe(struct pci_dev *pdev, const struct pci_device
> if (ret)
> goto out_put_vdev;
>
> + /*
> + * hisi_acc_vfio_pci_mmap() calls down to
> + * vfio_pci_core_mmap(), so BAR mappings are still
> + * DMABUF-backed. They don't require a zap on revoke, so opt
> + * out:
> + */
> + hisi_acc_vdev->core_device.zap_bars_on_revoke = false;
> +
This seems to be happening after we vfio_pci_core_register_device, which
could be slightly problematic if another device in the same group races
to trigger a hot reset before we can set this to false. Could we
initialize this flag before registration instead?
> hisi_acc_vfio_debug_init(hisi_acc_vdev);
> return 0;
>
> diff --git a/drivers/vfio/pci/vfio_pci_config.c b/drivers/vfio/pci/vfio_pci_config.c
> index a10ed733f0e3..8bfab0da481c 100644
> --- a/drivers/vfio/pci/vfio_pci_config.c
> +++ b/drivers/vfio/pci/vfio_pci_config.c
> @@ -590,12 +590,10 @@ static int vfio_basic_config_write(struct vfio_pci_core_device *vdev, int pos,
> virt_mem = !!(le16_to_cpu(*virt_cmd) & PCI_COMMAND_MEMORY);
> new_mem = !!(new_cmd & PCI_COMMAND_MEMORY);
>
> - if (!new_mem) {
> - vfio_pci_zap_and_down_write_memory_lock(vdev);
> - vfio_pci_dma_buf_move(vdev, true);
> - } else {
> + if (!new_mem)
> + vfio_pci_lock_zap_revoke_bars(vdev);
> + else
> down_write(&vdev->memory_lock);
> - }
>
> /*
> * If the user is writing mem/io enable (new_mem/io) and we
> @@ -631,7 +629,7 @@ static int vfio_basic_config_write(struct vfio_pci_core_device *vdev, int pos,
> *virt_cmd |= cpu_to_le16(new_cmd & mask);
>
> if (__vfio_pci_memory_enabled(vdev))
> - vfio_pci_dma_buf_move(vdev, false);
> + vfio_pci_unrevoke_bars(vdev);
> up_write(&vdev->memory_lock);
> }
>
> @@ -712,16 +710,14 @@ static int __init init_pci_cap_basic_perm(struct perm_bits *perm)
> static void vfio_lock_and_set_power_state(struct vfio_pci_core_device *vdev,
> pci_power_t state)
> {
> - if (state >= PCI_D3hot) {
> - vfio_pci_zap_and_down_write_memory_lock(vdev);
> - vfio_pci_dma_buf_move(vdev, true);
> - } else {
> + if (state >= PCI_D3hot)
> + vfio_pci_lock_zap_revoke_bars(vdev);
> + else
> down_write(&vdev->memory_lock);
> - }
>
> vfio_pci_set_power_state(vdev, state);
> if (__vfio_pci_memory_enabled(vdev))
> - vfio_pci_dma_buf_move(vdev, false);
> + vfio_pci_unrevoke_bars(vdev);
> up_write(&vdev->memory_lock);
> }
>
> @@ -908,11 +904,10 @@ static int vfio_exp_config_write(struct vfio_pci_core_device *vdev, int pos,
> &cap);
>
> if (!ret && (cap & PCI_EXP_DEVCAP_FLR)) {
> - vfio_pci_zap_and_down_write_memory_lock(vdev);
> - vfio_pci_dma_buf_move(vdev, true);
> + vfio_pci_lock_zap_revoke_bars(vdev);
> pci_try_reset_function(vdev->pdev);
> if (__vfio_pci_memory_enabled(vdev))
> - vfio_pci_dma_buf_move(vdev, false);
> + vfio_pci_unrevoke_bars(vdev);
> up_write(&vdev->memory_lock);
> }
> }
> @@ -993,11 +988,10 @@ static int vfio_af_config_write(struct vfio_pci_core_device *vdev, int pos,
> &cap);
>
> if (!ret && (cap & PCI_AF_CAP_FLR) && (cap & PCI_AF_CAP_TP)) {
> - vfio_pci_zap_and_down_write_memory_lock(vdev);
> - vfio_pci_dma_buf_move(vdev, true);
> + vfio_pci_lock_zap_revoke_bars(vdev);
> pci_try_reset_function(vdev->pdev);
> if (__vfio_pci_memory_enabled(vdev))
> - vfio_pci_dma_buf_move(vdev, false);
> + vfio_pci_unrevoke_bars(vdev);
> up_write(&vdev->memory_lock);
> }
> }
> diff --git a/drivers/vfio/pci/vfio_pci_core.c b/drivers/vfio/pci/vfio_pci_core.c
> index f9636d8f9e2a..5ea0bd4e7876 100644
> --- a/drivers/vfio/pci/vfio_pci_core.c
> +++ b/drivers/vfio/pci/vfio_pci_core.c
> @@ -319,8 +319,7 @@ static int vfio_pci_runtime_pm_entry(struct vfio_pci_core_device *vdev,
> * The vdev power related flags are protected with 'memory_lock'
> * semaphore.
> */
> - vfio_pci_zap_and_down_write_memory_lock(vdev);
> - vfio_pci_dma_buf_move(vdev, true);
> + vfio_pci_lock_zap_revoke_bars(vdev);
>
> if (vdev->pm_runtime_engaged) {
> up_write(&vdev->memory_lock);
> @@ -406,7 +405,7 @@ static void vfio_pci_runtime_pm_exit(struct vfio_pci_core_device *vdev)
> down_write(&vdev->memory_lock);
> __vfio_pci_runtime_pm_exit(vdev);
> if (__vfio_pci_memory_enabled(vdev))
> - vfio_pci_dma_buf_move(vdev, false);
> + vfio_pci_unrevoke_bars(vdev);
> up_write(&vdev->memory_lock);
> }
>
> @@ -1256,6 +1255,8 @@ static int vfio_pci_ioctl_set_irqs(struct vfio_pci_core_device *vdev,
> return ret;
> }
>
> +static void vfio_pci_zap_revoke_bars(struct vfio_pci_core_device *vdev);
> +
> static int vfio_pci_ioctl_reset(struct vfio_pci_core_device *vdev,
> void __user *arg)
> {
> @@ -1264,7 +1265,7 @@ static int vfio_pci_ioctl_reset(struct vfio_pci_core_device *vdev,
> if (!vdev->reset_works)
> return -EINVAL;
>
> - vfio_pci_zap_and_down_write_memory_lock(vdev);
> + down_write(&vdev->memory_lock);
>
> /*
> * This function can be invoked while the power state is non-D0. If
> @@ -1277,10 +1278,11 @@ static int vfio_pci_ioctl_reset(struct vfio_pci_core_device *vdev,
> */
> vfio_pci_set_power_state(vdev, PCI_D0);
>
> - vfio_pci_dma_buf_move(vdev, true);
> + vfio_pci_zap_revoke_bars(vdev);
I'm wondering if this change in behavior is correct?
BEFORE this patch the sequence was:
1. zap vma mappings
2. Enter D0
After this patch the sequence becomes
1. Take the lock
2. Enter D0
3. zap vma mappings
My worry is if user-space accesses a BAR *during* the transition to D0,
it could crash since the mappings still exist during the transition?
The old code is immune to it because it removed user-mappings first.
Following the discussion from v1 regarding the ordering of
vfio_pci_dma_buf_move() and the D0 transition.. while it makes sense to
perform the DMABUF revocation/move after the hardware is in D0.. I'm not
too confident about moving zap after D0 :/
I mean, sure, the user would just see all Fs on a read and writes will
be dropped silently until we are in D0.. but the behaviour before this
change was that the user access will fault and hang on the memory_lock
instead which ensures that the user observes a consistent dev state..
> +
> ret = pci_try_reset_function(vdev->pdev);
> if (__vfio_pci_memory_enabled(vdev))
> - vfio_pci_dma_buf_move(vdev, false);
> + vfio_pci_unrevoke_bars(vdev);
> up_write(&vdev->memory_lock);
>
> return ret;
> @@ -1648,20 +1650,37 @@ ssize_t vfio_pci_core_write(struct vfio_device *core_vdev, const char __user *bu
> }
Thanks,
Praan
Buy real and fake passport online, Buy ID cards online, (WhatsApp : +49 1575 3756974) Buy driving license, Buy drivers license online, Buy passport online, Buy green card, residence permit, IELT, work permit, citizenship, buy Canadian resident permits, 购买香港护照 (微信:Scottbowers44) 购买中国护照 購買韓國護照 購買正品日本護照 購買正品美國護照 購買台灣護照 購買泰國護照, 購買正品波蘭護照, 購買正品澳洲護照, 購買正品英國護照, 購買正品加拿大護照, 購買正品挪威護照, 在線購買真正的馬來西亞護照, 購買正品法國護照, 購買正品捷克護照, 購買正品巴西護照, 購買正品愛沙尼亞護照, 購買真假身分證, WhatsApp:+49 1575 3756974 購買台灣身分證, 購買台灣駕照, 購買泰國駕駛執照, 購買泰國身分證, 購買真假簽證, 購買假美元, 購買假CYN, 購買假澳幣, 購買真護照或假護照, 購買真假駕照, 購買真假身分證 (微信:Scottbowers44)
如何在线购买欧盟护照
何在家合法获取正版德国护照
购买正版韩国护照
轻松获得欧盟签证
Buy real and fake passport
在线购买真假护照
购买真正的美国/英国/中国护照
购买真假护照,在线购买护照,购买美国护照
Buy real and fake passport
Buy real and fake passport
Buy real or fake passports online
Buy Chinese passport
在线购买护照
在线购买荷兰护照
如何在家合法获取正版德国护照
如何在线购买欧盟护照
如何购买正版美国护照 2026
购买来自亚洲国家的真实护照
购买正版中国护照
购买正版韩国护照
购买真正的加拿大护照
购买英国原版护照
在线购买真假护照
购买中国护照
在线办理签证
在线购买护照
在线购买澳大利亚护照
在线购买真正的注册驾驶执照
购买中国护照
购买假护照
购买假驾照
购买出生证明原件
购买居留许可
购买澳大利亚驾驶执照
购买真假护照,在线购买护照,购买美国护照
购买真正的美国/英国/中国护照
购买美国驾驶执照
购买英国护照
You can buy an EU driver's license in 3 days
Buying a driver's license in Asia
Buy a Danish driver's license
Purchase a genuine Canadian driver's license
Buy an Austrian driver's license
Purchase a registered Italian driver's license
Purchase a registered Polish driver's license
Purchase a genuine US driver's license
Buy a Swiss driver's license
Purchase a driver's license
Canadian residence permit
Can obtain an Asian residency permit
Italian residence permit
EU residence permit
Purchase a genuine US green card
Purchase a Swedish residence permit
在线购买护照
在线购买荷兰护照
如何在家合法获取正版德国护照
如何在线购买欧盟护照
如何购买正版美国护照 2026
There's something uniquely satisfying about a perfectly executed drift. The screech of tires, the controlled chaos, the feeling of defying physics – it’s a thrill that transcends mere driving. While the real world offers expensive consequences for such maneuvers, the virtual world provides a safe and incredibly fun playground. Today, we're diving into the exciting world of Drift Hunters, a game that puts the art of the sideways slide squarely in your hands.
Drift Hunters isn't just a racing game; it's a celebration of precision and style. Unlike traditional circuit racers where speed is king, here, points are awarded for maintaining drifts, linking corners, and generally looking cool while doing it. It’s a game that’s easy to pick up but surprisingly deep, offering hours of addictive gameplay for anyone who enjoys the smell of burning virtual rubber.
https://drifthuntersfree.com
The Core Gameplay Loop: A Dance with Momentum
At its heart, Drift Hunters is all about earning points through controlled skids. You'll start with a basic car and a handful of tracks, each designed with sweeping corners and open areas perfect for initiating and maintaining drifts.
Controls are intuitive and responsive:
Arrow keys or WASD: Control your steering. A light touch is often more effective than aggressive sawing at the wheel, especially during a drift.
Spacebar: This is your handbrake, a crucial tool for initiating drifts, especially at lower speeds or when you need to quickly change direction.
Shift key: For those with manual transmission enabled (an advanced option), this is your upshift.
Ctrl key: Your downshift.
The magic happens when you combine these inputs. Approach a corner, tap the handbrake or flick the wheel while applying throttle, and then counter-steer to keep your car sliding sideways. The longer you maintain the drift, the more points you accumulate. Stringing drifts together – a technique known as "combos" – is where the real high scores are found.
Beyond the Initial Skid: Unlocking Potential
As you earn drift points, you'll accumulate in-game currency. This is where the customization and progression really shine. The garage in Drift Hunters is your workshop for turning a stock car into a drifting beast.
New Cars: From iconic Japanese sports cars to European powerhouses, a wide array of vehicles are available to unlock. Each car has different handling characteristics, making experimentation key to finding your perfect drift machine.
Performance Upgrades: Engine swaps for more horsepower, turbochargers for instant power delivery, improved suspension for better control, and lighter chassis for sharper handling – all contribute to a more satisfying drift experience.
Visual Customization: Paint jobs, wheel changes, and body kits allow you to personalize your ride, making it truly yours. After all, if you're going to slide in style, you might as well look good doing it.
The progression feels rewarding. You start with a humble beginning, mastering the basics, and gradually work your way up to powerful, fully tuned machines that allow for truly epic drifts.
Tips for Becoming a Drift Master
Even the most natural drift king started somewhere. Here are a few tips to help you hone your skills in Drift Hunters:
Start Slow, Learn the Fundamentals: Don't try to go flat out immediately. Focus on understanding how your car responds to inputs during a drift. Practice initiating drifts smoothly and maintaining them for short periods.
Experiment with Handbrake vs. Power Over: The handbrake is great for sharp, immediate drifts. Power over (using throttle and steering to break traction) is smoother and often better for maintaining long, flowing drifts. Learn when to use each.
Counter-Steering is Key: As your car begins to slide, you'll need to turn your steering wheel in the opposite direction of the slide to maintain control. Too little, and you'll spin out; too much, and you'll straighten up. It's a delicate balance.
Watch Your Speed: Entering a corner too fast can lead to an unrecoverable spin. Too slow, and you won't have enough momentum to initiate a proper drift. Find the "sweet spot" for each corner.
Utilize the Environment: Many tracks have obstacles or barriers that can be used to "wall tap" or guide your drift, adding to your score and flair. Be careful not to collide too hard!
Upgrade Strategically: Early upgrades should focus on improving power and handling. A little more horsepower can make initiating drifts easier, and better suspension helps maintain control.
Practice, Practice, Practice: Like any skill, drifting takes time and repetition. Don't get discouraged by spins; learn from them and adjust your technique.
The Unrivaled Fun of the Sideways Slide
Drift Hunters offers a fantastic and accessible entry point into the world of virtual drifting. Its intuitive controls, rewarding progression system, and satisfying gameplay make it a standout title for anyone looking for a dose of adrenaline and automotive artistry. Whether you're a seasoned drift enthusiast or simply curious about the appeal of the sideways slide, you can jump in and start honing your skills. So fire up your browser, head over to Drift Hunters, and prepare to embrace the exhilarating world of controlled chaos. The track awaits, and your journey to becoming a drift master begins now.