In case MMIO size is bigger than 4G and peer2peer DMA goes
through host bridge, we trigger a code path that assigns the
total linked IOVA (which is greater than 4G) to mapped_len.
Previously, `mapped_len` was declared as 32-bit `unsigned int`.
When accumulating `size_t` lengths, this leads to a silent wrap-around.
This truncation causes truncated lengths to be passed to functions
like `fill_sg_entry()`.
Fix this by changing `mapped_len` to `size_t` (64-bit). While
at it, fix similar potential overflow issues in `calc_sg_nents`
by using `check_add_overflow()` for `nents` and using
`unsigned int` for the loop iterator in `fill_sg_entry` to match.
Fixes: 3aa31a8bb11e ("dma-buf: provide phys_vec to scatter-gather mapping routine")
Cc: stable(a)vger.kernel.org
Cc: iommu(a)lists.linux.dev
Reviewed-by: Pranjal Shrivastava <praan(a)google.com>
Reviewed-by: Kevin Tian <kevin.tian(a)intel.com>
Signed-off-by: David Hu <xuehaohu(a)google.com>
---
Changes in v6:
- Used `check_add_overflow()` in `calc_sg_nents()` for safer
accumulation (Leon).
- Dropped explicit `!nents` check and added a comment noting that
`sg_alloc_table` handles `nents == 0` (Leon).
- Collected Reviewed-by from Kevin Tian.
Changes in v5:
- Removed WARN_ON_ONCE from calc_sg_nents() to avoid log noise (Jason).
- Added explicit check for `!nents` in dma_buf_phys_vec_to_sgt() to
cleanly return -EINVAL on overflow (Jason).
Changes in v4:
- Added WARN_ON_ONCE() to the nents overflow check to prevent silent
failures (Claude Bot).
Changes in v3:
- Removed leftover sentence fragment from the commit message.
- Kept `nents = 0` initialization (previously stated as removed in the
v2 changelog) as it is strictly required for the `+=` accumulation
loop in `calc_sg_nents()`.
Changes in v2:
- Fixed 'IVOA' -> 'IOVA' typo and expanded commit message (Claude Bot).
- Added Reverse Xmas tree formatting (Pranjal).
- Folded in extra bounds checking for calc_sg_nents() (Pranjal).
- Folded in type consistency fix for fill_sg_entry() (Pranjal).
- Collected Reviewed-by from Pranjal Shrivastava.
drivers/dma-buf/dma-buf-mapping.c | 15 +++++++++++----
1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/drivers/dma-buf/dma-buf-mapping.c b/drivers/dma-buf/dma-buf-mapping.c
index 794acff2546a..67a8ff52fb8f 100644
--- a/drivers/dma-buf/dma-buf-mapping.c
+++ b/drivers/dma-buf/dma-buf-mapping.c
@@ -5,12 +5,13 @@
*/
#include <linux/dma-buf-mapping.h>
#include <linux/dma-resv.h>
+#include <linux/overflow.h>
static struct scatterlist *fill_sg_entry(struct scatterlist *sgl, size_t length,
dma_addr_t addr)
{
unsigned int len, nents;
- int i;
+ unsigned int i;
nents = DIV_ROUND_UP(length, UINT_MAX);
for (i = 0; i < nents; i++) {
@@ -40,8 +41,11 @@ static unsigned int calc_sg_nents(struct dma_iova_state *state,
size_t i;
if (!state || !dma_use_iova(state)) {
- for (i = 0; i < nr_ranges; i++)
- nents += DIV_ROUND_UP(phys_vec[i].len, UINT_MAX);
+ for (i = 0; i < nr_ranges; i++) {
+ unsigned int added = DIV_ROUND_UP(phys_vec[i].len, UINT_MAX);
+ if (check_add_overflow(nents, added, &nents))
+ return 0;
+ }
} else {
/*
* In IOVA case, there is only one SG entry which spans
@@ -95,9 +99,10 @@ struct sg_table *dma_buf_phys_vec_to_sgt(struct dma_buf_attachment *attach,
size_t nr_ranges, size_t size,
enum dma_data_direction dir)
{
- unsigned int nents, mapped_len = 0;
struct dma_buf_dma *dma;
struct scatterlist *sgl;
+ size_t mapped_len = 0;
+ unsigned int nents;
dma_addr_t addr;
size_t i;
int ret;
@@ -133,6 +138,8 @@ struct sg_table *dma_buf_phys_vec_to_sgt(struct dma_buf_attachment *attach,
}
nents = calc_sg_nents(dma->state, phys_vec, nr_ranges, size);
+
+ /* sg_alloc_table will cleanly fail and return -EINVAL if nents == 0 */
ret = sg_alloc_table(&dma->sgt, nents, GFP_KERNEL | __GFP_ZERO);
if (ret)
goto err_free_state;
--
2.54.0.1064.gd145956f57-goog
In case MMIO size is bigger than 4G and peer2peer DMA goes
through host bridge, we trigger a code path that assigns the
total linked IOVA (which is greater than 4G) to mapped_len.
Previously, `mapped_len` was declared as 32-bit `unsigned int`.
When accumulating `size_t` lengths, this leads to a silent wrap-around.
This truncation causes truncated lengths to be passed to functions
like `fill_sg_entry()`.
Fix this by changing `mapped_len` to `size_t` (64-bit). While
at it, fix similar potential overflow issues in `calc_sg_nents`
by using `size_t` for `nents` and checking against `UINT_MAX`
and using `unsigned int` for the loop iterator in `fill_sg_entry`
to match.
Fixes: 3aa31a8bb11e ("dma-buf: provide phys_vec to scatter-gather mapping routine")
Cc: stable(a)vger.kernel.org
Cc: iommu(a)lists.linux.dev
Reviewed-by: Pranjal Shrivastava <praan(a)google.com>
Signed-off-by: David Hu <xuehaohu(a)google.com>
---
Changes in v5:
- Removed WARN_ON_ONCE from calc_sg_nents() to avoid log noise (Jason).
- Added explicit check for `!nents` in dma_buf_phys_vec_to_sgt() to
cleanly return -EINVAL on overflow (Jason).
Changes in v4:
- Added WARN_ON_ONCE() to the nents overflow check to prevent silent
failures (Claude Bot).
Changes in v3:
- Removed leftover sentence fragment from the commit message.
- Kept `nents = 0` initialization (previously stated as removed in the
v2 changelog) as it is strictly required for the `+=` accumulation
loop in `calc_sg_nents()`.
Changes in v2:
- Fixed 'IVOA' -> 'IOVA' typo and expanded commit message (Claude Bot).
- Added Reverse Xmas tree formatting (Pranjal).
- Folded in extra bounds checking for calc_sg_nents() (Pranjal).
- Folded in type consistency fix for fill_sg_entry() (Pranjal).
drivers/dma-buf/dma-buf-mapping.c | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/dma-buf/dma-buf-mapping.c b/drivers/dma-buf/dma-buf-mapping.c
index 794acff2546a..607b7998463d 100644
--- a/drivers/dma-buf/dma-buf-mapping.c
+++ b/drivers/dma-buf/dma-buf-mapping.c
@@ -10,7 +10,7 @@ static struct scatterlist *fill_sg_entry(struct scatterlist *sgl, size_t length,
dma_addr_t addr)
{
unsigned int len, nents;
- int i;
+ unsigned int i;
nents = DIV_ROUND_UP(length, UINT_MAX);
for (i = 0; i < nents; i++) {
@@ -36,7 +36,7 @@ static unsigned int calc_sg_nents(struct dma_iova_state *state,
struct phys_vec *phys_vec, size_t nr_ranges,
size_t size)
{
- unsigned int nents = 0;
+ size_t nents = 0;
size_t i;
if (!state || !dma_use_iova(state)) {
@@ -51,6 +51,9 @@ static unsigned int calc_sg_nents(struct dma_iova_state *state,
nents = DIV_ROUND_UP(size, UINT_MAX);
}
+ if (nents > UINT_MAX)
+ return 0;
+
return nents;
}
@@ -95,9 +98,10 @@ struct sg_table *dma_buf_phys_vec_to_sgt(struct dma_buf_attachment *attach,
size_t nr_ranges, size_t size,
enum dma_data_direction dir)
{
- unsigned int nents, mapped_len = 0;
struct dma_buf_dma *dma;
struct scatterlist *sgl;
+ size_t mapped_len = 0;
+ unsigned int nents;
dma_addr_t addr;
size_t i;
int ret;
@@ -133,6 +137,11 @@ struct sg_table *dma_buf_phys_vec_to_sgt(struct dma_buf_attachment *attach,
}
nents = calc_sg_nents(dma->state, phys_vec, nr_ranges, size);
+ if (!nents) {
+ ret = -EINVAL;
+ goto err_free_state;
+ }
+
ret = sg_alloc_table(&dma->sgt, nents, GFP_KERNEL | __GFP_ZERO);
if (ret)
goto err_free_state;
--
2.54.0.929.g9b7fa37559-goog
Most of this patch series has already been pushed upstream, this is just
the second half of the patch series that has not been pushed yet + some
additional changes which were required to implement changes requested by
the mailing list. This patch series is originally from Asahi, previously
posted by Daniel Almeida.
The previous version of the patch series can be found here:
https://patchwork.freedesktop.org/series/164580/
Branch with patches applied available here:
https://gitlab.freedesktop.org/lyudess/linux/-/commits/rust/gem-shmem
This patch series applies on top of drm-rust-next
Patch-series wide changes since V15:
* Fix some major rebasing errors I somehow didn't notice :(
* Drop the dependency on LazyInit, use the trick that Alice suggested
instead.
* Fix dependency ordering so that Tyr can get the vmap stuff first
without the other bits.
Patch-series wide changes since V16:
* Fix ordering one more time (SetOnce::reset() doesn't need to come
before adding vmap functions)
* Rebase against the latest DeviceContext changes from me that got
pushed.
Lyude Paul (4):
rust: drm: gem: shmem: Add DmaResvGuard helper
rust: drm: gem: shmem: Add vmap functions
rust: faux: Allow retrieving a bound Device
rust: drm: gem: Introduce shmem::Object::sg_table()
rust/kernel/drm/gem/shmem.rs | 524 ++++++++++++++++++++++++++++++++++-
rust/kernel/faux.rs | 16 +-
2 files changed, 524 insertions(+), 16 deletions(-)
base-commit: fea3a2dd7d3fc1936211ced5f84420e610435730
--
2.54.0
I think I have just been defaulting to always for anything that seems
like it should be unquestionably inlined - should I be defaulting to
#[inline] instead?
On Sun, 2026-06-07 at 13:22 +0100, Gary Guo wrote:
> > +impl<'a, T: DriverObject, C: DeviceContext> DmaResvGuard<'a, T, C>
> > {
> > +Â Â Â #[inline(always)]
>
> Why `always` here?
>
> Best,
> Gary
On 6/8/26 15:55, Bobby Eshleman wrote:
>
> On Sun, Jun 7, 2026 at 11:42 PM Christian König <christian.koenig(a)amd.com <mailto:christian.koenig@amd.com>> wrote:
>
> On 6/5/26 20:44, Bobby Eshleman wrote:
> > On Fri, Jun 05, 2026 at 11:30:07AM +0200, Christian König wrote:
> >> On 6/4/26 02:42, Bobby Eshleman wrote:
> >>> From: Bobby Eshleman <bobbyeshleman(a)meta.com <mailto:bobbyeshleman@meta.com>>
> >>>
> >>> get_sg_table() emitted one PAGE_SIZE sg entry per page even when the
> >>> underlying folio was larger.
> >>>
> >>> Instead, walk folios[] and emit one sg entry per folio. When folios
> >>> represent large pages (as is for MFD_HUGETLB), each sg entry is a large
> >>> page. Normal PAGE_SIZE sg tables are unchanged.
> >>>
> >>> Required by net/core/devmem to support rx-buf-size > PAGE_SIZE with
> >>> udmabuf.
> >>
> >> That doesn't explain why this is required.
> >
> > Sure, can definitely add. Devmem currently requires dmabuf sg entries to
> > be length and size aligned when it allocates niovs for NIC page pools.
> > Though udmabuf is not violating any dmabuf contract by emitting
> > PAGE_SIZE entries and the above restriction is probably more a
> > shortfalling of devmem, by emitting a single entry per folio this patch
> > allows udmabuf to be used by devmem for large pages.
> >
> >>
> >> Please note that accessing the pages/folio of an sg-table returned by DMA-buf is illegal and strictly forbidden!
> >>
> >> Regards,
> >> Christian.
> >
> > It seems both devmem and io_uring zcrx at least introspect through to
> > the sg-table to build NIC page pools (not accessing the memory itself,
> > however). Is there a better way?
>
> That's an absolute NO-GO! We need to stop that immediately.
>
> Touching the underlying struct page of an DMA-buf exported sg-table is strictly forbidden.
>
> We even have code to wrap the sg_table and hide the struct pages on debug builds to catch those issues, see function dma_buf_wrap_sg_table().
>
> My last status is that the NIC page pools are build directly from the DMA addresses exposed by the sg_table.
>
> Was there any change I'm not aware of?
>
> Regards,
> Christian.
>
>
> Oh no change, your mental model is still current.
> They just go through each sg and use sg_dma_address() on each.
Ah, thanks! That was a near heart attack :D
Yeah that is perfectly correct, question is do you then still really need this udmabuf change? I mean the DMA API usually merges together contiguous DMA addresses.
Regards,
Christian.
>
> Best,
> Bobby
>
>
> >
> > Best,
> > Bobby
> >
> >>
> >>> Signed-off-by: Bobby Eshleman <bobbyeshleman(a)meta.com <mailto:bobbyeshleman@meta.com>>
> >>> ---
> >>>Â drivers/dma-buf/udmabuf.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
> >>>Â 1 file changed, 42 insertions(+), 5 deletions(-)
> >>>
> >>> diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
> >>> index 94b8ecb892bb..f28dd3788ada 100644
> >>> --- a/drivers/dma-buf/udmabuf.c
> >>> +++ b/drivers/dma-buf/udmabuf.c
> >>> @@ -141,26 +141,63 @@ static void vunmap_udmabuf(struct dma_buf *buf, struct iosys_map *map)
> >>>Â Â Â Â Â vm_unmap_ram(map->vaddr, ubuf->pagecount);
> >>>Â }
> >>>
> >>> +/* Return the number of contiguous pages backed by the folio at @i.
> >>> + * A udmabuf may map only part of a folio, or reference the same folio
> >>> + * in multiple non-contiguous runs, so folio_nr_pages() can't be used.
> >>> + */
> >>> +static pgoff_t udmabuf_folio_nr_pages(struct udmabuf *ubuf, pgoff_t i)
> >>> +{
> >>> +Â Â Â Â struct folio *f = ubuf->folios[i];
> >>> +Â Â Â Â pgoff_t j;
> >>> +
> >>> +Â Â Â Â for (j = 1; i + j < ubuf->pagecount; j++) {
> >>> +Â Â Â Â Â Â Â Â if (ubuf->folios[i + j] != f)
> >>> +Â Â Â Â Â Â Â Â Â Â Â Â break;
> >>> +Â Â Â Â Â Â Â Â /* Same folio, but not a sequential offset within it. */
> >>> +Â Â Â Â Â Â Â Â if (ubuf->offsets[i + j] != ubuf->offsets[i] + j * PAGE_SIZE)
> >>> +Â Â Â Â Â Â Â Â Â Â Â Â break;
> >>> +Â Â Â Â }
> >>> +Â Â Â Â return j;
> >>> +}
> >>> +
> >>> +/* Count the contiguous folio runs in @ubuf, one sg entry per run. */
> >>> +static unsigned int udmabuf_sg_nents(struct udmabuf *ubuf)
> >>> +{
> >>> +Â Â Â Â unsigned int nents = 0;
> >>> +Â Â Â Â pgoff_t i;
> >>> +
> >>> +Â Â Â Â for (i = 0; i < ubuf->pagecount; i += udmabuf_folio_nr_pages(ubuf, i))
> >>> +Â Â Â Â Â Â Â Â nents++;
> >>> +Â Â Â Â return nents;
> >>> +}
> >>> +
> >>>Â static struct sg_table *get_sg_table(struct device *dev, struct dma_buf *buf,
> >>>Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â enum dma_data_direction direction)
> >>>Â {
> >>>Â Â Â Â Â struct udmabuf *ubuf = buf->priv;
> >>> -Â Â Â Â struct sg_table *sg;
> >>>Â Â Â Â Â struct scatterlist *sgl;
> >>> -Â Â Â Â unsigned int i = 0;
> >>> +Â Â Â Â struct sg_table *sg;
> >>> +Â Â Â Â pgoff_t i, run;
> >>> +Â Â Â Â unsigned int nents;
> >>>Â Â Â Â Â int ret;
> >>>
> >>> +Â Â Â Â nents = udmabuf_sg_nents(ubuf);
> >>> +
> >>>Â Â Â Â Â sg = kzalloc_obj(*sg);
> >>>Â Â Â Â Â if (!sg)
> >>>Â Â Â Â Â Â Â Â Â return ERR_PTR(-ENOMEM);
> >>>
> >>> -Â Â Â Â ret = sg_alloc_table(sg, ubuf->pagecount, GFP_KERNEL);
> >>> +Â Â Â Â ret = sg_alloc_table(sg, nents, GFP_KERNEL);
> >>>Â Â Â Â Â if (ret < 0)
> >>>Â Â Â Â Â Â Â Â Â goto err_alloc;
> >>>
> >>> -Â Â Â Â for_each_sg(sg->sgl, sgl, ubuf->pagecount, i)
> >>> -Â Â Â Â Â Â Â Â sg_set_folio(sgl, ubuf->folios[i], PAGE_SIZE,
> >>> +Â Â Â Â sgl = sg->sgl;
> >>> +Â Â Â Â for (i = 0; i < ubuf->pagecount; i += run) {
> >>> +Â Â Â Â Â Â Â Â run = udmabuf_folio_nr_pages(ubuf, i);
> >>> +Â Â Â Â Â Â Â Â sg_set_folio(sgl, ubuf->folios[i], run << PAGE_SHIFT,
> >>>Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ubuf->offsets[i]);
> >>> +Â Â Â Â Â Â Â Â sgl = sg_next(sgl);
> >>> +Â Â Â Â }
> >>>
> >>>Â Â Â Â Â ret = dma_map_sgtable(dev, sg, direction, 0);
> >>>Â Â Â Â Â if (ret < 0)
> >>>
> >>> --
> >>> 2.53.0-Meta
> >>>
> >>
>
(certifitasap(a)gmail.com) No Exam: When you buy a genuine NEBOSH Certification, there will be no need to take the exams. Convenience: Many people have tight schedules and do not have enough time to go through the exams or testing process. Buying the NEBOSH Certification will be very convenient for them. Apply for the NEBOSH certificate in Malaysia https://streamable.com/2yj6u6
To check NEBOSH results online in Kuwait or the UAE. Where can I buy the NEBOSH Diploma online? How to see my registered NEBOSH certificates? Get the NEBOSH health and safety certificate in the USA. France. Luxembourg. Switzerland. Colombia. India. Turkey. Kuwait. Qatar. Hong Kong. Bahrain. Malaysia. Russian. Japan. Ireland. Saudi Arabia. Egypt . China. Taiwan. Israel. Indonesia Lebanon. Jordan. Serbia. Iran. Thailand. United Arab Emirates. Iraq. Oman Buy original NEBOSH diplomas without exam in Saudi Arabia
We are a group of Teachers and Examiners specialized in the Acquisition of NEBOSH CERTIFICATES & all Certificates without taking the exams. https://streamable.com/2n368u
1- We provide an Official certificate with registration in the database and actual center stamps for customers interested in obtaining the certificate without taking the test.
2. We provide you with a new certificate with the updated results for you to follow your PR procedures without any risk.
3- We can provide Question papers for future tests before the actual test date. The questionnaires will be issued about 6 to 10 days before the test data and will be 100% the same questions that will appear in the test. Guaranteed at 100%. https://vimeo.com/1189663914?share=copy&fl=sv&fe=ci
4- We are teachers and examination officials working together as a team, so you can choose any of our professionals to go in for the exams on your behave.
5- You can register for your exams and go in for but we shall provide your target scores as you request because we have underground partners working at any center test, which gives us access to the system.
6- We equally assist our clients by sending recommendation letters to well-known educational institutions or enterprises offering employment abroad in Canada, the UK, the USA, Australia, New Zealand, and others to give you a kick start for your future.
NEBOSH Diplomas in countries like: USA, Australia, Belgium, Brazil, Canada, Italy, Finland, France, Germany, Israel, Mexico, Netherlands,
, Spain, United Kingdom.
https://t.me/+A1TvrjQBdZc2MWRhhttps://t.me/+UfhkuxkiJsw5NWExhttps://t.me/neboshigcdiplomahttps://neboshigc03.wixsite.com/website/serviceshttps://neboshigc03.wixsite.com/website/abouthttps://neboshigc03.wixs....com/website/book-onlinehttps://neboshigc03.wixsite.com/website/contacthttps://neboshigc03.wixsite.com/website/products
Contact us via Teams ID--Â (Jacob JB)
We provide verified NEBOSH certificates with online possibilities. You are guaranteed 100% with us, as the certificate you obtain is 100% legal and accepted anywhere without any doubt. Customers interested in obtaining the certificate should contact us through the contact details listed below. Payment and prices shall be discussed upon your response to this ad. Contact Customer Care for a fast chat via
Email....certifitasap(a)gmail.com
WhatsApp...+1 (450)912-2147
Contact us via Teams ID--Â (Jacob JB)
Email (neboshigc03(a)yahoo.com)
NEBOSH IGC Certificate
NEBOSH Oil and Gas Safety
NEBOSH Fire Certificate
NEBOSH Diploma
Contact Customer Care for a fast chat via
Email....certifitasap(a)gmail.com
WhatsApp.....+1 (450) 912-2147
https://streamable.com/xhi9hi
British NEBOSH certificate
Obtain Real NEBOSH Diploma
Acquire NEBOSH Diploma online
Diploma without Exam in Tuvalu
Buy NEBOSH Diploma without exam
Obtain NEBOSH certificate in Dubai
Acquire NEBOSH certificate in India
Buy NEBOSH Fire Certificate in Nepal
Obtain NEBOSH certificate in the UAE
NEBOSH Fire Certificate without Exam
BCSP Certification Online in Austria
Obtain NEBOSH Exam in the Netherlands
Get NEBOSH Diploma online without Exam
Apply for NEBOSH Diploma UK without Exam
Apply for the British NEBOSH Certificate
Buy a NEBOSH certificate without an exam
Buy British NEBOSH IGC certificates in UK
Apply for the NEBOSH IGC certificate in UK
NEBOSH Diploma Online in the Netherlands
Acquire the NEBOSH certificate in Punjab
Buy NEBOSH in New York/Islamabad/Seoul,
Buy/get/order NEBOSH WITHOUT exams/test,
Order NEBOSH in Tashkent/ Hanoi/Hong Kong,
NEBOSH certificate without exam in Kerala
Order original NEBOSH Diploma without Exam
Buy CSP Certificate Without Exam in Germany
Buy SMS Certificate Without Exam in Sweden
Buy a CHST Certificate Without Exam in Iran
NEBOSH certificate without Exam in the UAE
Buy a NEBOSH certificate UK without an Exam
Buy a British NEBOSH Fire certificate online
Acquire NEBOSH certificates without an Exam
Order NEBOSH Certificate Online Without Exam
Want to Improve your NEBOSH IGC or Diplomas?
Apply for the NEBOSH certificate in Malaysia.
British NEBOSH Fire certificate without Exam
Buy NEBOSH IGC Certificate Online in Austria
NEBOSH certificate without exam in Hyderabad
Buy NEBOSH Certificate Without Exam in Belgium
Apply for the NEEBOSH certificate in Australia
Buy a NEBOSH certificate in Karachi, Australia
Buy NEBOSH certificate in Australia/Pakistan,
Buy Original NEBOSH without exams in Karachi
Obtain NEBOSH WITHOUT tests/exams in the UK,
Buy a CET Certificate Without Exam in Belgium
Buy NEBOSH Certificate Without Exam in Bulgaria
Buy ASP Certificate Without Exam in Luxembourg
Order NEBOSH certificate without Exam in Aruba
Acquire a Diploma without an Exam in Australia
Purchase NEBOSH Fire Certificate without Exam
Buy NEBOSH certificate without Exam in Algeria
Buy NEBOSH Diploma without exam in Martinique
Buy NEBOSH Diploma without Exam in Kyrgyzstan
NEBOSH IGC Certificate Without Exam in Denmark
Get NEBOSH HSW Certificate Without Exam in Greece
Buy Original NEBOSH Certificate Online in the UK
Obtain NEBOSH certificate without exam in Punjab
Order NEBOSH Certificate Without Exam in Bulgaria
Purchase the NBOSH certificate without the Exam
Apply for NEBOSH IGC Certificate UK without Exam
Apply for NEBOSH Diploma without Exam in Mongolia
NEBOSH certificate without Exam in New Caledonia
NEBOSH IGC Certificate Without Exam in Seychelles
Buy STSC Certificate Without Exam in Switzerland
Buy NEBOSH HSW Certificate Without Exam in Croatia
Buy STS Certificate Without Exam in the Netherlands
Buy NEBOSH HSW Certificate Without Exam in Greece
Buy NEBOSH HSW Certificate Without Exam in Norway
Buy NEBOSH IDIP Certificate Without Exam in Turkey
Buy NEBOSH IGC Certificate Without Exam in Poland
Purchase a registered NEBOSH London/Sydney/Dubai
NEBOSH Certificate Without Exam in Saudi Arabia
Buy/get NEBOSH in Qatar without taking the test,
Obtain a Registered NEBOSH certificate in Qatar,
Buy/obtain/get NEBOSH certificate in Dubai/UAE,
Get/purchase/Buy NEBOSH certificate in Qatar/ India,
Original NEBOSH Certificate Without Exam in Jordan
Buy NEBOSH IGC 1 Certificate Without Exam in Ukraine
Buy NEBOSH IGC 2 Certificate Without Exam in Portugal
Obtain NEBOSH Oil and Gas Safety without Exam in London
Acquire NEBOSH Diploma without Exam in Western Sahara
Purchase NEBOSH Diploma without Exam in Cote d'Ivoire
Purchase NEBOSH IGC Certificate without Exam in Uganda
Obtain original NEBOSH Fire Certificate without Exam
Obtain NEBOSH IGC Certificate Without Exam in Poland
Buy NEBOSH IGC 1 Certificate Without Exam in Ukraine
Acquire NEBOSH Certificate Without Exam in Germany
Acquire NEBOSH certificate without exam in Bangalore
Buy a NEBOSH Certificate without an exam in Chennai
Get NEBOSH Diploma Certificate Without Exam in Sweden
Obtain NEBOSH Certificate Without Exam in Switzerland
Acquire NEBOSH HSW Certificate Without Exam in Croatia
Apply for NEBOSH HSW Certificate Without Exam in Norway
Acquire NEBOSH IDIP Certificate Without Exam in Turkey
Buy a NEBOSH certificate without an Exam in Bouvet Island
Apply for British NEBOSH Oil and Gas Safety certificates
Apply for the NEBOSH certificate without an exam in Delhi
Acquire NEBOSH Certificate Without Exam in the Netherlands
Apply for NEBOSH IGC Certificate Without Exam in Luxembourg
Buy NEBOSH health and safety Certificate Without Exam in Iran
Buy/purchase/ Acquire an original NEBOSH certificate in Karachi
Order/obtain/buy NEBOSH certificate in Malaysia/Germany,
Get/obtain NEBOSH certificate in Pakistan, New Zealand,
Buy/Obtain/Get NEBOSH certificate in the United Kingdom (UK),
Order Original NEBOSH Diploma Without Exam Online in Egypt
Order Original NEBOSH course Certificate Without Exam in Jordan,
Apply for Original NEBOSH Diplomas Without Exam in Saudi Arabia
Apply for NEBOSH Oil and Gas Safety without Exam in Guyana
Buy NEBOSH HSW Certificate Without Exam in the Czech Republic
How to get the original NEBOSH Fire Certificate without Exam
Get NEBOSH verification. Obtain a real NEBOSH Certificate online
Acquire a NEBOSH certificate without an Exam in the United States
Order original NEBOSH Oil and Gas Safety certificate without the Exam
Purchase real NEBOSH Oil and Gas Safety certificates without an Exam
Apply for NEBOSH Fire Certificate without Exam in Brunei Darussalam
Apply for NEBOSH IGC Certificate without Exam in Antigua and Barbuda
Purchase Original NEBOSH Diploma Online Without Exam in Jordan,
Acquire Original NEBOSH Oil and Gas Safety Without Exam Online in Bahrain,
Apply for Original NEBOSH Fire Certificate Without Exam Online in Algeria,
Order Original NEBOSH Fire Certificate Online Without Exam in Saudi Arabia
Obtain Original NEBOSH Diploma Without Exam Online in the Middle East,
Obtain Original NEBOSH IGC Certificates Online Without Exam in Kuwait,
Apply for Original NEBOSH Oil and Gas Safety Online Without Exam in Qatar,
Obtain Original NEBOSH Fire Certificate Online Without Exam in Jordan,
Apply for the NEBOSH certificate without an Exam in the Falkland Islands
Apply for NEBOSH oil and gas Certificate Without Exam in Iran, Netherlands
Buy/Get/Order Verified NEBOSH Certificates Online in South Korea, Gwangju
Apply for Original NEBOSH Certificates Online in the United Arab Emirates, UAE, Dubai,
Purchase the NEBOSH Oil and Gas Safety certificate without an Exam online in Antigua
Obtain NEBOSH Oil and Gas Safety without an exam in the French Southern Territories
Buy/Get/Order Verified NEBOSH Diplomas Certificates Online in South Korea, Seoul
Apply for Original NEBOSH Certificate Without Exam in the United Arab Emirates, UAE, Dubai NEBOSH Diploma in the UAE, Qatar, Kuwait, Oman, Bahrain, Malaysia Singapore Jordan Saudi Arabia USA Ireland UK France Italy Belgium, Ukraine, Iceland, Brazil, Spain, Germany Egypt, Turkey, Morocco, Algeria, Greece)
Contact Customer Care for a fast chat via
Contact us via Teams ID--Â (Jacob JB)
Email....certifitasap(a)gmail.com
WhatsApp.....+1 (450) 912-2147
Don't hesitate, feel free to contact us so as to get your certificates done perfectly and on time. available service 24Hs/7Ds
Have you ever wondered what your life would look like if you made entirely different choices? Life simulation games have always been a fascinating genre for gamers, but few capture the unpredictable, hilarious, and sometimes chaotic nature of existence quite like Bitlife. Instead of relying on heavy 3D graphics, it is a text-based simulator that focuses entirely on the ripple effects of your decisions. It’s perfect for casual gaming sessions, so let's dive into how to play and get the most out of this quirky experience.
https://bitlifefree.io/
Gameplay: Growing Up, One Year at a Time
The premise of the game is incredibly simple but highly addictive. You are born with a random set of basic stats—Happiness, Health, Smarts, and Looks—in a random country to random parents. From there, you control your character's life year by year simply by tapping the "Age" button.
In your early years, your choices are understandably limited to things like interacting with your parents, going to the doctor, or playing with pets. But as you grow into a teenager and an adult, the world completely opens up. You can choose to study hard, drop out, date, travel the world, buy real estate, or even turn to a life of crime.
Every year, the game throws random scenarios at you: a classmate might insult you, you might be offered a questionable substance at a party, or you might find a wallet on the street. How you react directly impacts your stats and future opportunities. You might even have to pass mini-games, like navigating a maze for your driving test or escaping from prison. The ultimate goal is simply to live your life until your character passes away, leaving behind a unique legacy and a tombstone summarizing your deeds.
Tips for a Great Experience
If you are just starting out, here are a few tips to make your virtual life more successful—or at least more entertaining:
Keep an eye on your core stats: Your Health and Happiness are crucial. If they drop too low, your character might face early health issues. Go to the gym, meditate, go to the movies, or spend time with family to keep these bars in the green.
Education pays off (usually): If you want a high-paying, stable career like a doctor, judge, or CEO, use the "Study harder" option every year during school. Read books at the library to passively boost your Smarts stat.
Hunt for Ribbons: At the end of every life, you are awarded a ribbon based on how you lived (e.g., "Hero," "Scandalous," "Lazy," or "Rich"). Trying to collect all the different ribbons is a great way to give yourself specific goals.
Don't be afraid of the absurd: The real charm of the game is in its wild unpredictability. Sometimes, making terrible choices, trying to become a famous actor, or buying a crazy exotic pet leads to the most memorable playthroughs. Don't always play it safe!
Conclusion
Ultimately, the beauty of this simulator lies in its endless replayability. Every time you hit the button to start a new life, it is a completely blank slate. You can be a saint in one lifetime and an absolute menace to society in the next. Whether you have five minutes to kill on a bus commute or an hour to craft a sprawling, multi-generational family dynasty, diving into Bitlife offers a fun, lighthearted escape into a world where you pull all the strings. Give it a try, and see exactly where your choices take you!
On 6/5/26 20:44, Bobby Eshleman wrote:
> On Fri, Jun 05, 2026 at 11:30:07AM +0200, Christian König wrote:
>> On 6/4/26 02:42, Bobby Eshleman wrote:
>>> From: Bobby Eshleman <bobbyeshleman(a)meta.com>
>>>
>>> get_sg_table() emitted one PAGE_SIZE sg entry per page even when the
>>> underlying folio was larger.
>>>
>>> Instead, walk folios[] and emit one sg entry per folio. When folios
>>> represent large pages (as is for MFD_HUGETLB), each sg entry is a large
>>> page. Normal PAGE_SIZE sg tables are unchanged.
>>>
>>> Required by net/core/devmem to support rx-buf-size > PAGE_SIZE with
>>> udmabuf.
>>
>> That doesn't explain why this is required.
>
> Sure, can definitely add. Devmem currently requires dmabuf sg entries to
> be length and size aligned when it allocates niovs for NIC page pools.
> Though udmabuf is not violating any dmabuf contract by emitting
> PAGE_SIZE entries and the above restriction is probably more a
> shortfalling of devmem, by emitting a single entry per folio this patch
> allows udmabuf to be used by devmem for large pages.
>
>>
>> Please note that accessing the pages/folio of an sg-table returned by DMA-buf is illegal and strictly forbidden!
>>
>> Regards,
>> Christian.
>
> It seems both devmem and io_uring zcrx at least introspect through to
> the sg-table to build NIC page pools (not accessing the memory itself,
> however). Is there a better way?
That's an absolute NO-GO! We need to stop that immediately.
Touching the underlying struct page of an DMA-buf exported sg-table is strictly forbidden.
We even have code to wrap the sg_table and hide the struct pages on debug builds to catch those issues, see function dma_buf_wrap_sg_table().
My last status is that the NIC page pools are build directly from the DMA addresses exposed by the sg_table.
Was there any change I'm not aware of?
Regards,
Christian.
>
> Best,
> Bobby
>
>>
>>> Signed-off-by: Bobby Eshleman <bobbyeshleman(a)meta.com>
>>> ---
>>> drivers/dma-buf/udmabuf.c | 47 ++++++++++++++++++++++++++++++++++++++++++-----
>>> 1 file changed, 42 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/dma-buf/udmabuf.c b/drivers/dma-buf/udmabuf.c
>>> index 94b8ecb892bb..f28dd3788ada 100644
>>> --- a/drivers/dma-buf/udmabuf.c
>>> +++ b/drivers/dma-buf/udmabuf.c
>>> @@ -141,26 +141,63 @@ static void vunmap_udmabuf(struct dma_buf *buf, struct iosys_map *map)
>>> vm_unmap_ram(map->vaddr, ubuf->pagecount);
>>> }
>>>
>>> +/* Return the number of contiguous pages backed by the folio at @i.
>>> + * A udmabuf may map only part of a folio, or reference the same folio
>>> + * in multiple non-contiguous runs, so folio_nr_pages() can't be used.
>>> + */
>>> +static pgoff_t udmabuf_folio_nr_pages(struct udmabuf *ubuf, pgoff_t i)
>>> +{
>>> + struct folio *f = ubuf->folios[i];
>>> + pgoff_t j;
>>> +
>>> + for (j = 1; i + j < ubuf->pagecount; j++) {
>>> + if (ubuf->folios[i + j] != f)
>>> + break;
>>> + /* Same folio, but not a sequential offset within it. */
>>> + if (ubuf->offsets[i + j] != ubuf->offsets[i] + j * PAGE_SIZE)
>>> + break;
>>> + }
>>> + return j;
>>> +}
>>> +
>>> +/* Count the contiguous folio runs in @ubuf, one sg entry per run. */
>>> +static unsigned int udmabuf_sg_nents(struct udmabuf *ubuf)
>>> +{
>>> + unsigned int nents = 0;
>>> + pgoff_t i;
>>> +
>>> + for (i = 0; i < ubuf->pagecount; i += udmabuf_folio_nr_pages(ubuf, i))
>>> + nents++;
>>> + return nents;
>>> +}
>>> +
>>> static struct sg_table *get_sg_table(struct device *dev, struct dma_buf *buf,
>>> enum dma_data_direction direction)
>>> {
>>> struct udmabuf *ubuf = buf->priv;
>>> - struct sg_table *sg;
>>> struct scatterlist *sgl;
>>> - unsigned int i = 0;
>>> + struct sg_table *sg;
>>> + pgoff_t i, run;
>>> + unsigned int nents;
>>> int ret;
>>>
>>> + nents = udmabuf_sg_nents(ubuf);
>>> +
>>> sg = kzalloc_obj(*sg);
>>> if (!sg)
>>> return ERR_PTR(-ENOMEM);
>>>
>>> - ret = sg_alloc_table(sg, ubuf->pagecount, GFP_KERNEL);
>>> + ret = sg_alloc_table(sg, nents, GFP_KERNEL);
>>> if (ret < 0)
>>> goto err_alloc;
>>>
>>> - for_each_sg(sg->sgl, sgl, ubuf->pagecount, i)
>>> - sg_set_folio(sgl, ubuf->folios[i], PAGE_SIZE,
>>> + sgl = sg->sgl;
>>> + for (i = 0; i < ubuf->pagecount; i += run) {
>>> + run = udmabuf_folio_nr_pages(ubuf, i);
>>> + sg_set_folio(sgl, ubuf->folios[i], run << PAGE_SHIFT,
>>> ubuf->offsets[i]);
>>> + sgl = sg_next(sgl);
>>> + }
>>>
>>> ret = dma_map_sgtable(dev, sg, direction, 0);
>>> if (ret < 0)
>>>
>>> --
>>> 2.53.0-Meta
>>>
>>
On Sun, Jun 7, 2026 at 2:17 PM Gary Guo <gary(a)garyguo.net> wrote:
>
> IMO we really shouldn't use Clippy to generate code. We spent too much effort in
> fixing codegen issues that are only present when driven by clippy.
>
> We should just run a check phase with clippy to get the lints only, and then use
> rustc to generate actual code.
Yeah, given the trouble it is giving, I think that will probably be a
better approach medium term. I don't love it, because the original
idea was to avoid such an extra phase, but it is definitely better vs.
random source code changes...
We could also increase the symbol size-related variables
(`KSYM_NAME_LEN`, `SZ` in `modpost`...) only for Clippy builds to a
ludicrous value. The extra phase approach would avoid surprises more
generally though, so I like it in that sense, and has the implicit
advantage of avoiding someone using a Clippy kernel in production by
mistake.
Ok, I can take a look at that. For now, I will pick the other patch.
Cheers,
Miguel
On Sun, Jun 7, 2026 at 4:08 AM Alexandre Courbot <acourbot(a)nvidia.com> wrote:
>
> This is fixed by [1]. Maybe we should merge that one patch separately
> and before the rest? I seem to be seeing these long symbol problems more
> often recently.
>
> [1] https://lore.kernel.org/all/20260605-nova-exports-v4-1-e948c287407c@nvidia.…
I can take that one via `rust-next` unless someone shouts -- Ack's appreciated.
Cheers,
Miguel